浅谈XILINX FPGA CLB单元 之 分布式RAM (Distributed RAM Available in SLICEM Only、RAM128X1D、原语primitive描述)

一、分布式RAM(Distributed RAM)

SLICEM中的函数发生器添加一个据输入端口和使能就将 其拓展成一个分布式 RAM。分布式 。分布式 RAM的资源可以在 SLICE中配置, 中配置。

  1. Xilinx FPGA分布式RAM资源配置情况
    下表显示了每种分布式RAM配置占用的LUT数量(每个slice四个)。
    在这里插入图片描述
  2. 主要原理、特点
    一个 SLICEM中的多个查找表可以不同方式组合来存储更多的数据。
    分布式 RAM的主要特点是快速,本地化并且对于小数据缓存区、 先进出、以及寄存器文件有着理想的效果
    对于更大储需求,可考虑用 18K 分区 RAM来实现。
二、SLICEM中配置RAM元素可实现以下配置
  1. 一个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

  2. 使用分布式RAM需要注意的地方
    1)分布式RAM模块是同步(写)资源。 可以使用触发器在同一片中实现同步读取。
    2)通过使用该触发器,可以通过减少触发器的时钟输出值的延迟来提高分布式RAM的性能。
    3)但是,添加了额外的时钟延迟。 分布式元素共享相同的时钟输入。
    4)对于写操作,必须将由SLICEM的CE或WE引脚驱动的写使能(WE)输入设置为高

  3. 分布式RAM配置包括:
    •单口RAM
    •双端口
    •简单的双端口
    •四端口

三、以RAM128X1D 为例(128位的 1位输出的随机存储器)
  1. 下图是RAM128X1D 结构图
    在这里插入图片描述
  2. 工作原理
    这个分布式 RAM的深度是 128位,读取宽度是 1 位,并且有一个读写端口在开始写入时,写入使能 WE处于高电平,此时输入 D 连上地址总线 A。这个在上升沿发生不久后进行,并且输出 SPO也会和输入 D的值相同(稍作延时)。当写入使能 WE处于低电平时,会开始进行异步读取,其中指定内容的数据通过地址总线异步输出 到SPO。读端口可以进行异步操作,通过改变输入 DPRA 的 值来读取不同位 置的存储器值,并将改输出 到DPO。
  3. RAM128X1D端口描述
    在这里插入图片描述
四、Xilinx 官方 Vivado中RAM128X1D的原语(primitive)描述
  1. primitive描述
    更多关于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
  1. 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
);					
  1. VHDL中关于RAM128X1D的原语(primitive)描述
    开始需要声明库,但基本和Verilog一样。
    在这里插入图片描述
Logo

一站式 AI 云服务平台

更多推荐