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/else
  • case
  • 比较器
  • 译码器
  • 多路选择器

最后大概率都会映射到 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

这个就是电平标准,比如:

  • LVCMOS
  • LVTTL
  • LVDS
  • SSTL
  • HSTL

你要和外部芯片通信,就必须匹配它的电气标准。这个在 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 + 时钟资源 + 约束

也就是说:

代码只是入口,资源才是落地。

十一、初学者最适合怎么学这些资源

如果一开始就按“器件白皮书”顺序硬啃,很容易乱。

更自然的顺序是:

  1. LUT + FF
  2. Carry Chain
  3. BRAM / FIFO / ROM
  4. IO / Bank / 电平标准
  5. PLL / MMCM / BUFG
  6. DSP
  7. SERDES / DDR IO
  8. Hard IP / SoC / GT

这个顺序和大多数人的成长路线更一致:

  • 先会写基础 RTL
  • 再接触缓存和接口
  • 再碰时钟和时序
  • 最后再进入高速和系统级资源

总结

如果把这篇文章压缩成一句话,那就是:

FPGA 设计不是“写 Verilog”这么简单,而是把功能映射到合适的片上资源,并通过时钟、布线和约束把它稳定跑起来。

当你开始有意识地区分:

  • 这段逻辑更像消耗 LUT 还是 DSP
  • 这块缓存该放 BRAM 还是 LUT RAM
  • 这个接口主要依赖 IO 还是 SERDES
  • 这个时钟该用逻辑分频还是 PLL/MMCM

你就已经从“会写代码”往“会做 FPGA 系统”走了。

如果后面继续往 Linux + FPGA、图像处理、AI 加速、车载接口这些方向走,这张资源地图基本都会反复用到。


如果把这篇内容作为后续学习入口,我自己的建议是:

先把LUTFFBRAMDSPPLLIO Bank这几块吃透,后面再去看 GT、SERDES、硬核接口,会顺很多。