3. FPGA硬件架构基础:FPGA内部结构
各位同学,今天我们来聊聊FPGA的“五脏六腑”。
很多人觉得FPGA就是个“万能芯片”,什么都能干。其实没那么玄乎。说白了,FPGA就是一堆基本单元,通过可编程的连线连在一起。你想想看,这跟搭乐高有什么区别?
我刚开始接触FPGA时,总觉得内部结构很神秘。后来拆开一块Xilinx的芯片,用显微镜一看——嗯,其实就是个“积木盒子”。今天我就带大家把这个盒子拆开看看。
3.1 基本逻辑单元:LUT与FF
FPGA最核心的单元,就是查找表(LUT)和触发器(FF)。
LUT是什么?
说白了,LUT就是一个“查字典”的电路。你给它输入几个比特,它查一下表,输出对应的结果。比如一个4输入LUT,可以实现任意4输入逻辑函数。
我在项目中遇到过一个问题:用LUT实现一个复杂的加法器,结果资源爆了。后来改成用DSP,瞬间省了80%的LUT。所以啊,LUT不是万能的,要跟其他资源搭配使用。
FF又是什么?
触发器就是“记忆单元”。它能在时钟边沿锁存数据。没有FF,你就没法做流水线,没法做状态机。
我记得有一次调试一个高速接口,时序总是不满足。后来发现是FF的时钟偏斜太大。嗯,这里要注意:FF的时钟输入一定要走全局时钟网络,别走普通连线。
关键参数:
- LUT输入数:常见4输入、5输入、6输入
- FF类型:D触发器为主,部分支持JK、T触发器
- 每个Slice包含:4-8个LUT + 8-16个FF
3.2 存储资源:BRAM与URAM
FPGA里除了LUT和FF,还有专门的存储块。
BRAM(块RAM)
BRAM是FPGA的“小仓库”。每个BRAM通常18Kb或36Kb。你可以配置成单端口、双端口、甚至FIFO。
我个人习惯:小数据量用LUT做分布式RAM,大数据量用BRAM。比如一个256x32的FIFO,用BRAM比用LUT省10倍资源。
URAM(超RAM)
URAM是Xilinx高端芯片才有的“大仓库”。每个URAM有288Kb,是BRAM的8倍。适合做大缓存、大FIFO。
我在做大模型推理加速时,URAM简直是救星。一个Transformer层的权重缓存,用BRAM要几十个,用URAM只要几个。
| 存储类型 | 容量 | 延迟 | 适用场景 |
|---|---|---|---|
| LUT分布式RAM | 几十比特 | 1-2周期 | 小寄存器、状态机 |
| BRAM | 18Kb/36Kb | 2-3周期 | 中等缓存、FIFO |
| URAM | 288Kb | 3-4周期 | 大权重缓存、大FIFO |
避坑指南:我曾经把BRAM的读延迟设成1周期,结果时序跑不过。后来改成2周期,问题解决。记住:BRAM读延迟至少2周期,别贪快。
3.3 计算核心:DSP Slice
DSP是FPGA的“算力担当”。
每个DSP Slice包含一个乘法器、一个加法器、一个累加器。你可以用它做乘加运算、乘累加、甚至复数乘法。
为什么大模型推理离不开DSP?因为Transformer的核心就是矩阵乘法,而矩阵乘法就是一堆乘加运算。DSP正好干这个。
DSP的典型配置:
- 输入位宽:25x18(Xilinx)或 18x18(Intel)
- 支持流水线:最多3级流水
- 支持级联:多个DSP可以串起来做高精度运算
我记得有一次做BERT推理加速,需要做大量矩阵乘法。用LUT实现乘法器?太慢了。用DSP?一个时钟周期搞定。这就是DSP的价值。
注意:DSP的输入位宽有限制。比如Xilinx的DSP48E2,乘法器输入是27x18。如果你要算32位乘法,需要两个DSP级联。别硬塞,会出问题。
3.4 可编程互联
FPGA的“血管”就是可编程互联。
没有互联,LUT、FF、BRAM、DSP都是孤岛。互联把它们连成网络。
互联分为几种:
- 本地互联:同一个Slice内部的连线,延迟最小
- 全局互联:跨Slice、跨区域的连线,延迟较大
- 时钟网络:专门的时钟树,保证时钟偏斜最小
你想想看,为什么FPGA的布线工具跑那么慢?就是因为要算这些互联路径。我见过一个设计,逻辑只用了30%,但布线用了90%的资源。这就是互联瓶颈。
经验之谈:设计时尽量让相关逻辑放在同一个区域。比如一个矩阵乘法的所有DSP,尽量放在相邻的列。这样互联短,时序好。
3.5 片上存储层次
FPGA的存储层次,跟CPU的缓存层次很像。
层次结构:
- L1:FF(触发器),延迟1周期,容量最小
- L2:LUT分布式RAM,延迟1-2周期,容量几十比特
- L3:BRAM,延迟2-3周期,容量几十Kb
- L4:URAM,延迟3-4周期,容量几百Kb
- L5:HBM(高端芯片),延迟几十周期,容量几GB
为什么要有这么多层次?因为速度与容量不可兼得。FF最快但最小,HBM最大但最慢。
我在做大模型推理时,会把最常用的权重放在BRAM,次常用的放在URAM,不常用的放在DDR。这叫“数据局部性优化”。
小技巧:如果你发现BRAM不够用,试试把一些只读数据放到LUT分布式RAM里。虽然容量小,但速度快。我曾经用这个方法省了30%的BRAM。
3.6 知识体系总览
下面这张图,是我自己画的FPGA内部结构总览。你看一眼,就能明白各个模块的关系。
这张图里,每个模块都是FPGA的“器官”。可编程互联是“血管”,时钟网络是“心跳”。理解了这些,你就能明白FPGA为什么能加速大模型推理。
好了,这一章就到这里。记住:FPGA不是黑盒子,它是一堆可以自由组合的积木。你用得越熟,设计就越顺手。