RAM的介绍
RAM是用一块memory和外围的读写控制电路组成。在FPGA中RAM可分为分布式RAM(distributed ram,消耗lut资源)和块RAM(block ram,消耗BRAM资源)。利用lut实现存储器,既可以实现芯片内部存储,又能提高资源利用率,同时可以实现BRAM不能实现的异步访问。 不过使用分布式RAM实现大规模的存储器会占用大量的lut,可用来实现逻辑的lut就会减少,一般在需要小规模存储器时,使用这种分布式RAM。
RAM的实现
1. 生成memory
利用以下代码便能生成宽度为WIDTH、深度为DEPTH的RAM,其中(* ram_style= “distributed” *) 可控制RAM由distributed ram(分布式ram,由lut构成)生成还是block ram生成。
(*ram_style= "distributed"*)
reg [WIDTH-1:0] mem [DEPTH-1:0];
2. 增加外围控制电路
可以将上述1中的代码进行简单的封装,就可以生成一个单口RAM IP。
module single_port_ram //simple双口RAM
#(
parameter WIDTH=8,
parameter DEPTH=16,
parameter ADDR_BIT = $clog2(DEPTH);
parameter RAM_STYLE_VAL="distributed"
)
(
input clk,
input we_a, //a口写使能信号
input en_a, //a口使能信号
input [ADDR_BIT-1:0] addr_a , //a口写地址
input [ WIDTH-1:0] din_a , //a口写数据
output reg [WIDTH-1:0] dout_a //a口输出数据
);
(*ram_style=RAM_STYLE_VAL*)
reg [WIDTH-1:0] RAM[0:DEPTH-1]; //RAM深度:DEPTH,宽度:WIDTH
integer t; //初始化RAM存储数值为0
initial begin
for(t=0;t<DEPTH;t=t+1)
RAM[t]=0;
end
always@(posedge clk) begin
if(en_a)
begin
if(we_a)
RAM[addr_a]<=din_a; //若en_a且we_a=1,a口输入数据至RAM[addr_a]
else
dout_a<=RAM[addr_a]; //每过一个时钟,a口输出RAM[addr_a]数据
end
end
endmodule