FPGA 上到底有哪些硬件资源?这次一次性整理清楚
很多人刚学 FPGA 的时候,容易把注意力全放在 Verilog 语法上。
写always、写状态机、写计数器,这些当然重要,但如果一直停留在“代码层”,后面就会越来越容易卡住。因为 FPGA 和单片机、Linux 软件不一样,它不是在执行程序,而是在把代码映射成真实的硬件资源。
所以从某个阶段开始,必须建立一个意识:
你写的 RTL,最后到底落在了 FPGA 的哪些资源上?
这篇文章就做一件事,把 FPGA 上常见的硬件资源整理成一张比较完整的地图。尽量把“资源是什么、拿来干什么、平时会怎么用”讲清楚。
为什么这件事值得搞明白
很多初学者会遇到这些问题:
- 为什么同样是加法器,有时候时序能过,有时候不过?
- 为什么有的存储适合用 BRAM,有的更适合 LUT?
- 为什么时钟不能随手在逻辑里翻转出来就拿去用?
- 为什么串口、LCD、ADC、DDR 这些接口,最后都会落到不同的资源上?
- 为什么综合报告里总在讲 LUT、FF、BRAM、DSP、IO、BUFG?
这些问题的本质,其实都和 FPGA 的底层资源类型有关。
说得直接一点:
不会看资源,代码就只是“能写”;会看资源,设计才开始变成“能做”。
先建立一个总图
如果把 FPGA 看成一座城市,那它内部大概可以这么理解:
LUT + FF是最基础的居民楼,数量最多Carry Chain是快速高架,专门帮你做加法和计数BRAM是仓库,负责大块存储DSP是工厂,负责高效做乘法、乘加IO / Bank是城门,负责和外部芯片打交道PLL / MMCM / BUFG是时钟系统,负责全城同步SERDES / GT是高速铁路,负责高速串行传输ILA / XADC是监控系统,负责调试和状态观测Hard CPU / PCIe / DDR 控制器则更像是片上的特殊基础设施
下面就按这个思路往下拆。
一、逻辑资源:你写的大部分 RTL,最后都会先落到这里
这一类资源最常见,也最值得最先理解。
1. LUT
LUT 是查找表,本质上可以理解成一个小型真值表存储器。
你平时写的很多组合逻辑,比如:
if/elsecase- 比较器
- 译码器
- 多路选择器
最后大概率都会映射到 LUT。
所以 LUT 不只是“门电路”的替代,它其实是 FPGA 实现组合逻辑的核心单位。
2. FF / Register
FF 就是触发器,也就是寄存器资源。
它的作用非常明确:
- 打拍
- 保存状态
- 形成流水线
- 存计数器值
- 存状态机当前状态
如果说 LUT 负责“算”,那 FF 就负责“记”。
3. Carry Chain
这个资源非常容易被忽略,但实际非常重要。
Carry Chain 是 FPGA 里的专用进位链,主要用来做:
- 加法器
- 减法器
- 计数器
- 比较器
为什么它重要?因为如果完全用 LUT 去拼加法,速度和时序通常都不如专用进位链。很多时候你看到“这个计数器很轻松就过时序”,背后就有 Carry Chain 的功劳。
4. MUX 和逻辑块
MUX 多路选择器本身不算“独立大类资源”,但在设计里经常出现。状态切换、数据通路选择、时序控制里,几乎到处都有它。
至于 CLB、Slice、LAB、LE 这些名字,可以先简单理解成:
它们是厂商对一组基础逻辑资源打包后的物理单元命名。
Xilinx 常见CLB/Slice,Intel/Altera 常见LAB/LE。
二、存储资源:别什么都用寄存器硬堆
很多人刚开始写模块时,最容易犯的一个问题就是:
明明应该用专用存储资源,结果全堆在寄存器或者 LUT 上。
1. BRAM
BRAM 是块 RAM,片上专用存储资源。
典型用途:
- 行缓存
- 图像缓存
- 查表
- FIFO
- 双口 RAM
- 参数缓存
它的特点是容量大、速度快、结构稳定,很适合中大容量数据。
2. Distributed RAM
这个资源其实是用 LUT 组织出来的小 RAM。
适合:
- 小容量表
- 小缓存
- 小 ROM
- 一些分散的存储结构
它的好处是灵活,但会占逻辑资源。
3. ROM
ROM 很常用于:
- 正弦查表
- 字模表
- 系数表
- 状态表
在 FPGA 里,ROM 可以由 BRAM 实现,也可以由 LUT 实现,具体取决于容量和写法。
4. FIFO
FIFO 是开发里特别常用的一类缓冲结构。
典型用途:
- 串口接收缓存
- 视频流缓存
- 数据搬运解耦
- 跨时钟域传输
尤其是异步 FIFO,几乎是 CDC 入门里必须掌握的结构。
5. 移位寄存器 / SRL
这类资源常用于:
- 固定延迟
- 滑动窗口
- FIR 延迟链
- 串并转换
有些 FPGA 能直接把 LUT 配成移位寄存器,这在图像和 DSP 场景里会很常见。
三、时钟资源:很多问题不是逻辑错了,而是时钟没处理好
FPGA 设计里,时钟从来都不是普通信号。
1. PLL / MMCM
这类资源最常见的作用是:
- 倍频
- 分频
- 相移
- 占空比调整
- 时钟整形
像 LCD、VGA、DDR 这种项目,几乎都会碰到。
2. BUFG / BUFH / BUFR
这些是时钟缓冲资源,用来把时钟送到专用时钟网络上。
很多初学者会直接写逻辑分频,然后把分频结果当新时钟到处跑。短期可能能亮灯,但工程上通常不推荐。因为:
- 偏斜不可控
- 约束更难
- 时序分析更麻烦
所以更规范的做法一般是:
- 用 PLL/MMCM 生成时钟
- 或者尽量用
clock enable - 时钟分发走专用缓冲资源
3. 全局时钟网络
这个资源虽然你平时不会手动去“画线”,但它的存在很关键。因为:
时钟必须优先走专用低偏斜网络,而不是像普通数据那样随便布线。
四、I/O 与 Bank:代码写对了,不代表外设就一定能接对
这部分是很多软件背景同学容易忽略的。
1. IOB
IOB 是输入输出单元,是 FPGA 连接外部世界的入口。
平时接这些都会经过它:
- LCD
- ADC
- DAC
- UART
- 按键
- LED
- SPI Flash
2. Bank
Bank 可以理解成一组 IO 的分区管理单元。
它最重要的意义是:
- 同一组 IO 往往共享电压条件
- 某些标准只能在特定 Bank 里用
- 高速接口、差分接口常和 Bank 规划强相关
所以 Bank 不是“封装图里一个无关紧要的区域”,它直接影响你的接口能不能放得下、能不能跑得稳。
3. IO Standard
这个就是电平标准,比如:
LVCMOSLVTTLLVDSSSTLHSTL
你要和外部芯片通信,就必须匹配它的电气标准。这个在 XDC 约束里经常会配。
4. 其他 IO 细节
还有一些经常会用到,但一开始不太显眼的配置:
- 驱动强度
- 上升下降沿速度
- 上拉/下拉
- 差分对
这些东西在低速实验里不一定敏感,但到了高速、长线、抗干扰要求高的系统里,会越来越重要。
五、串并转换与高速接口资源
如果项目开始接摄像头、LVDS、DDR 或一些源同步接口,这一块就绕不过去。
1. ISERDES / OSERDES
它们主要做的是:
- 串行转并行
- 并行转串行
适用于:
- 摄像头数据接收
- 高速显示输出
- LVDS 类接口
2. IDDR / ODDR
这类资源主要在双边沿采样、双边沿输出时出现。
像 DDR 风格接口,或者一些需要更高吞吐但时钟不想继续翻高的场景,常会用到。
六、DSP 资源:不是所有乘法都该用 LUT 硬拼
DSP Slice 是 FPGA 很重要的一类资源,尤其对以后往 AI、图像处理、滤波方向走的人来说,越早认识越好。
它最适合做:
- 乘法
- 乘加
- 累加
- 加减法链路
典型场景:
- FIR
- FFT
- 矩阵乘法
- 图像卷积
- 定点运算
一句话概括:
DSP 资源就是片上专门干“高效算术”的地方。
七、互连资源:时序很多时候输在“路太远”
这一类资源平时不容易直接感知,但它其实时时都在发挥作用。
FPGA 里有:
- 全局布线
- 长线
- 短线
- 局部布线
- 各类专用互连
这些东西决定了:
- 逻辑之间怎么连接
- 距离远不远
- 延迟大不大
- 时序能不能过
所以很多时候,设计时序不过,不是算法错了,而是:
- 逻辑级数太深
- 扇出太大
- 布线太长
- 结构不适合实现
八、硬核资源:不是所有功能都靠 LUT 和 FF 堆出来
很多现代 FPGA 里会有一些硬核资源,比如:
- ARM CPU
- DDR 控制器
- PCIe 控制器
- 以太网 MAC
- 高速收发器 GT
这类资源的特点是:
- 功能复杂
- 性能高
- 资源利用率更好
- 比自己用 RTL 从头搭省很多事
如果以后你做的是:
- Linux + FPGA
- SoC FPGA
- 高速采集卡
- 网络或视频平台
这些硬核资源会越来越常见。
九、调试和配置资源:真正上板以后,你会非常感谢它们存在
很多文章在讲 FPGA 资源时容易忽略这块,但从实际开发角度说,它们很重要。
1. JTAG 和配置资源
这部分决定:
- bitstream 怎么下载
- 板子怎么启动
- 配置是从 JTAG 来还是从 Flash 来
2. ILA / VIO
这是 FPGA 开发里非常实用的调试资源。
它们能帮你:
- 在线抓波形
- 看状态机
- 看 FIFO 状态
- 看接口握手
- 人工改某些调试信号
很多“仿真看着没问题,上板就不对”的问题,最后都得靠它们查。
3. XADC / 系统监测
这个资源更偏系统健康监控,比如:
- 温度
- 电压
- 某些模拟量观测
在一些产品化和高可靠性系统里很有用。
十、如果从开发动作反推资源,该怎么理解
这个角度通常最适合初学者。
比如:
- 写状态机,本质上在消耗
LUT + FF - 写计数器,本质上在消耗
FF + Carry Chain - 写缓存,本质上在考虑
BRAM还是Distributed RAM - 写乘法滤波,本质上会尽量用
DSP - 做跨时钟域,本质上要用同步器或者
FIFO - 做 LCD、摄像头、高速接口,就开始大量碰到
IO + 时钟资源 + 约束
也就是说:
代码只是入口,资源才是落地。
十一、初学者最适合怎么学这些资源
如果一开始就按“器件白皮书”顺序硬啃,很容易乱。
更自然的顺序是:
LUT + FFCarry ChainBRAM / FIFO / ROMIO / Bank / 电平标准PLL / MMCM / BUFGDSPSERDES / DDR IOHard IP / SoC / GT
这个顺序和大多数人的成长路线更一致:
- 先会写基础 RTL
- 再接触缓存和接口
- 再碰时钟和时序
- 最后再进入高速和系统级资源
总结
如果把这篇文章压缩成一句话,那就是:
FPGA 设计不是“写 Verilog”这么简单,而是把功能映射到合适的片上资源,并通过时钟、布线和约束把它稳定跑起来。
当你开始有意识地区分:
- 这段逻辑更像消耗 LUT 还是 DSP
- 这块缓存该放 BRAM 还是 LUT RAM
- 这个接口主要依赖 IO 还是 SERDES
- 这个时钟该用逻辑分频还是 PLL/MMCM
你就已经从“会写代码”往“会做 FPGA 系统”走了。
如果后面继续往 Linux + FPGA、图像处理、AI 加速、车载接口这些方向走,这张资源地图基本都会反复用到。
如果把这篇内容作为后续学习入口,我自己的建议是:
先把LUT、FF、BRAM、DSP、PLL、IO Bank这几块吃透,后面再去看 GT、SERDES、硬核接口,会顺很多。