本文为个人的学习笔记,内容均为网络资料总结,价值有限~参考资料附在文后
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
- 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
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/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