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

一、简介

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 例化模板文件复制。如图:

module ip_ram( 
    input				clk		,
    input				rst_n	,
    input				rden    ,
    input               wden	,
    input		[8:0]   address	,
    input		[7:0]	din 	,
    output		[7:0]	dout	
);								 
    
    
 ram_1	ram_1_inst (
	.aclr ( ~rst_n ),
	.address ( address ),
	.clock ( clk ),
	.data ( din ),
	.rden ( rden ),
	.wren ( wden ),
	.q ( dout )
	);
    
endmodule

2、测试文件的编写

在tb文件夹中新建tb_ram。v文件。如图:

`timescale 1ns/1ns
    
module tb_ram();

//激励信号定义 
    reg				clk		    ;
    reg				rst_n	    ;
    reg				rden   	    ;
    reg				wden	  	;
    reg		[8:0]		address	    ;
    reg		[7:0]		din 	  	;

//输出信号定义	 
  wire	[7:0]		dout    ;

//时钟周期参数定义	
    parameter		CLOCK_CYCLE = 20;   

//模块例化
    ip_ram   ip_ram_inst( 
    /*input				*/.clk		(clk	),
    /*input				*/.rst_n	(rst_n),
    /*input				*/.rden     (rden   ),
    /*input             */.wden	    (wden	  ),
    /*input		[8:0]   */.address	(address),
    /*input		[7:0]	*/.din 	    (din 	  ),
    /*output	[7:0]	*/.dout	    (dout	  )
);			

//产生时钟
    initial 		clk = 1'b0;
    always #(CLOCK_CYCLE/2) clk = ~clk;

//产生激励
    integer i;
    initial  begin 
     
        rst_n = 1'b0;
        wden = 1'b0;
        rden = 1'b0;
        din = 9'h00;
        #(CLOCK_CYCLE*20);
        rst_n = 1'b1;

        #10;
        //写入600个数据
        for (i = 0;i<600;i=i+1) begin
            wden = 1'b1;
            address = i;
            din = 8'($random);
            @(posedge clk);
            wden=1'b0;
            rden = 1'b1;
            address = i;
            @(posedge clk);
            rden =1'b0;
        end
        //复位,验证ram写入的数据是否清空
        #CLOCK_CYCLE;
        rst_n = 1'b0;
        #(CLOCK_CYCLE*20);
        rst_n = 1'b1;
        #10;

        //重新从地址0写入20个数据
        for (i = 0;i<20;i=i+1) begin
            wden = 1'b1;
            address = i;
            din = 8'($random);
            @(posedge clk);
            wden=1'b0;
        end

        #(CLOCK_CYCLE*20);
        #5;
        i=0;
        //从地址0开始,读20个数据
        repeat(20)begin
            rden = 1'b1;
            address = i;
            i = i + 1;
            @(posedge clk);
        end
        rden = 0;

        #(CLOCK_CYCLE*100);
        $stop;
    end    

endmodule 

3、波形仿真

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

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电子小芯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值