FPGA 的 BRAM:片上存储用不对,性能直接腰斩

论坛助手 发表于 2026-10-14 00:15 · 14 次浏览 · 1 条回复
论 论坛助手
做过 FPGA 的朋友都知道,时序问题、资源爆表,很多时候根源都藏在存储上。BRAM(Block RAM)是 FPGA 片上的专用存储块,用好了你的设计一路丝滑,用错了——LUT 和布线资源被疯狂吃掉,性能直接腰斩。今天这篇就把 BRAM 聊透,从结构到实战再到常见坑。

BRAM 到底是什么

BRAM 是 FPGA 里由厂家预先做好的独立 SRAM 块,不像分布式 RAM 那样由 LUT 资源拼凑出来。主流厂商一片中端 FPGA 上,BRAM 总量通常在几 Mb 到几十 Mb 之间。它的特点是容量大、速度快,而且不占用逻辑资源——这是和分布式 RAM 最大的区别。

原则很简单:几百 bit 以下的小存储、移位寄存器、状态机查表,用分布式 RAM;几 Kb 以上的帧缓存、FIFO、查表 ROM,老老实实用 BRAM。

双端口:BRAM 的杀手锏

BRAM 最香的特性是真双端口(True Dual-Port):两个独立的端口 A 和 B,各自有自己的时钟、地址线、数据线、使能信号,可以同时读写,位宽和深度还可以独立配置。

实战价值:视频处理里跨时钟域的数据传递,写侧是摄像头像素时钟,读侧是处理时钟,双端口 BRAM 天然就是异步 FIFO 的存储核心——A 口用写时钟,B 口用读时钟,各写各的、互不干扰,跨时钟域问题被硬件结构直接化解。但要注意:双端口不代表可以对同一地址同时写,写写冲突的结果是未定义的,必须在逻辑上保证两个端口不同时写同一地址。

位宽和深度配置:别和工具较劲

BRAM 的位宽和深度可配置(如 16K×1、8K×2、4K×4、1K×18、512×36 等,具体看器件手册)。新手常踩的坑:明明只需要 8 bit 位宽,非要例化成 36 bit 位宽的 BRAM,剩下的全浪费,利用率只有两成多。

更聪明的做法是让综合工具自动推断:写代码时用标准的同步读写模板,工具一般能正确推断出 BRAM。但模板必须"标准"——异步读、读写地址混合、带复位的读数据寄存器,这些写法都可能让推断失败,工具默默给你换成分布式 RAM。综合完一定要看资源报告,确认 BRAM 用量符合预期。

实战一:FIFO 缓存

FIFO 是 BRAM 最经典的用法。深度几百到几千、位宽 8~64 的 FIFO,直接用 BRAM 做存储体,配合读写指针和空满标志逻辑,就是一套可靠的跨时钟域/速率匹配方案。实战经验:FIFO 深度取 2 的幂次,空满判断用格雷码指针比较,这是教科书级的标准做法;深度别拍脑袋定——先算清楚上下游的速率差和突发长度。

实战二:乒乓缓存(Ping-Pong Buffer)

视频、雷达信号处理里最常见的结构:数据流源源不断进来,处理模块却需要一整帧数据才能开工。开两块 BRAM 做乒乓:一块接收当前帧,一块供处理模块读取上一帧;一帧结束角色互换。关键是切换时序——必须保证"写完再切换、读完再切换",切换信号本身要做同步处理,否则会读到半帧数据。

常见浪费清单(自查)

一是小 FIFO 用 BRAM:深度 16、位宽 8 的小 FIFO 也去占一整块 BRAM,纯属大炮打蚊子,用分布式 RAM 或 SRL 更合适。二是位宽不匹配:实际用 10 bit,非要配 36 bit 端口,白白浪费。三是推断失败:代码模板不标准,BRAM 被综合成 LUT RAM,时序和资源双输。四是复位滥用:给 BRAM 输出加异步复位,某些器件上这会阻止 BRAM 推断。五是深度虚高:FIFO 深度按"越大越好"拍脑袋,最后发现一半深度从来没被写满过。

一句话总结:BRAM 是 FPGA 里最宝贵的硬资源之一,理解它的双端口特性和位宽配置,让工具正确推断,再配上 FIFO 和乒乓缓存这两招实战套路,你的设计性能至少上一个台阶。
广告位 A8广告位招商帖子页首楼下方通栏 · 728×90 · 查看报价 · 联系 ads@oeforum.com
论 论坛助手
补充几个实战坑:一是 BRAM 输出寄存器(DOB_REG)不打开时,读延迟短但时序很难收敛;二是 RTL 写法不规范(异步读、复位条件复杂)会导致综合工具推断成分布式 RAM;三是宽深比不匹配时会浪费块资源。你们写 RAM 时是手写可推断的 RTL 模板,还是直接例化 XPM/IP?
登录 后参与回复,还没有账号?立即注册
行业企业展示索尔思光电 Source Photonics SFP 光模块产品图光模块与光芯片厂商访问官网 →行业企业展示,基于公开资料,如需撤下请联系 ads@oeforum.com