2. FPGA配置基础
FPGA作为可重构逻辑器件,其核心价值在于“软硬件可编程”。但FPGA内部基于SRAM的查找表(LUT)与开关矩阵在断电后数据即丢失,因此每次上电后必须从外部非易失存储介质(如Flash、EEPROM、SD卡)或由主控处理器(如CPU、MCU、DSP)将比特流(Bitstream)载入芯片内部,这一过程称为FPGA配置(Configuration)。配置的可靠性直接决定了固件升级的成败——若配置时序不满足、配置链设计不当或回退机制缺失,轻则导致系统启动失败,重则造成现场设备“变砖”。本章将系统梳理FPGA配置的底层原理、主流模式、配置链拓扑与时序约束,为后续章节的远程升级方案设计奠定基础。
2.1 FPGA配置原理:SRAM架构与比特流加载
核心原理:绝大多数FPGA(如Xilinx 7系列、Intel Cyclone 10、Lattice ECP5)采用SRAM工艺实现可编程逻辑。芯片内部包含大量配置存储单元(Configuration Cells),这些单元控制着LUT的真值表、布线开关、IOB(输入输出块)功能以及DSP/BRAM的工作模式。由于SRAM是易失性存储,每次上电后配置单元内容为随机值,必须由外部源将比特流文件写入。比特流不仅包含逻辑功能定义,还包含器件ID校验码、配置命令、CRC校验值以及用户自定义数据。配置完成后,FPGA释放DONE信号(拉高),表示进入用户工作模式。
配置数据通路:比特流数据通过专用配置引脚进入FPGA内部配置逻辑。以Xilinx 7系列为例,配置引脚包括:DONE(配置完成指示)、INIT_B(初始化状态/错误指示)、PROGRAM_B(重配置触发)、CCLK(配置时钟,主动模式下由FPGA输出,被动模式下由外部输入)、D[0:31](并行数据总线)或DIN(串行数据线)。配置逻辑内部包含帧缓冲、解压引擎(支持压缩比特流)、CRC校验模块和状态机。配置过程分为四个阶段:清空(Clean)→初始化(Initialize)→加载(Load)→启动(Start-up)。在清空阶段,FPGA拉低DONE并复位所有配置单元;初始化阶段读取器件ID并准备接收数据;加载阶段逐帧写入配置数据;启动阶段释放DONE并激活IO。
2.2 配置模式分类:主动/被动与串行/并行
FPGA配置模式可从两个维度划分:时钟与数据源归属(主动/被动)和数据位宽(串行/并行)。实际工程中常组合使用,形成SPI Master、BPI Master、SelectMAP Slave、SPI Slave等具体模式。
| 模式 | 时钟来源 | 数据位宽 | 典型应用场景 | 优点 | 缺点 |
|---|---|---|---|---|---|
| 主动串行 (Master SPI) | FPGA产生CCLK | 1 bit | 单板独立启动,SPI Flash存储 | 电路简单,无需外部控制器 | 配置速度受限于SPI Flash读取速率 |
| 主动并行 (Master BPI) | FPGA产生CCLK | 8/16 bit | 大容量配置,NOR Flash并行接口 | 速度快,适合大比特流 | 引脚占用多,PCB布线复杂 |
| 被动串行 (Slave SPI) | 外部主控提供时钟 | 1 bit | CPU通过SPI控制器加载 | 便于远程升级,主控可管理多片FPGA | 依赖主控软件时序 |
| 被动并行 (Slave SelectMAP) | 外部主控提供时钟 | 8/16/32 bit | 高速配置,主控为CPU/CPLD | 配置速度最快 | 引脚多,时序要求严格 |
| JTAG模式 | 外部TCLK | 1 bit | 调试、下载、在线更新 | 通用性强,支持回读和边界扫描 | 速度慢,不适合生产批量加载 |
主动模式(Master)下,FPGA自身产生配置时钟并控制整个加载流程,外部仅需提供非易失存储器件。该模式适合无主控处理器的独立系统,但远程升级时需额外设计Flash分区管理逻辑。被动模式(Slave)下,外部主控(CPU/MCU/CPLD)充当配置主机,FPGA作为从设备被动接收数据和时钟。该模式天然适合远程升级场景——主控可从网络或SD卡获取新比特流,先写入临时存储区,再通过被动模式加载FPGA,实现“先备份、后升级、失败回退”的可靠流程。
2.3 配置链设计:多片FPGA级联与地址映射
在复杂系统中(如通信基站、视频处理板卡),单板常集成多片FPGA。配置链(Daisy Chain)允许将多片FPGA串联,共享同一配置源,减少存储器件和主控接口数量。配置链分为串行链和并行链两种拓扑。
串行配置链:第一片FPGA的DOUT引脚连接第二片FPGA的DIN引脚,依此类推。配置数据从主控或Flash流入第一片,第一片接收自身所需数据后,将后续数据透传给下一片。每片FPGA在配置完成后自动进入“透传模式”。该方式仅需一条数据线,但配置总时间等于所有FPGA配置时间之和,且链路中任意一片故障会导致后续芯片无法配置。
并行配置链(SelectMAP链):所有FPGA共享数据总线(D[7:0]或D[15:0])和时钟,但通过各自的CS_B(片选)信号分时接收数据。主控依次拉低各片的CS_B,逐片写入比特流。该方式配置速度快,但需要更多控制引脚。实际工程中,常采用“地址自动递增”方式:主控先发送配置链中FPGA的数量,然后按顺序写入,每片FPGA在接收完自身数据后自动释放总线。
- DONE信号级联:所有FPGA的DONE信号应通过“线与”逻辑连接,只有全部芯片配置完成,系统才允许启动用户逻辑。
- INIT_B监控:配置链中任一芯片CRC错误或初始化失败,会拉低INIT_B,主控需检测该信号并触发重配置或告警。
- 时钟完整性:配置链中CCLK走线应等长,避免因时钟偏斜导致数据采样错误。
- 回退策略:多片FPGA系统中,建议为每片FPGA保留独立的备份存储区,避免因一片升级失败影响整链。
2.4 配置时序详解:上电、复位与DONE握手
配置时序是FPGA固件升级中最容易出错的环节。以Xilinx 7系列SPI Master模式为例,完整时序如下:
上电 → VCCINT/VCCAUX/VCCIO 达到阈值 → POR释放 → PROGRAM_B拉高
→ INIT_B拉高(表示初始化完成) → FPGA输出CCLK(默认25MHz)
→ 发送读命令(0x03) + 24位地址 → Flash返回数据
→ FPGA逐帧加载 → 内部CRC校验 → DONE拉高 → 启动用户IO
→ 若CRC错误:INIT_B拉低 → 主控检测到错误 → 重新触发PROGRAM_B
关键时序参数:
- 上电延迟:所有电源轨达到最小工作电压后,需等待至少
t_POR(通常为10ms~50ms)才能释放PROGRAM_B。 - INIT_B拉高时间:PROGRAM_B释放后,FPGA内部清空配置单元,INIT_B在
t_INIT(典型100ms)内拉高,表示可以开始接收数据。 - CCLK建立时间:主动模式下,FPGA在INIT_B拉高后自动输出CCLK,外部Flash需在时钟上升沿前建立数据(
t_SU≥ 5ns)。 - DONE释放:配置数据全部写入且CRC校验通过后,DONE信号拉高。若配置失败,DONE保持低电平,INIT_B拉低。
2.5 案例拆解:基于被动SPI模式的远程升级时序设计
背景与约束:某工业网关产品采用Zynq-7020 SoC(ARM+FPGA),FPGA部分负责高速数据采集。现场需支持远程固件升级,要求升级失败后能自动回退至旧版本,且升级过程中不得中断业务超过5秒。
初始现象:早期版本采用主动SPI模式,FPGA从板载QSPI Flash启动。远程升级时,主控先擦写Flash,再写入新比特流。但若在擦写过程中断电,Flash中数据不完整,FPGA上电后配置失败,设备“变砖”。
分析判断:根因是主动模式下FPGA无法感知Flash数据是否完整,且无回退机制。解决方案是切换为被动SPI模式,由ARM作为配置主机,利用ARM丰富的存储资源实现双备份。
实际操作步骤:
- 硬件修改:将FPGA配置模式引脚(M[2:0])设置为被动SPI(001),FPGA的DIN连接ARM的SPI_MOSI,CCLK连接ARM的SPI_CLK,CS_B连接ARM的GPIO。
- 存储规划:在eMMC中划分两个分区——
bank_a(当前版本)和bank_b(待升级版本),另设meta分区记录启动计数和版本状态。 - 升级流程:ARM从网络下载新比特流→写入
bank_b→校验CRC→更新meta中的“待切换”标志→触发FPGA重配置(拉低PROGRAM_B再释放)。 - 回退逻辑:FPGA配置完成后,ARM读取DONE信号。若DONE为高,则更新
meta为“当前版本=bank_b”;若DONE为低,则ARM重新加载bank_a,并将启动计数加1。若连续3次启动失败,则保持bank_a并上报告警。
结果对比:升级时间从原来的Flash擦写+写入(约8秒)缩短至被动加载(约1.5秒),且断电恢复后ARM可自动选择有效分区,设备可用性从99.9%提升至99.99%。
风险与代价:被动模式增加了ARM软件复杂度,需处理SPI时序中断和DONE超时检测。此外,ARM本身若故障,FPGA将无法配置,因此增加了硬件看门狗监控ARM运行状态。
复盘经验:配置模式的选择本质上是“可靠性架构”的权衡。主动模式适合无主控的简单系统,被动模式适合需要远程管理、多级回退的复杂系统。设计时务必考虑“升级失败后如何恢复”这一核心问题,而非仅关注配置速度。
2.6 常见误区与设计总结
| 误区 | 后果 | 正确做法 |
|---|---|---|
| 忽略INIT_B信号监控 | 配置失败无法及时发现,系统带病运行 | 主控必须监控INIT_B,失败后自动重试或回退 |
| 配置时钟走线过长且无端接 | 信号反射导致配置数据错位 | CCLK走线控制在50mm内,必要时串联22Ω电阻 |
| 多片FPGA配置链中DONE未做线与 | 部分芯片配置完成即启动,系统状态不一致 | 所有DONE通过OC门连接,加上拉电阻 |
| 升级时直接擦除当前运行Flash分区 | 断电导致永久变砖 | 采用双Bank切换,先写备份区再原子切换 |
| 未考虑配置电流峰值 | 电源跌落导致配置失败 | 配置期间FPGA功耗可达正常工作3倍,电源需预留余量 |