RAM可以随时把数据写入任一指定地址的存储单元,也可以随时从任一指定地址中读出数据,其读写速度是由时钟频率决定的RAM:随机访问内存
随机访问内存(RAM)相当于PC机上的移动存储,用来存储和保存数据的。在任何时候都可以读写,RAM通常用作操作系统或其他正在运行的程序的临时存储介质(可称作系统内存)。不过,当电源关闭时RAM不能保留数据,如果需要保存数据,就必须把它们写入到一个长期的存储器中(例如硬盘)。正因为如此,有时也将RAM称作"可变存储器"。RAM内存可以进一步分为静态RAM(SRAM)和动态内存(DRAM)两大类。
SRAM:静态随机存取存储器
静态随机存取存储器(Static Random-Access Memory,SRAM)是随机存取存储器的一种。所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。相对之下,动态随机存取存储器(DRAM)里面所储存的数据就需要周期性地更新。然而,当电力供应停止时,SRAM储存的数据还是会消失(被称为volatile memory),这与在断电后还能储存资料的ROM或闪存是不同的。
DRAM:动态随机存取存储器
SRAM不需要刷新电路即能保存它内部存储的数据。而DRAM(Dynamic Random Access Memory)每隔一段时间,要刷新充电一次,否则内部的数据即会消失,因此SRAM具有较高的性能,但是SRAM也有它的缺点,即它的集成度较低,功耗较DRAM大 ,相同容量的DRAM内存可以设计为较小的体积,但是SRAM却需要很大的体积。同样面积的硅片可以做出更大容量的DRAM,因此SRAM显得更贵。。
RAM主要用来存放程序及程序执行过程中产生的中间数据、运算结果等。在资源允许的范围内,允许灵活地配置ram
Vivado软件自带BMG IP核,可以配置成RAM或者ROM(只允许进行读操作)。通过对这些bram存储器模块进行配置,可以实现ram、移位寄存器、rom以及fifo缓冲器等各种存储器的功能。
我们首先进行单端口ram ip的调用实验,明白它的作用和使用方式;再独立进行ram的编写实验
单端口RAM:只有1个端口,共用读写通道,读写不能同时进行
伪双端口RAM:2个通道,分别进行读写
真双端口RAM:2个通道,都可以读写
单端口ip实验
首先调用vivado ip进行单端口实验:
要使用ram ip,要在ip catalog里面搜索ram,并选中block memory generator
修改端口设置
然后就可以通过生成的veo文件的模板调用它
blk_mem_gen_0 your_instance_name (
.clka(clka), // input wire clka
.rsta(rsta), // input wire rsta
.ena(ena), // input wire ena
.wea(wea), // input wire [0 : 0] wea
.addra(addra), // input wire [4 : 0] addra
.dina(dina), // input wire [7 : 0] dina
.douta(douta), // output wire [7 : 0] douta
.rsta_busy(rsta_busy) // output wire rsta_busy
);
这里我们要用逻辑分析仪进行分析ram的读写,因为modelsim等仿真软件是看不到相关信号的,所以还要在代码中加入ila ip的调用
配置如下:
读写模块代码:
module ram_wr(
input clk ,
input rst_n ,
input [7:0] r_data , //ram读数据
output reg [7:0] w_data , //ram写数据
output ram_write_sel , //ram读写选择
output reg [4:0] addr , //ram读写地址
output ram_en ); //ram使能信号
//读写计数器
reg [5:0] wr_cnt;
//0-31为写,32到63为读
assign ram_write_sel = (wr_cnt<=6'd31 && ram_en)? 1'b1 : 1'b0;
assign ram_en=rst_n;
//产生ram读写数据
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
w_data <= 0;
else if((wr_cnt <= 6'd31)&&ram_en