FPGA架构基础:查找表(LUT)、触发器(FF)、块RAM(BRAM)、DSP切片、可编程互连资源
各位同学,今天我们来聊聊FPGA的“五脏六腑”。做芯片逆向,不懂FPGA内部长什么样,那基本等于盲人摸象。我刚开始接触逆向时,拿到一块芯片,对着显微镜看了半天,愣是分不清哪块是逻辑,哪块是内存。后来被前辈点醒——你得先知道FPGA是怎么设计的,才能看懂它怎么被造出来的。
FPGA说白了就是一块“万能积木”。你给它一堆配置数据(比特流),它就能变成CPU、GPU、甚至是个加密芯片。那它到底由什么组成?我习惯把FPGA架构拆成五个核心部件:查找表(LUT)、触发器(FF)、块RAM(BRAM)、DSP切片、可编程互连资源。咱们一个一个来。
1. 查找表(LUT)—— 逻辑的灵魂
查找表,英文叫Look-Up Table,简称LUT。这是FPGA里最基础的逻辑单元。你想想看,任何数字电路,不管是与门、或门、还是复杂的加法器,本质上都可以用真值表来描述。LUT就是把这个真值表直接“存”在芯片里。
一个典型的6输入LUT,内部有64个SRAM位(2^6=64)。你输入6个信号,它根据这64个位里存的值,直接输出结果。没有门电路延迟,没有组合逻辑竞争,就是查表——快、准、狠。
核心要点:LUT本质上是一个小型的RAM。比特流里配置的就是这些RAM单元的值。逆向时,你只要读出了LUT的配置值,就等于知道了这个逻辑块在干什么。
我在项目中遇到过一块被加密的FPGA,对方把LUT配置打乱了。我花了三天时间,硬是把每个LUT的输入输出关系反推出来,最后还原了整个逻辑。嗯,那感觉就像拼完了一万块的拼图。
2. 触发器(FF)—— 时序的基石
光有LUT只能做组合逻辑,要做出时序电路(比如计数器、状态机),就得靠触发器。FPGA里的触发器通常是D触发器,带有时钟、复位、使能这些控制端。
每个LUT后面通常紧跟着一个触发器,它们俩组成一个“逻辑单元”(Logic Cell,也叫Slice)。LUT负责算,FF负责存。你想想看,一个状态机,当前状态存在FF里,下一状态由LUT计算,时钟一来,状态更新——这就是数字系统的节拍。
我建议你在逆向时,重点关注FF的复位方式和时钟来源。我曾经遇到一个案例,对方用异步复位做了一个“隐藏状态”,只有在特定时钟沿才能触发。如果不看FF的复位配置,你根本发现不了这个后门。
避坑指南:我曾经在分析某款国产FPGA时,发现它的FF默认是同步复位,但文档里写的是异步。后来查比特流才发现,厂商把复位极性反接了。所以,别信文档,信比特流。
3. 块RAM(BRAM)—— 数据的仓库
LUT和FF能做的存储很有限(一个LUT才64位)。要存大量数据,比如图像帧、网络包、查找表,就得用块RAM。BRAM是FPGA里专用的硬核内存块,容量通常是18Kb或36Kb(不同厂商略有差异)。
BRAM可以配置成单端口、双端口、甚至伪双端口。双端口意味着你可以同时读写,这在做数据缓冲时非常有用。我习惯把BRAM比作“仓库”——LUT是车间,FF是工位上的临时储物盒,BRAM才是真正的货架。
| 特性 | LUT | FF | BRAM |
|---|---|---|---|
| 存储容量 | 64位(6输入) | 1位 | 18Kb~36Kb |
| 访问速度 | 极快(组合逻辑) | 快(时序逻辑) | 较快(有固定延迟) |
| 主要用途 | 逻辑运算 | 状态存储 | 数据缓存 |
| 逆向难度 | 中等(需反推真值表) | 低(看复位和时钟) | 高(需分析地址和数据) |
逆向BRAM是最头疼的。因为BRAM里的数据是连续的,不像LUT那样有明确的输入输出关系。我一般会先看BRAM的地址线连接,再结合周围逻辑推断它存的是什么。比如连到以太网MAC的,大概率是FIFO;连到视频接口的,很可能是行缓冲。
4. DSP切片—— 数学加速器
做数字信号处理(比如滤波、FFT、卷积),用LUT搭乘法器太浪费了。一个32位乘法器要上千个LUT,而且跑不快。所以FPGA里集成了专用的DSP切片,里面包含硬件乘法器、加法器、累加器。
DSP切片通常可以配置成多种模式:乘法、乘加、乘累加、甚至复数乘法。我见过最夸张的案例,有人用DSP切片做了一个完整的RISC-V CPU的ALU,比用LUT搭的快了3倍。
逆向DSP切片时,要特别注意它的级联连接。很多DSP切片可以首尾相连,形成长链做FIR滤波器。如果你看到一串DSP切片连在一起,十有八九是在做数字滤波。
注意:DSP切片有固定的位宽限制(通常是18x18或27x27)。如果设计里用了超过这个位宽的乘法,编译器会自动拆成多个DSP切片加LUT组合。逆向时看到多个DSP切片配合LUT,别慌,大概率是高位宽乘法。
5. 可编程互连资源—— 血管和神经
有了LUT、FF、BRAM、DSP这些“器官”,还得有“血管”把它们连起来。这就是可编程互连资源。FPGA里布满了纵横交错的金属线和可编程开关点(也叫Switch Box或Routing Matrix)。
比特流里很大一部分内容就是配置这些开关的。哪个LUT的输出连到哪个BRAM的地址线,哪个FF的时钟接哪个全局时钟网络——全由这些开关决定。我做过统计,一个中等规模的FPGA,互连配置占了比特流的60%以上。
逆向互连是最考验耐心的。因为开关点太多了,而且很多是冗余的。我习惯先找出关键信号(时钟、复位、使能),再顺着它们追踪数据路径。就像破案一样,先找主线,再理支线。
说白了,FPGA架构就是这五样东西的组合。LUT算、FF存、BRAM缓存、DSP加速、互连连起来。你掌握了这五个核心,再看比特流,就不再是一堆乱码,而是一张清晰的电路蓝图。
下面这张图是我自己画的FPGA架构概览,帮你把今天讲的内容串起来。
嗯,今天的内容就到这。这五个部件是FPGA的基石,也是你逆向比特流的切入点。下次拿到一块芯片,先别急着上显微镜,想想它的LUT怎么配、FF怎么连、BRAM怎么用——思路就清晰了。