浅谈XILINX FPGA CLB单元 之 分布式RAM (Distributed RAM Available in SLICEM Only、RAM128X1D、Verilog原语描述)
程序员文章站
2024-02-23 09:08:28
...
浅谈XILINX FPGA CLB单元 之 分布式RAM (Distributed RAM Available in SLICEM Only、RAM128X1D、原语primitive描述)
一、分布式RAM(Distributed RAM)
SLICEM中的函数发生器添加一个据输入端口和使能就将 其拓展成一个分布式 RAM。分布式 。分布式 RAM的资源可以在 SLICE中配置, 中配置。
- Xilinx FPGA分布式RAM资源配置情况
下表显示了每种分布式RAM配置占用的LUT数量(每个slice四个)。
- 主要原理、特点
一个 SLICEM中的多个查找表可以不同方式组合来存储更多的数据。
分布式 RAM的主要特点是快速,本地化并且对于小数据缓存区、 先进出、以及寄存器文件有着理想的效果。
对于更大储需求,可考虑用 18K 分区 RAM来实现。
二、SLICEM中配置RAM元素可实现以下配置
-
一个SLICEM可以扩展的分布式RAM的所有形式
• Single-Port 32 x 1-bit RAM
• Dual-Port 32 x 1-bit RAM
• Quad-Port 32 x 2-bit RAM
• Simple Dual-Port 32 x 6-bit RAM
• Single-Port 64 x 1-bit RAM
• Dual-Port 64 x 1-bit RAM
• Quad-Port 64 x 1-bit RAM
• Simple Dual-Port 64 x 3-bit RAM
• Single-Port 128 x 1-bit RAM
• Dual-Port 128 x 1-bit RAM
• Single-Port 256 x 1-bit RAM -
使用分布式RAM需要注意的地方
1)分布式RAM模块是同步(写)资源。 可以使用触发器在同一片中实现同步读取。
2)通过使用该触发器,可以通过减少触发器的时钟输出值的延迟来提高分布式RAM的性能。
3)但是,添加了额外的时钟延迟。 分布式元素共享相同的时钟输入。
4)对于写操作,必须将由SLICEM的CE或WE引脚驱动的写使能(WE)输入设置为高。 -
分布式RAM配置包括:
•单口RAM
•双端口
•简单的双端口
•四端口
三、以RAM128X1D 为例(128位的 1位输出的随机存储器)
- 下图是RAM128X1D 结构图
- 工作原理
这个分布式 RAM的深度是 128位,读取宽度是 1 位,并且有一个读写端口在开始写入时,写入使能 WE处于高电平,此时输入 D 连上地址总线 A。这个在上升沿发生不久后进行,并且输出 SPO也会和输入 D的值相同(稍作延时)。当写入使能 WE处于低电平时,会开始进行异步读取,其中指定内容的数据通过地址总线异步输出 到SPO。读端口可以进行异步操作,通过改变输入 DPRA 的 值来读取不同位 置的存储器值,并将改输出 到DPO。 - RAM128X1D端口描述
四、Xilinx 官方 Vivado中RAM128X1D的原语(primitive)描述
// RAM128X1D : In order to incorporate this function into the design,
// Verilog : the following instance declaration needs to be placed
// instance : in the body of the design code. The instance name
// declaration : (RAM128X1D_inst) and/or the port declarations within the
// code : parenthesis may be changed to properly reference and
// : connect this function to the design. All inputs
// : must be connected.
// <-----Cut code below this line---->
// RAM128X1D: 128-deep by 1-wide positive edge write, asynchronous read (Mapped to two SliceM LUT6s)
// dual-port distributed LUT RAM
// Artix-7
// Xilinx HDL Language Template, version 2017.4
RAM128X1D #(
.INIT(128'h00000000000000000000000000000000)
) RAM128X1D_inst (
.DPO(DPO), // Read port 1-bit output
.SPO(SPO), // Read/write port 1-bit output
.A(A), // Read/write port 7-bit address input
.D(D), // RAM data input
.DPRA(DPRA), // Read port 7-bit address input
.WCLK(WCLK), // Write clock input
.WE(WE) // Write enable input
);
// End of RAM128X1D_inst instantiation
- Verilog 中 关键部分(需要例化的部分)
RAM128X1D #(
.INIT(128'h00000000000000000000000000000000)
) RAM128X1D_inst (
.DPO(DPO), // Read port 1-bit output
.SPO(SPO), // Read/write port 1-bit output
.A(A), // Read/write port 7-bit address input
.D(D), // RAM data input
.DPRA(DPRA), // Read port 7-bit address input
.WCLK(WCLK), // Write clock input
.WE(WE) // Write enable input
);
- VHDL中关于RAM128X1D的原语(primitive)描述
开始需要声明库,但基本和Verilog一样。