BRAM(块 RAM)和分布式 RAM 有什么区别?
更新时间:2026-09-21。问题驱动短答页。资源见 LUT/BRAM/DSP,BRAM 入门见 BRAM 与分布式 RAM,推断写法见 存储器推断。
一句话回答
BRAM 是 FPGA 里一块块独立的专用大容量存储硬件(如 18Kb/36Kb),数据存在专门的 SRAM 资源里、不占用逻辑 LUT 和触发器,适合 FIFO、帧/行缓存、大查找表这类较深存储;分布式 RAM 是用若干 LUT 配置成的小存储(LUT RAM),容量小、散布在逻辑单元里,适合几十到几百 bit 的浅存储、移位寄存器和需要异步读的小 FIFO。容量、资源占用和读写方式决定选谁。
核心对照
| 维度 | BRAM 块 RAM | 分布式 RAM |
|---|---|---|
| 物理来源 | 专用 SRAM 块(18Kb/36Kb) | LUT 配置成 LUT RAM |
| 容量 | 大(Kb 级,可级联) | 小(几十~几百 bit) |
| 是否占 LUT/FF | 基本不占逻辑资源 | 占 LUT,深了还占 FF |
| 读方式 | 一般同步读(带输出寄存器) | 天然可异步(组合)读 |
| 端口 | 原生双端口、资源丰富 | 端口能力受限 |
| 适用 | FIFO、行/帧缓冲、大 LUT | 浅 FIFO、小缓存、移位寄存器 SRL |
| 位置 | 固定列,有布线/时钟约束 | 就近逻辑,灵活 |
选择经验
- 选 BRAM:深度大(几百上千字)、双端口、数据缓冲、视频行帧缓存、AXI DMA 缓冲、FIFO 主体。同步读模板最容易稳定推断成 BRAM。
- 选分布式 RAM / SRL:深度很浅(如 16×8、几十个系数)、需要异步读、小型重排缓冲、长延迟线(一个 LUT 就能当 16/32 级移位寄存器 SRL)、或 BRAM 已经耗尽时的余量存储。
- 寄存器堆:极小且每个都要复位/独立访问的,直接用 FF 最划算。
推断规则是关键:时钟沿同步读 → BRAM;assign q = mem[a] 这种组合读 → 分布式 RAM/FF,详见 存储器推断。可在代码用综合属性(ram_style = block/distributed)显式指定。
常见坑
- 小存储却用 BRAM:几百个小 FIFO 各占一整块,BRAM 迅速用光、利用率极低。
- 想进 BRAM 却写成异步读或给存储本体加复位:被摊成大量 LUT/FF,逻辑资源暴涨。
- 深分布式 RAM:占用大量 LUT 还可能拉低频率。
- 位宽×深度不贴 BRAM 粒度,剩余空间浪费,可调整组织或多块拼接。
- BRAM 有固定读延迟(1~2 拍),代码预期 0 延迟导致握手错位。
- 复位策略、同址读写行为(write-first/read-first)没和目标 RAM 模式对齐。
总结
BRAM 是 FPGA 内专用的大块双端口 SRAM,容量大、不占 LUT/FF、同步读,适合 FIFO 与帧/行缓存等较深存储;分布式 RAM 由 LUT 拼成,小而灵活、支持异步读,适合浅缓存、移位寄存器 SRL 和 BRAM 用尽时的余量;选择看容量、端口和读写方式,并靠同步/异步读的 RTL 模板或 ram_style 属性确保综合出你想要的资源,避免浅存储浪费 BRAM、深存储拖垮 LUT。