第1章:Lattice FPGA架构基础

大家好,我是你们的FPGA逆向讲师。今天咱们聊聊Lattice FPGA的架构基础。说实话,Lattice这个厂商在逆向圈子里地位很特殊——它不像Xilinx那样复杂到让人头秃,也不像Altera那样文档满天飞。它属于那种「麻雀虽小五脏俱全」的类型,特别适合作为逆向入门的靶子。

我个人最早接触Lattice是在一个工业控制项目里。当时客户要求低功耗、小封装,我第一反应就是ECP5。后来做逆向分析时发现,Lattice的架构设计其实很有章法,摸透了之后再看其他家的FPGA,很多思路都是相通的。

1.1 Lattice ECP5/ICE40系列架构详解

1.1.1 两个系列,两种性格

Lattice目前主流的两个系列——ECP5和ICE40,定位完全不同。

特性 ECP5 ICE40
工艺节点 40nm 40nm
逻辑单元数 12K-85K 1K-8K
DSP资源 有(18x18乘法器) 无(或极少)
BRAM 最大3.8Mb 最大128Kb
典型应用 通信、视频、工业 IoT、可穿戴、消费
封装 BGA为主 QFN/WLCSP

ECP5是Lattice的中高端系列。我拆过不少通信板卡,里面ECP5出现的频率相当高。它内置了DSP块和PLL,做视频处理或者协议桥接很顺手。ICE40则是极致低功耗的代表,静态功耗可以做到微瓦级别。我记得有个可穿戴项目,电池只有50mAh,愣是用ICE40跑了个简单的传感器融合算法。

逆向工程师的视角:ECP5的配置位流(bitstream)比ICE40复杂得多。如果你刚开始做Lattice逆向,我建议先从ICE40入手。它的配置帧结构更简单,位流解析起来没那么痛苦。

1.1.2 芯片内部长什么样?

咱们来看看Lattice FPGA的内部结构。说白了,就是三大部分:逻辑资源、互连资源、I/O资源。再加上一些硬核IP(PLL、BRAM、DSP)。

下面这张图是我自己画的ECP5架构概览,你可以把它当作逆向分析的「地图」:

ECP5 FPGA 内部架构概览 I/O 环 (PIO) 逻辑阵列 (Logic Array) LC LC LC LC LC LC LC LC LC 可编程互连资源 (PIR) - 水平/垂直布线通道 BRAM DSP PLL 配置逻辑 逻辑单元(LC) 互连资源 BRAM DSP PLL 配置逻辑

你看,最外面一圈是I/O环,里面整整齐齐排着逻辑单元阵列。每个小方块就是一个逻辑单元(LC),它们之间通过可编程互连资源连接。BRAM和DSP块分布在阵列的特定位置——这个位置信息在做逆向时特别重要,因为位流中这些硬核的配置数据位置是固定的。

1.2 逻辑单元(LC)与查找表(LUT)

1.2.1 逻辑单元到底是个啥?

逻辑单元(Logic Cell,简称LC)是FPGA最基础的计算单元。你可以把它理解成一个「万能小盒子」——给它输入,它就能输出你想要的结果。

一个典型的Lattice LC包含以下部件:

  • 查找表(LUT):通常是4输入或5输入,实现组合逻辑
  • 触发器(FF):用于存储状态,实现时序逻辑
  • 进位链(Carry Chain):用于算术运算
  • 多路选择器(MUX):用于信号选择

实战小技巧:在做逆向时,我习惯先定位LUT的配置位。因为LUT本质上就是一个SRAM查找表,它的配置位在bitstream中通常是连续排列的。找到LUT的配置模式,就等于找到了整个逻辑单元的「命门」。

1.2.2 查找表(LUT)的工作原理

LUT说白了就是一个「查字典」的过程。比如一个4输入LUT,它有16种输入组合(2^4=16)。每种组合对应一个输出值,这些输出值就存在LUT的SRAM单元里。

举个例子,你想实现一个2输入与门(AND gate):

// 2输入与门的真值表
输入A | 输入B | 输出Y
  0   |   0   |   0
  0   |   1   |   0
  1   |   0   |   0
  1   |   1   |   1

// 对应的LUT配置值(4位)
// 按输入组合(AB)从0到3排列
LUT_CONFIG = 4'b1000  // 只有最后一种组合输出1

