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

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

verilog
  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
`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