基于 Vivado 的 FPGA 程序在线更新方案
1. 项目目标
本文旨在介绍如何在 Vivado 开发环境下,通过 SPI Flash(型号 MT25QL256)对 Xilinx 7K325t FPGA 进行在线程序烧写与升级。核心思路是利用 FPGA 逻辑控制 SPI 时序,将新比特流写入 Flash,并在需要时重新配置。
2. 硬件基础:MT25QL256 SPI Flash
2.1 关键特性
我们选用的 MT25QL256 是一款 256Mb 容量的串行闪存。由于容量超过 128Mb,必须启用 4-byte 地址模式才能访问全部空间。它支持 STR/DTR 传输率,最高时钟频率可达 133MHz(STR),并支持 Quad I/O 以提升吞吐量。此外,它还具备扇区保护、OTP 锁定及 CRC 校验等安全机制。
2.2 引脚定义
主要信号包括片选 S#、时钟 C、复位 RESET# 以及双向数据 DQ[3:0]。其中 S# 低电平有效,下降沿启动命令;DQ 线在 Quad 模式下可复用为 HOLD# 或 W#,需注意协议兼容性。
2.3 寄存器说明
操作前需关注状态寄存器(Status Register)和标志状态寄存器(Flag Status Register)。
- Status Register: 包含写使能锁存位(WEL)、忙状态位(WP)及块保护位(BP)。上电后 WEL 默认为 0,执行任何写/擦除操作前必须先发送
WRITE ENABLE(06h) 命令。 - Flag Status Register: 用于报告编程或擦除过程中的错误(如保护冲突、超时),操作完成后需读取并清除错误标志。
3. 核心指令操作
为了实现可靠的数据读写,我们需要掌握以下关键指令序列。注意所有操作均需在 S# 拉低后开始,并在命令结束后拉高以终止。
3.1 读操作
对于 256Mb 芯片,推荐使用 4-BYTE FAST READ (0Ch)。相比标准读,Fast Read 允许更高的时钟频率,但需注意 Dummy Cycles 的设置。出厂默认通常为 8 个周期,若实际工作频率较高,建议通过非易失性配置寄存器调整 Dummy Cycles,否则可能导致读取数据错误。
3.2 写与擦除
- 页编程 (Page Program): 使用
PAGE PROGRAM(02h) 或4-BYTE PAGE PROGRAM(12h)。每次最多写入 256 字节。若起始地址未对齐页边界,超出部分会被丢弃。 - 扇区擦除: 支持子扇区 (Subsector)、扇区 (Sector) 及整片擦除 (Bulk Erase)。擦除前务必确认未处于写保护状态,且已执行
WRITE ENABLE。
3.3 地址模式切换
由于 Flash 容量较大,默认 3-byte 寻址不够用。可通过 ENABLE 4-BYTE ADDRESS MODE 命令动态切换,或通过配置寄存器固化该设置。切换后立即生效,退出后恢复默认。
4. 系统实现细节
4.1 STARTUPE2 原语应用
在在线更新场景中,FPGA 运行用户逻辑期间,SPI Flash 的时钟源通常由 FPGA 内部逻辑提供。此时需要使用 STARTUPE2 原语来管理配置时钟。
STARTUPE2 #( .PROG_USR("FALSE"), // 禁用加密程序事件
.SIM_CCLK_FREQ(0.0) ) // 仿真时钟频率
STARTUPE2_inst (
.CFGCLK(), // 配置主时钟输出
.CFGMCLK(), // 配置内部振荡器时钟输出
.EOS(), // 启动结束信号
.PREQ(), // 编程请求输出
.CLK(0), // 用户启动时钟输入
.GSR(0), // 全局复位,置 0 禁用
.GTS(0), // 全局三态,置 0 禁用
.KEYCLEARB(1), // AES 密钥清除
.PACK(1), // 编程确认
.USRCCLKO(outSpiClk),// 用户 CCLK 输出(驱动 Flash 时钟)
.USRCCLKTS(0), // CCLK 三态控制
.USRDONEO(1), // DONE 引脚输出控制
.USRDONETS(1) // DONE 三态控制
);

