FPGA基础回顾:内部结构与配置原理
做逆向工程这么多年,我越来越觉得一个道理:不懂FPGA内部结构,就别谈逆向。你想想看,连芯片里有什么都不知道,怎么去定位信号?怎么去分析逻辑?
这一节,我带大家把FPGA的底裤扒一扒。咱们不讲那些花里胡哨的,就讲逆向工程真正需要的东西。
FPGA的核心:LUT与FF
FPGA最基础的两个元件,就是查找表(LUT)和触发器(FF)。说白了,LUT负责算,FF负责存。
查找表(LUT)
LUT本质上是一个小型的RAM。比如4输入LUT,就是16×1的RAM。你给它4个输入,它查一下表,输出一个结果。
我在项目中遇到过一件事:有一次分析一个加密芯片,发现某个LUT的配置值很奇怪,不是标准的逻辑函数。后来才发现,人家把LUT当ROM用了,存的是密钥的一部分。嗯,这种骚操作在逆向里很常见。
关键点:LUT的配置值决定了它的逻辑功能。逆向时,读出这些配置值,就能还原出原始的逻辑表达式。
常见的LUT类型:
- 4输入LUT(Xilinx早期器件)
- 5输入LUT(Xilinx Spartan-6等)
- 6输入LUT(Xilinx 7系列及以后)
- 自适应LUT(可拆分为两个小LUT)
触发器(FF)
触发器就简单了,它就是个1位的寄存器。时钟上升沿来的时候,把输入锁存到输出。
但要注意,FF有很多种配置:
- 是否带复位(同步/异步)
- 复位电平(高/低)
- 时钟极性(上升/下降沿)
- 是否使能
我的经验:逆向时,FF的复位配置能告诉你很多信息。比如异步复位通常用于关键状态机,同步复位则常见于普通数据路径。
BRAM:FPGA的"内存条"
BRAM(块RAM)是FPGA里的大容量存储。每个BRAM通常是36Kb,可以配置成各种模式。
我个人习惯把BRAM分成三类用途:
- 数据缓存:FIFO、双端口RAM
- 查找表扩展:大容量LUT用BRAM实现
- 配置存储:存系数、权重、密钥
我曾经逆向过一个图像处理芯片,发现BRAM的配置模式是"真双端口",而且两个端口的位宽不一样。后来分析出来,这是一个色彩空间转换的查找表。你看,BRAM的配置模式直接暴露了它的用途。
| 配置模式 | 位宽 | 深度 | 常见用途 |
|---|---|---|---|
| 单端口 | 1-36位 | 1024-32768 | 普通存储 |
| 简单双端口 | 1-36位 | 1024-32768 | FIFO |
| 真双端口 | 1-36位 | 1024-32768 | 视频处理、查找表 |
| ROM模式 | 1-36位 | 1024-32768 | 系数存储、微码 |
DSP:数字信号处理的"加速器"
DSP Slice是FPGA里的硬核乘法器。Xilinx的DSP48E1(7系列)可以完成:
- 25×18位乘法
- 48位累加
- 乘加运算(MACC)
- 逻辑运算
逆向DSP的时候,我最关注的是它的级联模式。为什么?因为DSP级联起来就是滤波器、FFT这些复杂运算。你看到一串DSP串在一起,基本可以断定这是数字信号处理。
注意:有些设计会把DSP当普通逻辑用,比如用乘法器做地址计算。别一看到DSP就以为是滤波器,先看看它的输入输出连到哪里。
IO:芯片的"嘴巴"
IO(输入输出)是FPGA和外界通信的接口。每个IO Bank有独立的电压域,支持多种电平标准。
常见的IO标准:
- LVCMOS(3.3V/2.5V/1.8V)
- LVDS(差分信号)
- SSTL(DDR内存接口)
- HSTL(高速存储接口)
逆向时,IO的配置能告诉你很多:
- 上拉/下拉电阻:有没有外部驱动
- 驱动强度:信号速率有多高
- 延迟调整:是不是高速接口
- ODT(片上端接):是不是DDR接口
配置原理:FPGA怎么"活"起来
FPGA是SRAM-based的,掉电就丢配置。所以每次上电都要重新加载比特流。
配置流程大概是这样的:
- 上电复位
- 检测配置模式(主/从/串/并)
- 加载配置数据
- CRC校验
- 启动序列
- 进入用户模式
我记得有一次,客户说芯片上电后不工作。我一看,配置模式引脚被拉到了错误电平,导致FPGA在等外部配置,而实际上用的是SPI Flash。这种低级错误,排查起来真要命。
比特流:FPGA的"灵魂"
比特流就是FPGA的配置文件。它包含了:
- LUT的配置值
- FF的初始状态
- BRAM的初始化数据
- DSP的配置参数
- IO的配置信息
- 布线信息
逆向比特流,说白了就是从这些二进制数据里还原出电路结构。这活儿不容易,但也不是不可能。
核心思路:比特流里的每一位,都对应着FPGA内部某个配置点。知道映射关系,就能还原电路。
我给大家画个图,看看FPGA内部结构的关系:
这张图很清楚地展示了:比特流 -> 配置引擎 -> 可配置资源 -> IO 的层级关系。逆向的时候,我们就是从最上层的比特流,一步步往下挖。
避坑指南
做FPGA逆向这些年,我踩过不少坑。分享几个:
我曾经花了两周时间分析一个比特流,结果发现读错了字节序。Xilinx的比特流是大端,Altera的是小端,搞混了全白干。
注意:不同厂家的FPGA,内部结构差异很大。Xilinx的CLB和Altera的LAB,虽然都是逻辑块,但内部排列完全不同。逆向前,先搞清楚芯片型号。
还有一个常见的坑:BRAM的初始化数据。有些设计会把密钥藏在BRAM的初始化值里,但比特流里BRAM数据是压缩存储的。直接搜字符串?找不到的。
嗯,今天就先聊到这儿。这些基础知识,是后面信号定位的基石。你把这些搞明白了,后面的内容就顺了。
公众号:蓝海资料掘金营,微信deep3321