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. LUTLUT 是查找表本质上可以理解成一个小型真值表存储器。你平时写的很多组合逻辑比如if/elsecase比较器译码器多路选择器最后大概率都会映射到 LUT。所以 LUT 不只是“门电路”的替代它其实是 FPGA 实现组合逻辑的核心单位。2. FF / RegisterFF 就是触发器也就是寄存器资源。它的作用非常明确打拍保存状态形成流水线存计数器值存状态机当前状态如果说 LUT 负责“算”那 FF 就负责“记”。3. Carry Chain这个资源非常容易被忽略但实际非常重要。Carry Chain 是 FPGA 里的专用进位链主要用来做加法器减法器计数器比较器为什么它重要因为如果完全用 LUT 去拼加法速度和时序通常都不如专用进位链。很多时候你看到“这个计数器很轻松就过时序”背后就有 Carry Chain 的功劳。4. MUX 和逻辑块MUX 多路选择器本身不算“独立大类资源”但在设计里经常出现。状态切换、数据通路选择、时序控制里几乎到处都有它。至于 CLB、Slice、LAB、LE 这些名字可以先简单理解成它们是厂商对一组基础逻辑资源打包后的物理单元命名。Xilinx 常见CLB/SliceIntel/Altera 常见LAB/LE。二、存储资源别什么都用寄存器硬堆很多人刚开始写模块时最容易犯的一个问题就是明明应该用专用存储资源结果全堆在寄存器或者 LUT 上。1. BRAMBRAM 是块 RAM片上专用存储资源。典型用途行缓存图像缓存查表FIFO双口 RAM参数缓存它的特点是容量大、速度快、结构稳定很适合中大容量数据。2. Distributed RAM这个资源其实是用 LUT 组织出来的小 RAM。适合小容量表小缓存小 ROM一些分散的存储结构它的好处是灵活但会占逻辑资源。3. ROMROM 很常用于正弦查表字模表系数表状态表在 FPGA 里ROM 可以由 BRAM 实现也可以由 LUT 实现具体取决于容量和写法。4. FIFOFIFO 是开发里特别常用的一类缓冲结构。典型用途串口接收缓存视频流缓存数据搬运解耦跨时钟域传输尤其是异步 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. IOBIOB 是输入输出单元是 FPGA 连接外部世界的入口。平时接这些都会经过它LCDADCDACUART按键LEDSPI Flash2. BankBank 可以理解成一组 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、图像处理、滤波方向走的人来说越早认识越好。它最适合做乘法乘加累加加减法链路典型场景FIRFFT矩阵乘法图像卷积定点运算一句话概括DSP 资源就是片上专门干“高效算术”的地方。七、互连资源时序很多时候输在“路太远”这一类资源平时不容易直接感知但它其实时时都在发挥作用。FPGA 里有全局布线长线短线局部布线各类专用互连这些东西决定了逻辑之间怎么连接距离远不远延迟大不大时序能不能过所以很多时候设计时序不过不是算法错了而是逻辑级数太深扇出太大布线太长结构不适合实现八、硬核资源不是所有功能都靠 LUT 和 FF 堆出来很多现代 FPGA 里会有一些硬核资源比如ARM CPUDDR 控制器PCIe 控制器以太网 MAC高速收发器 GT这类资源的特点是功能复杂性能高资源利用率更好比自己用 RTL 从头搭省很多事如果以后你做的是Linux FPGASoC 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、硬核接口会顺很多。