用Verilog编写同步RAM

本文转载自泡面狂的博客的博客: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资源中。

猜你喜欢

转载自blog.csdn.net/fucong59/article/details/83009403
RAM