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分成三类用途:

  1. 数据缓存:FIFO、双端口RAM
  2. 查找表扩展:大容量LUT用BRAM实现
  3. 配置存储:存系数、权重、密钥

我曾经逆向过一个图像处理芯片,发现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的,掉电就丢配置。所以每次上电都要重新加载比特流。

配置流程大概是这样的:

  1. 上电复位
  2. 检测配置模式(主/从/串/并)
  3. 加载配置数据
  4. CRC校验
  5. 启动序列
  6. 进入用户模式

我记得有一次,客户说芯片上电后不工作。我一看,配置模式引脚被拉到了错误电平,导致FPGA在等外部配置,而实际上用的是SPI Flash。这种低级错误,排查起来真要命。

比特流:FPGA的"灵魂"

比特流就是FPGA的配置文件。它包含了:

  • LUT的配置值
  • FF的初始状态
  • BRAM的初始化数据
  • DSP的配置参数
  • IO的配置信息
  • 布线信息

逆向比特流,说白了就是从这些二进制数据里还原出电路结构。这活儿不容易,但也不是不可能。

核心思路:比特流里的每一位,都对应着FPGA内部某个配置点。知道映射关系,就能还原电路。

我给大家画个图,看看FPGA内部结构的关系:

FPGA内部结构关系图 比特流(配置文件) 配置引擎(加载解析) 逻辑资源 LUT + 触发器 存储资源 BRAM(36Kb) 运算资源 DSP Slice IO接口(与外界通信)

这张图很清楚地展示了:比特流 -> 配置引擎 -> 可配置资源 -> IO 的层级关系。逆向的时候,我们就是从最上层的比特流,一步步往下挖。

避坑指南

做FPGA逆向这些年,我踩过不少坑。分享几个:

我曾经花了两周时间分析一个比特流,结果发现读错了字节序。Xilinx的比特流是大端,Altera的是小端,搞混了全白干。

注意:不同厂家的FPGA,内部结构差异很大。Xilinx的CLB和Altera的LAB,虽然都是逻辑块,但内部排列完全不同。逆向前,先搞清楚芯片型号。

还有一个常见的坑:BRAM的初始化数据。有些设计会把密钥藏在BRAM的初始化值里,但比特流里BRAM数据是压缩存储的。直接搜字符串?找不到的。

嗯,今天就先聊到这儿。这些基础知识,是后面信号定位的基石。你把这些搞明白了,后面的内容就顺了。


公众号:蓝海资料掘金营,微信deep3321