FPGA 固化实战指南:从 JTAG 连接到 QSPI 烧写全解析
在嵌入式系统开发中,FPGA 和 MCU 最大的区别之一就是:它是个'健忘'的家伙。每次上电都得重新加载配置数据才能工作。要想实现'上电即运行',就必须把比特流(bitstream)写进非易失性存储器里,这个过程,我们俗称'烧写'或'固化程序'。
而 Xilinx 的 Vivado 工具链虽然强大,但很多工程师卡在最后一步——明明流程走完了,Flash 也写了,可为什么启动失败?问题往往出在两个地方:硬件连接不规范,或者操作步骤理解有偏差。
从调试到部署:为什么 JTAG 不能'一劳永逸'?
我们在开发阶段最常用的下载方式是 JTAG。通过 USB-JTAG 下载器(比如 Digilent HS2、Platform Cable USB),用五根线就能把 .bit 文件快速下载到 FPGA 内部的配置 RAM 中。
这五根线分别是:
- TCK:测试时钟,驱动状态机;
- TMS:模式选择,控制跳转;
- TDI / TDO:串行输入/输出;
- TRST(可选):复位信号。
它们构成了一个标准的 IEEE 1149.1 边界扫描链,不仅用于编程,还能支持 ILA 在线抓波形、读寄存器等高级调试功能。
关键点在于:JTAG 能下载程序,但断电后程序就没了!因为 JTAG 只是把比特流送进了 FPGA 的易失性配置内存里,并没有写入任何永久存储设备。所以一旦断电,一切归零。
要让 FPGA 像单片机一样'开机自启',必须借助外部 Flash,比如最常见的 QSPI Flash。
QSPI Flash 是怎么让 FPGA 记住程序的?
想象一下:FPGA 上电后,像个刚醒的孩子,第一件事就是问:'我该做什么?'这时,如果它的'模式引脚'(M0/M1/M2)被设置为特定电平组合(例如 001),它就会意识到:'哦,我是主控,要去 Flash 里找我的程序。'
于是它摇身一变,变成一个 SPI 控制器,主动通过 SPI 接口从外部 QSPI Flash 中读取之前存好的比特流文件,然后自己完成加载。整个过程完全自动,无需 PC 介入。这就是所谓的'Master SPI 模式'。
哪些芯片支持这种模式?
几乎所有 7 系列及以上的 Xilinx FPGA 都支持,包括:Artix-7、Kintex-7、Virtex-7、Zynq-7000、Spartan-7 以及更新的 UltraScale 系列。只要外挂一片标准 QSPI Flash(如 Winbond W25Q128、Micron N25Q64),就可以实现程序固化。
关键硬件连接:少一根线都不行
再强大的软件也架不住接错线。以下是成功烧写的四大硬件前提:
1. JTAG 物理连接必须可靠
使用标准 10-pin 或 6-pin JTAG 接口,确保以下信号连通:
Pin 1 (Vref) → 目标板电源参考
Pin 2 (TDO) ← FPGA_TDO
Pin 3 (GND) → 共地
Pin 4 (TDI) → FPGA_TDI
Pin 5 (GND) → 共地
Pin 6 (TCK) → FPGA_TCK
Pin 7 (GND) → 共地
Pin 8 (TMS) → FPGA_TMS
Pin 9 (GND) → 共地
Pin 10 (TRST) → FPGA_TRST(可选)
⚠️ 特别提醒:不同厂商的 JTAG 引脚定义可能相反!务必对照开发板手册确认方向,否则可能烧毁下载器。
2. QSPI Flash 与 FPGA 之间的 SPI 信号要完整
典型四线 QSPI 连接如下:

