本文为个人的学习笔记,内容均为网络资料总结,价值有限~ 参考资料附在文后

RAM分类

RAM 按照功能可以分为 单端口RAM(SP),简单双端口RAM(SDP),真双端口RAM(TDP)。

按照底层实现可以分为 分布式RAM(DRAM),块RAM(BRAM),寄存器RAM(REG),有些器件也可以用URAM实现(与BRAM类似)。

其中,TDP RAM只能使用BRAM实现,URAM只能实现同步的SDP RAM,DRAM和REG均能实现SP RAM和 SDP RAM。

等位宽SDP RAM

`ifdef RST_ACTIVE_LOW
    `define RST_Edge negedge
    `define RST_ACTIVE 1'd0
`else
    `define RST_Edge posedge
    `define RST_ACTIVE 1'd1
`endif


module DCSDP_RAM #(
    parameter U_DLY = 1,
    parameter RAM_TYPE ="BRAM",// BRAM, DRAM, REG
    parameter DATA_WIDTH = 16,
    parameter DEPTH = 64,
    parameter DEPTH_BIT = 6
) (
    input                      clk,
    input                      [DEPTH_BIT-1:0]      wr_addr,    
    input                      [DEPTH_BIT-1:0]      rd_addr,
    input                      [DATA_WIDTH-1:0]     wr_data,
    output              reg    [DATA_WIDTH-1:0]     rd_data,
    input                                           rd_en,
    input                                           wr_en
);

localparam RAM_STYLE = (RAM_TYPE=="DRAM")? "distributed":
                       (RAM_TYPE=="BRAM")? "block" :
                       (RAM_TYPE=="REG")? "registers" :
                                            "auto";
(*  ram_style=RAM_STYLE *) reg [DATA_WIDTH-1:0]       mem[DEPTH_BIT-1:0] ;
always @(posedge clk ) begin
    if(wr_en==1'd1) mem[wr_addr] <= #U_DLY wr_data;
    if(rd_en==1'd1) rd_data <= #U_DLY mem[rd_addr];
end

endmodule

上面这个代码实现了一个简单双端口的RAM,可以选择RAM的类型,设置深度和位宽。

以下为资源占用情况:

BRAM

DRAM

REG

参考资料:

https://blog.csdn.net/qq_34839501/article/details/132803815

https://blog.csdn.net/qq_40011737/article/details/122095726

https://blog.csdn.net/weiaipan1314/article/details/104327009

https://blog.csdn.net/weiaipan1314/article/details/104328475

https://fpga.eetrend.com/files-eetrend-xilinx/download/201408/7595-13762-ug4747seriesclb.pdf