FPGA存储资源

可以用作存储功能的资源

  1. FF(Flip-Flop)
    触发器资源大部分情况作为寄存器使用。

  2. BRAM(Block RAM)
    Block RAM是集成在FPGA的片上资源,称为块RAM,简称为BRAM,在Xilinx FPGA中,每一个BRAM Block可以分为两个小块,以该小块为最小单元可以组合形成需求大小的RAM。

  3. LUT

    • distributed RAM,分布式RAM,区别于Block RAM
    • SRL(Shift Register LUT),LUT级联形成的移位寄存器
      LUT本身就是用于模拟逻辑电路真值表的高速RAM,distributed RAM与BRAM相比速度更快,但由于LUT资源有限,在大容量的RAM空间需求问题上表现不如集成的BRAM。

移位寄存器相比于通过触发器构成的多个独立寄存器,灵活性较差(如不能对单个寄存器进行置为或者复位操作),综合工具通常会将单纯的移位寄存器(不涉及复杂操作)综合为LUT级联形成的SRL,移位寄存器主要用于FIFO,可以极大的减少资源消耗,但相比于使用RAM构建的FIFO,SRL FIFO不能异步操作。

综合属性配置(Vivado Synthesis)

  1. RAM_STYLE
  • block:使用BRAM
  • distributed:使用LUT
  • registers:寄存器而不是RAM
  • ultra:UltraScale+™ URAM
  • mixed:以BRAM浪费空间最小为原则自动综合
  • auto:默认设置
1
(* ram_style = "distributed" *) reg [data_size-1:0] a_ram[2**addr_size-1:0];
  1. SHREG_EXTRACT
  • yes:使用SRL结构
  • no:不使用SRL结构
1
(* shreg_extract = "no" *) reg [16:0] a_srl;
  1. SRL_STYLE
    当SRL_STYLE和SHREG_EXTRACT一起使用时,SHREG_EXTRACT具有更高的优先级。
  • register:不使用SRL,只使用寄存器
  • srl:只使用SRL
  • block:将SRL放到一个BRAM中
  • srl_reg:使用SRL,最后一级的深度使用寄存器
  • reg_srl:使用SRL,第一级的深度使用寄存器
  • reg_srl_reg: 第一和最后一级都是用寄存器

在边缘引入寄存器可以结合SRL和寄存器的优点,提高时序稳定性。

1
(* srl_style = "srl" *) reg [16:0] a_srl; //使用使用LUT综合为SRL

BRAM资源使用形式

  1. 真双端口RAM(True Dual-port RAM)
    两个端口都可以进行读写。
  2. 简单双端口RAM(Simple Dual-port RAM)
    两个端口,一个端口只读,另一个端口只写。
  3. 单端口RAM(Single-port RAM)
    一个端口,可读可写,但不可同时进行
  4. ROM
    • 单端口ROM
    • 双端口ROM
  5. FIFO
    • 同步FIFO(Synchronize fifo)
      读写的时钟域相同。
    • 异步FIFO(Asynchronize fifo)
      读写的时钟域允许不同。

参考资料

  1. UG901 Vivado Design Suite User Guide: Synthesis

  2. UG473 7Series Memory Resources