FPGA存储资源
FPGA存储资源
可以用作存储功能的资源
FF(Flip-Flop)
触发器资源大部分情况作为寄存器使用。BRAM(Block RAM)
Block RAM是集成在FPGA的片上资源,称为块RAM,简称为BRAM,在Xilinx FPGA中,每一个BRAM Block可以分为两个小块,以该小块为最小单元可以组合形成需求大小的RAM。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)
- 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]; |
- SHREG_EXTRACT
- yes:使用SRL结构
- no:不使用SRL结构
1 | (* shreg_extract = "no" *) reg [16:0] a_srl; |
- 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资源使用形式
- 真双端口RAM(True Dual-port RAM)
两个端口都可以进行读写。 - 简单双端口RAM(Simple Dual-port RAM)
两个端口,一个端口只读,另一个端口只写。 - 单端口RAM(Single-port RAM)
一个端口,可读可写,但不可同时进行 - ROM
- 单端口ROM
- 双端口ROM
- FIFO
- 同步FIFO(Synchronize fifo)
读写的时钟域相同。 - 异步FIFO(Asynchronize fifo)
读写的时钟域允许不同。
- 同步FIFO(Synchronize fifo)