FPGA 与 CGRA 可重构架构
CPU 是通用处理器——写 C 代码,编译成指令,CPU 逐条执行。ASIC 是专用芯片——电路硬化,速度最快但不可修改。FPGA(Field-Programmable Gate Array,现场可编程门阵列)位于两者之间:硬件电路可重构,但不需要流片。
FPGA 的核心思想是:用可编程的「积木」搭建任意数字电路。你不需要去台积电流片,只需要下载一个配置文件,FPGA 就能变成任意逻辑功能。
• CPU:时间复用——一套硬件,按时间片执行不同指令
• ASIC:空间固化——一套电路,永久执行固定功能
• FPGA:空间重构——一套可编程电路,通过配置改变功能
FPGA 由三种基本资源组成:
1. LUT(Look-Up Table,查找表)
LUT 是 FPGA 的逻辑基础。一个 N 输入 LUT 可以看作一个 $2^N \times 1$ 的 SRAM,存储了 N 输入布尔函数的完整真值表。通过配置 SRAM 的内容,同一个 LUT 可以实现任意 N 输入逻辑函数。
例如,4 输入 LUT(4-LUT)有 $2^4 = 16$ 个配置位,可以实现 $2^{16}$ 种不同的 4 输入逻辑函数(与、或、非、异或、任意组合)。现代 FPGA 主流使用 6-LUT(64 个配置位)。
2. CLB(Configurable Logic Block,可配置逻辑块)
CLB 是 FPGA 的基本计算单元,通常包含:
- 2-4 个 LUT
- 触发器(Flip-Flop,用于时序逻辑)
- 进位链(Carry Chain,用于快速算术运算)
- 多路选择器(MUX)
Xilinx 的 CLB 叫 Slice,Intel/Altera 的 CLB 叫 LAB(Logic Array Block)。
3. 互连资源(Interconnect)
CLB 之间通过可编程的互连网络连接。互连由导线段和可编程开关(Switch Box)组成,通过配置决定信号从哪个 CLB 的哪个输出连接到哪个 CLB 的哪个输入。互连资源占 FPGA 芯片面积的 60-80%。
4. I/O 块与专用硬核
芯片边缘的 I/O 块支持多种电平标准(LVDS、SSTL 等)。此外,现代 FPGA 还集成了:
- BRAM:块 RAM,用于片上存储
- DSP Slice:专用乘法器/累加器,用于数字信号处理
- PLL/DLL:时钟管理
- 高速收发器:PCIe、以太网、SerDes
- 处理器硬核:如 Xilinx Zynq 集成的 ARM Cortex-A9
FPGA 的编程语言是硬件描述语言(HDL),如 Verilog 或 VHDL。与 C 代码最大的区别是:C 描述的是「按时间顺序执行的操作」,HDL 描述的是「电路的结构和连接」。
// C 代码:顺序执行
int a = b + c;
int d = a * e; // 必须等上一行完成
// Verilog:并行电路
wire a = b + c; // 加法器电路
wire d = a * e; // 乘法器电路,与加法器同时存在
// 不是先加后乘,而是两个电路并行工作
C 代码经过编译器翻译成 CPU 指令序列,在时间上串行执行。Verilog 经过综合工具翻译成门级网表,再映射到 FPGA 的 LUT 和互连资源上——最终产物是配置比特流(Bitstream)。
比特流是一个巨大的二进制文件(数 MB 到数十 MB),每一位控制 FPGA 内部的一个可配置点:
• LUT 的 SRAM 内容(决定实现什么逻辑函数)
• 互连开关的状态(决定信号走哪条路径)
• I/O 块的电气参数(驱动强度、电平标准)
• 触发器的初始值
上电时,FPGA 从 Flash 或外部处理器加载比特流,整个芯片就「变成」了你所描述的电路。
时序约束是 FPGA 设计的核心挑战。FPGA 电路在时钟边沿同步工作,信号从触发器出发,经过 LUT 和互连,必须在下一个时钟边沿之前到达目标触发器。这个最大允许延迟叫做建立时间(Setup Time)约束。
如果逻辑路径太长(经过太多级 LUT 或长距离互连),信号传播延迟超过时钟周期,就会出现时序违例(Timing Violation),导致电路工作不稳定。
| 维度 | CPU | FPGA | ASIC |
|---|---|---|---|
| 灵活性 | 极高(软件定义) | 中(可重构) | 无(固定电路) |
| 性能 | 通用,非最优 | 专用场景接近 ASIC | 最优 |
| 功耗 | 高(通用冗余) | 中(无指令开销) | 最低 |
| 开发成本 | 低 | 中 | 极高(流片百万刀) |
| 上市时间 | 即时 | 数周-数月 | 1-2 年 |
| 单位成本 | 低 | 中-高 | 极低(量产后) |
FPGA 的「甜点区」是:需要定制硬件加速、但产量不足以支撑 ASIC 流片成本的场景。例如: • 数据中心网络加速(SmartNIC) • 5G 基站信号处理 • AI 推理原型验证 • 航空航天和国防(小批量、高可靠)
CGRA(Coarse-Grained Reconfigurable Array,粗粒度可重构阵列)是 FPGA 的「进化版」——把细粒度的 LUT 换成粗粒度的 ALU/PE。
传统 FPGA 的可重构粒度是「门级」(LUT 实现任意布尔函数),而 CGRA 的可重构粒度是「算子级」(ALU 支持加、减、乘、移位、比较等固定操作)。
• 面积效率:CGRA 的 ALU 比 LUT+互连紧凑得多,面积效率高 10-100 倍
• 编译效率:CGRA 的映射和布线简单得多,编译时间从 FPGA 的数小时缩短到数分钟
• 灵活性:CGRA 只能做算术和逻辑运算,不能做任意电路
• 能效:CGRA 的控制开销远低于 FPGA,能效接近 ASIC
CGRA 的典型架构:一个二维 PE 阵列,每个 PE 包含一个 ALU、几个寄存器、本地存储器。PE 之间通过可配置的路由网络连接。数据从阵列边缘流入,在 PE 之间流动计算,结果从边缘流出——数据流执行模型。
代表性 CGRA: • ADRES(IMEC) • MorphoSys(UCI) • HyCUBE(IIT Madras) • SambaNova RDU(商用 AI 加速器)
- FPGA 的 LUT 用 SRAM 存储真值表,为什么不用组合逻辑直接实现函数?SRAM 方案有什么优势?
- 时序约束中的「建立时间」和「保持时间」分别是什么含义?为什么 FPGA 设计需要同时满足两者?
- 假设你要为一个新发明的神经网络结构设计推理加速器,在 FPGA、CGRA 和 ASIC 之间如何选择?需要考虑哪些因素?
- 现代 FPGA(如 Xilinx Versal、Intel Agilex)集成了 AI Engine/DSP 硬核。这是向 ASIC 靠拢,还是 FPGA 保持可重构性的必然进化?