本文转载自泡面狂的博客的博客:http://blog.sina.com.cn/s/blog_79ce0d8f0101g0n1.html
在FPGA设计实现中,经常要用到RAM,这里的RAM一般指的是是静态的RAM。一般FPGA(如xilinx)中就有所谓的block RAM, 它就是现成的RAM资源,我们如果合理编写verilog代码,就可以使我们想要的RAM被综合成block RAM,从而节省逻辑资源,而且性能更优。
下面是一个单时钟同步RAM的模板:
代码已在quartus中验证
module ram_X(
//input:
clk,
wen,
din,
waddr,
raddr,
//output:
dout
);
parameter DWIDTH = 8; //数据宽度,请根据实际情况修改
parameter AWIDTH = 10; //地址宽度,请根据实际情况修改
input clk;
input wen;
input [DWIDTH-1:0] din;
input [AWIDTH-1:0] waddr;
input [AWIDTH-1:0] raddr;
output [DWIDTH-1:0] dout;
reg [DWIDTH-1:0] RAM [2**AWIDTH-1:0];
reg [AWIDTH-1:0] raddr_reg;
always @ (posedge clk)
begin
if(wen)
begin
RAM[waddr] <= din;
end
end
always @ (posedge clk)
begin
raddr_reg <= raddr;
end
assign dout = RAM[raddr_reg];
endmodule
总结:
上面代码从功能上描述了一个单时钟双端口同步RAM的编写方法,在ISE和quartus中都能通过综合,被映射到实际的block RAM资源中。