在Lattice的ECP5中,每个LC包含一个4输入LUT和一个可选的触发器。ICE40则更灵活,有些型号支持5输入LUT。你想想看,5输入LUT意味着32种组合,能实现的逻辑功能就更复杂了。

逆向要点:LUT的配置位在bitstream中是以「帧」为单位组织的。ECP5的每一帧包含一定数量的配置位,这些位按顺序对应到每个LC的LUT内容。我曾经花了两周时间才把ECP5的帧结构完全摸透——嗯,那段时间真是痛并快乐着。

1.2.3 触发器和进位链

触发器(Flip-Flop)是LC里的时序元件。Lattice的LC通常包含一个D触发器,可以配置为上升沿触发或下降沿触发,还可以选择是否带复位/置位。

进位链则是专门为加法器设计的。ECP5的进位链是快速进位链,延迟很小。我记得有一次做逆向分析,发现一个芯片里大量使用了进位链来实现比较器——这其实是一种常见的面积换速度的技巧。

1.3 可编程互连资源(PIR)

1.3.1 互连资源的层次结构

可编程互连资源(Programmable Interconnect Resource,PIR)是FPGA的「血管系统」。没有它,逻辑单元就是一座座孤岛。

Lattice的互连资源分为几个层次:

  1. 局部互连:同一个逻辑块(Slice)内部的连接
  2. 全局互连:跨逻辑块的水平和垂直布线通道
  3. 全局时钟网络:专用的低抖动时钟布线
  4. I/O互连:连接I/O引脚和内部逻辑

我个人觉得,互连资源是逆向分析中最头疼的部分。为什么?因为它的配置位太分散了。一个信号从A点走到B点,中间可能经过好几个开关矩阵(Switch Matrix),每个矩阵的配置位都在bitstream的不同位置。

避坑指南:我曾经在分析一个ICE40的位流时,花了大量时间在互连配置上。后来发现,Lattice的互连配置其实有规律可循——每个开关矩阵的配置位是按「行」组织的。先找到行边界,再分析列,效率会高很多。

1.3.2 布线资源类型

Lattice的布线资源主要有这么几种:

类型 长度 用途
直连线 1个逻辑块 相邻单元连接
短线 2-4个逻辑块 局部信号传输
长线 整行/整列 全局信号、时钟
全局线 全芯片 时钟、复位

做逆向时,我建议你先关注长线和全局线。因为关键信号(时钟、复位、使能)通常走这些资源,找到它们就能快速定位芯片的核心功能模块。

1.4 I/O结构与配置

1.4.1 I/O单元的内部结构

Lattice的I/O单元(PIO)比你想的要复杂。每个I/O引脚背后都有一个完整的I/O单元,包含:

  • 输入路径:包含施密特触发器、延迟单元
  • 输出路径:包含输出驱动、 slew rate控制
  • 双向控制:三态缓冲器
  • I/O逻辑:DDR寄存器、串并转换

ECP5的I/O支持多种电平标准:LVCMOS、LVDS、HSTL、SSTL等。ICE40则相对简单,主要是LVCMOS和LVDS。

1.4.2 I/O配置的逆向要点

I/O配置在bitstream中通常位于固定位置。每个I/O bank有独立的配置区域。我记得有一次逆向一个ECP5的通信板卡,通过分析I/O配置位,我直接推断出了板卡上DDR3存储器的接口时序——因为I/O延迟配置暴露了走线长度信息。

实战经验:如果你拿到一个未知的Lattice bitstream,我建议你先分析I/O配置。因为I/O配置的格式相对固定,而且通常位于bitstream的头部。搞定了I/O,你就知道芯片在跟外部世界怎么打交道,剩下的内部逻辑分析就有了方向。

1.5 本章小结

好了,这一章的内容就到这里。咱们把Lattice FPGA的架构骨架搭起来了:从ECP5和ICE40的定位差异,到逻辑单元的内部构造,再到互连资源和I/O结构。这些知识是后续逆向分析的基础。

我个人觉得,学FPGA逆向就像搭积木——先搞清楚每一块积木长什么样,再研究它们怎么拼在一起。下一章咱们会深入bitstream的配置机制,那才是真正「动手」的开始。

记住我这句话:架构理解得越深,逆向时走的弯路就越少。


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