FPGA开发——IP核的RAM调用(单端口)

打印 上一主题 下一主题

主题 213|帖子 213|积分 639

一、简介

RAM(Random Access Memory),即随机存取存储器。可以随时吧数据写入任一订定的地址的 存储单元,可以随时从任一指定地址独处数据。时钟频率决定读写速率。 RAM 重要用来存放程序以及程序执行过程中产生的中间数据和运算效果。
1、RAM分类

           Altera FPGA 的 RAM IP 核分为两种类型:单端口 RAM 和双端口 RAM。
          单端口 RAM:只有一组地址线控制着写数据端口和读数据端口。
          双端口 RAM:具有两组地址线分别控制着写数据端口和读数据端口。
  今天这篇文章我们来讲一下单端口RAM的相关使用。
2、 单端口的端口 


二、单端口RAM的调用

1、单端口RAM选择

        如图所示,在 IP Catalog 的搜刮栏中搜刮 RAM,然后选择 RAM:1-PORT。(这里和前面调用的pll一样也是需要先辈行工程创建,不清楚的小伙伴可以在前面的文章看看)

2、RAM存放位置的选择,这里和pll操作完全同等。


3、参数设置 

如下图所示,该界面设置的参数有:
方框①:IP 核的输出数据位宽 方框
②:IP 核的存储容量 方框
③:储存单元类型,默认即可 方框
④:选择时钟模式,单时钟或双时钟。单时钟用一个时钟信号控制存储,这里选择单时 钟。然后点击 Next 进入下一界面。

4、输出端口寄存和时钟使能信号的选择 

如图所示: 方框①:选择输出端口 q 是否寄存。
方框②:时钟使能信号,通常默认不勾选即可。
方框③:选择是否创建已补复位信号“aclr”和读使能信号“rden”。 点击“Next”进入下一界面。

 5、同读同写时读数据的选择

        如下图所示,该页面是设置某个地址写入数据同时读取数据的情况,是不关心,还是读出新 数据,或是读出旧数据。通常保持默认“New data”即可。

6、RAM存储器初始化参数设置

如图所示,本页面重要是设置 RAM 存储器初始化参数。:
方框①:是否设置初始化文件,根据需要选择,这里默认不初始即可。
方框②:选择是否允许系统存储器内容编辑器收罗和更新内容在与系统时钟无关的情况下, 默认不勾选即可。 

7、仿真库文件的选择

如下图所示,表现的是仿真库文件 altera_mf。无需其它操作,点击“Next”进入下一界面。

 
8、天生文件的选择

如下图所示,该页面为需要设置天生的文件。勾选 ram_1port_inst.v 即可。ram_1port_bb.v 可勾可不勾选。然后点击 finish。

 9、将文件添加到工程中

如下图所示,设置完成,点击“Yes”即可。

 三、RAM的相关调用和仿真

1、设计文件的编写

在rtl文件夹中新建ip_ram.v文件,其中ram实例化代码可以从 ram_1port_inst.v 例化模板文件复制。如图:
  1. module ip_ram(
  2.     input                                clk                ,
  3.     input                                rst_n        ,
  4.     input                                rden    ,
  5.     input               wden        ,
  6.     input                [8:0]   address        ,
  7.     input                [7:0]        din         ,
  8.     output                [7:0]        dout       
  9. );                                                                 
  10.    
  11.    
  12. ram_1        ram_1_inst (
  13.         .aclr ( ~rst_n ),
  14.         .address ( address ),
  15.         .clock ( clk ),
  16.         .data ( din ),
  17.         .rden ( rden ),
  18.         .wren ( wden ),
  19.         .q ( dout )
  20.         );
  21.    
  22. endmodule
复制代码
2、测试文件的编写

在tb文件夹中新建tb_ram。v文件。如图:
  1. `timescale 1ns/1ns
  2.    
  3. module tb_ram();
  4. //激励信号定义
  5.     reg                                clk                    ;
  6.     reg                                rst_n            ;
  7.     reg                                rden               ;
  8.     reg                                wden                  ;
  9.     reg                [8:0]                address            ;
  10.     reg                [7:0]                din                   ;
  11. //输出信号定义         
  12.   wire        [7:0]                dout    ;
  13. //时钟周期参数定义       
  14.     parameter                CLOCK_CYCLE = 20;   
  15. //模块例化
  16.     ip_ram   ip_ram_inst(
  17.     /*input                                */.clk                (clk        ),
  18.     /*input                                */.rst_n        (rst_n),
  19.     /*input                                */.rden     (rden   ),
  20.     /*input             */.wden            (wden          ),
  21.     /*input                [8:0]   */.address        (address),
  22.     /*input                [7:0]        */.din             (din           ),
  23.     /*output        [7:0]        */.dout            (dout          )
  24. );                       
  25. //产生时钟
  26.     initial                 clk = 1'b0;
  27.     always #(CLOCK_CYCLE/2) clk = ~clk;
  28. //产生激励
  29.     integer i;
  30.     initial  begin
  31.      
  32.         rst_n = 1'b0;
  33.         wden = 1'b0;
  34.         rden = 1'b0;
  35.         din = 9'h00;
  36.         #(CLOCK_CYCLE*20);
  37.         rst_n = 1'b1;
  38.         #10;
  39.         //写入600个数据
  40.         for (i = 0;i<600;i=i+1) begin
  41.             wden = 1'b1;
  42.             address = i;
  43.             din = 8'($random);
  44.             @(posedge clk);
  45.             wden=1'b0;
  46.             rden = 1'b1;
  47.             address = i;
  48.             @(posedge clk);
  49.             rden =1'b0;
  50.         end
  51.         //复位,验证ram写入的数据是否清空
  52.         #CLOCK_CYCLE;
  53.         rst_n = 1'b0;
  54.         #(CLOCK_CYCLE*20);
  55.         rst_n = 1'b1;
  56.         #10;
  57.         //重新从地址0写入20个数据
  58.         for (i = 0;i<20;i=i+1) begin
  59.             wden = 1'b1;
  60.             address = i;
  61.             din = 8'($random);
  62.             @(posedge clk);
  63.             wden=1'b0;
  64.         end
  65.         #(CLOCK_CYCLE*20);
  66.         #5;
  67.         i=0;
  68.         //从地址0开始,读20个数据
  69.         repeat(20)begin
  70.             rden = 1'b1;
  71.             address = i;
  72.             i = i + 1;
  73.             @(posedge clk);
  74.         end
  75.         rden = 0;
  76.         #(CLOCK_CYCLE*100);
  77.         $stop;
  78.     end   
  79. endmodule
复制代码
3、波形仿真


通过对比波形图中的写入和读出数据等的相关比较。我们可以看到RAM可以或许成功的举行调用,到这里单端口的RAM调用结束。 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张裕

高级会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表