文章目录

系列目录与传送门

1、RAM IP的定制

①、第一页

②、第二页

③、第三页

④、第四页

⑤、第五页

2、RAM IP的例化与仿真测试

2.1、例化一个RAM IP核

2.2、仿真测试 

3、总结与参考


系列目录与传送门

       《从底层结构开始学习FPGA》目录与传送门

        在定制一个RAM IP核之前,强烈建议您先阅读:从底层结构开始学习FPGA—-RAM IP核及关键参数介绍。在这篇文章中,已经对RAM IP核的各个关键因素做了详细的讲解。


1、RAM IP的定制

  1. 在新建一个工程后, 点击IP Catalog
  2. 点击后会出现 IP Catalog 页面,在 IP 核的搜索框中搜索 block
  3. 根据筛选,双击选择RAM & ROM 核“Block Memory Generator”


①、第一页


②、第二页


③、第三页


④、第四页


⑤、第五页


2、RAM IP的例化与仿真测试

2.1、例化一个RAM IP核

        按上述步骤生成IP后,复制 IP核 自带的例化模板。

        

        然后在我们的RTL代码中,例化生成一个4*16的SDP RAM。

        该RTL不做其他功能,只例化RAM即可。 

module test(input clk,//输入时钟input [3:0]data_in,//输入数据inputen_wr,//写使能信号inputen_rd,//读使能信号input[3:0]addr_wr,//写地址input[2:0]addr_rd,//读地址inputwe_wr,//写使能output[7:0]data_out//输出数据);//例化RAM IP核ram_w4_d16ram_w4_d16_inst (//端口A--写端口.clka(clk), .ena(en_wr),.wea(we_wr),.addra(addr_wr),.dina(data_in), //端口B--读端口.clkb(clk), .enb(en_rd),.addrb(addr_rd),.doutb(data_out));endmodule

2.2、仿真测试 

        写个testbench,对RAM IP测试一下。

        测试行为:先往地址0-15写入数据0-15,然后从地址0-7读出数据(因为读数据位宽是写数据位宽的2倍,所以读数据一次会读出2个写地址的数据)。

`timescale 1ns / 1nsmodule tb_test();reg clk;reg [3:0]data_in;regen_wr;regen_rd;reg[3:0]addr_wr;reg[2:0]addr_rd;regwe_wr;wire[7:0]data_out;initial beginclk = 0;en_wr = 0;en_rd = 0;we_wr = 0;data_in = 4'd0;addr_wr = 4'd0;addr_rd = 3'd0;#110en_wr = 1;we_wr = 1;//开始写入数据repeat(15) begin//向地址0-15写入数据0-15#10data_in = data_in + 1;addr_wr = addr_wr + 1;end#10en_wr = 0;//停止写入数据en_rd = 1;we_wr = 0;//开始读出数据repeat(10) begin//从地址0-7读数据#10addr_rd = addr_rd + 1;enden_rd = 0;//停止读出数据#20 $finish;//结束仿真endalways #5 clk = ~clk;//生成时钟,周期10ns//例化被测模块testtesttest_inst(.clk(clk),.data_in(data_in),.en_wr(en_wr),.en_rd(en_rd),.addr_wr(addr_wr),.addr_rd(addr_rd),.we_wr(we_wr),.data_out(data_out));endmodule

        使用vivado自带的仿真工具simulator运行仿真,仿真结果如下:

        符合预期结果。


3、总结与参考

  • 可以看到RAM IP的定制还是挺简单的,在了解其参数后,可以很快、很方便地例化一个自己需要的RAM模块。
  • 创作不易,如果本文对您有帮助,还请多多点赞、评论和收藏。您的支持是我持续更新的最大动力!

参考资料1:Block Memory Generator v8.4