FPGA Vivado 下载及烧录流程详解
FPGA 开发中,临时下载与永久烧录是两个关键概念。理解其区别有助于避免配置丢失或启动失败的问题。
一、先搞清一件事:为什么 FPGA 要'下载'两次?
FPGA 本质是一块超大规模的 SRAM 电路板,内部没有存储能力,所有逻辑配置都是靠上电时加载的一串比特流来决定的。一旦断电,这些开关状态全归零。
| 类型 | 目标位置 | 是否掉电保存 | 用途 |
|---|---|---|---|
| JTAG 下载 | FPGA 内部 SRAM | 否 | 调试验证阶段 |
| Flash 烧录 | 外部 SPI Flash 芯片 | 是 | 产品固化部署 |
前者类似用 U 盘直接运行程序,后者则是把系统装进硬盘里开机自动启动。
二、第一步:通过 JTAG 把程序'临时'跑起来
1. 准备工作:软硬件都得在线
在动手前,请确认以下几点已经就绪:
- Vivado 已安装(推荐 2023.1 及以上版本)
- Xilinx USB Cable 驱动已正确安装(Windows 设备管理器中能看到'Xilinx JTAG Cable')
- 开发板供电正常(最好用外接电源,别靠 USB 口硬撑)
- JTAG 线连接无误(注意引脚方向,别反插)
如果 Vivado 打不开 Hardware Manager 或提示'no hardware found',90% 的问题出在这一步。
提示:如果你用的是 Digilent 下载器(比如 Nexys 系列常用),记得额外安装 Digilent Adept Runtime,否则可能无法识别。
2. 工程走到哪一步才能下载?
当你完成以下流程后,就可以准备下载了:
编写 HDL → 添加 XDC 约束(管脚 + 时钟) → 综合 (Synthesis) → 实现 (Implementation) → 生成比特流 (Generate Bitstream)
其中最关键的一步是 Generate Bitstream,它会输出一个 .bit 文件,这是 FPGA 能读懂的二进制配置文件。
注意:
.bit文件默认路径通常是./<project>.runs/impl_1/top.bit,名字取决于顶层模块名。
3. 打开 Hardware Manager,连上 FPGA
点击菜单栏 Open Hardware Manager → Open Target → Auto Connect。
这时你会看到 JTAG 链上的设备被扫描出来,通常是你的 FPGA 芯片(比如 xc7a35t_0)。
右键选择 Program Device,选中刚才生成的 .bit 文件,点击'Program'。
成功标志:LED 开始闪烁、串口打印数据、ILA 抓到信号波形……
但这只是暂时的!只要断电,一切归零。
4. 为什么这个方式适合调试?
因为快!改一行代码 → 重新生成 bit → 再下载,整个过程不到一分钟。你可以反复迭代功能,配合 ILA(集成逻辑分析仪)实时观测内部信号。
而且支持 Partial Reconfiguration —— 高级玩法来了:只更新部分逻辑而不影响其他模块运行,这对通信系统或图像处理流水线特别有用。
三、第二步:让程序'永久'住在 FPGA 里 —— Flash 烧录详解
现在你要问了:'我总不能每次演示都连电脑吧?能不能让它自己启动?'
当然可以,这就需要把 .bit 文件写进外部 Flash 芯片里。
1. 硬件基础:FPGA 是怎么'自举'的?
大多数开发板都会配一颗 SPI Flash 芯片(常见型号如 N25Q128A、S25FL128S),容量一般为 16MB 左右。
FPGA 内部有个隐藏的'小助手'——Bootloader 控制器。上电时,它会根据模式引脚(MODE[2:0])判断是否进入主模式(Master SPI Mode)。如果是,就会主动通过 SPI 接口去读取 Flash 里的比特流,并加载到自身配置内存中。
这个过程叫 Configuration,不是'执行程序',而是'构建电路'。
2. 如何生成可用于烧录的镜像文件?
.bit 文件不能直接写进 Flash,必须封装成特定格式。最常用的是 .mcs 文件(Motorola HEX 格式),兼容性好,Vivado 原生支持。
方法一:图形界面操作
在 Hardware Manager 中:
- 点击 Add Configuration Memory Device
- 选择 Flash 型号(例如 Spansion S25FL128S)
- 加载你的
.bit文件 - 设置编程参数(电压、速率等)
- 点击 Program 即可生成并烧录
方法二:Tcl 脚本自动化(推荐用于量产)
# 指定原始 bit 文件路径
set bitfile "./project.runs/impl_1/top.bit"
# 声明外部 Flash 设备(接口类型 + 容量)
add_cfg_mem -iface spi -size 16M -dci_file "cfgmem_dci.xml" -data_file {up} ${bitfile}
# 生成 MCS 文件
write_cfg_mem -force -format mcs -interface spi \
-size 16 -load_bitstream true \
-file "./output/project_image.mcs"
这段脚本可以在批处理或 CI/CD 流程中调用,避免手动重复操作。
3. 烧录完成后,怎么验证是否生效?
关键四步:
- 断开 JTAG 连接;
- 修改开发板上的启动模式拨码开关,设为 Master SPI 模式;
- 断电重启;
- 观察用户逻辑是否自动运行(如 LED 按预期闪烁)。
如果一切正常,恭喜你完成了从'开发调试'到'独立运行'的跨越!
四、常见问题与应对策略
问题 1:JTAG 识别不了 FPGA
现象:Hardware Manager 显示'No hardware targets available'
排查清单:
- 驱动是否安装?→ 设备管理器看是否有黄色感叹号
- USB 线是不是劣质线?→ 换一根带屏蔽的短线试试
- 板子有没有供电?→ 测一下 VCCINT 和 VCCAUX 电压
- JTAG 插座焊反了?→ 查原理图核对 TDI/TDO/TCK/TMS 顺序
经验之谈:某些 Zynq 器件还需要 PS 端先上电才能激活 PL 端 JTAG,别忘了给 PMOD 供电。
问题 2:下载进度条卡在 50%
典型原因:电源不稳定或信号干扰
解决方案:
- 使用独立稳压电源(至少 2A 输出能力)
- 缩短 JTAG 线长度(建议≤30cm)
- 在 TCK 线上加 10Ω串联电阻抑制振铃
- 关闭其他高功耗外设(如 DDR、HDMI)
问题 3:Flash 烧录失败,报错'Erase failed'
最大陷阱:选错了 Flash 型号!
虽然都是 QSPI Flash,但不同厂商的命令集和扇区结构不一样。Vivado 内置了几十种 Flash 算法,必须严格匹配。
正确做法:
- 查开发板手册,找到 Flash 芯片完整型号;
- 在
Add Configuration Memory Device对话框中精确选择; - 不确定时优先选'Generic SPI'尝试;
- 若仍失败,查看 Xilinx 官方文档 UG973 中的兼容列表。
问题 4:上电不启动,但 JTAG 能下载
九成概率是这里错了:启动模式没设置对!
FPGA 有多种配置模式,由 MODE 引脚决定:
| MODE[2:0] | 模式 | 应用场景 |
|---|---|---|
| 001 | Master BPI | 大容量并行 Flash |
| 010 | Master SPI | 最常用,推荐 |
| 100 | JTAG | 调试专用 |
| 111 | Slave Serial | 由外部主控驱动 |
请务必检查拨码开关或跳线帽是否将 MODE 设为 010(SPI Master)。
五、进阶建议:如何写出更可靠的烧录流程?
推荐实践 1:预留双镜像备份(Fallback 机制)
高端应用中常采用'双系统'设计:Flash 中存两份比特流镜像。主镜像升级失败时,自动回退到安全版本。
实现方法:
- 分配两个独立地址段(如 0x0 和 0x400000)
- 使用 Tcl 脚本分别打包两个.mcs
- 在 FSBL(First Stage Boot Loader)中加入校验逻辑
推荐实践 2:启用比特流加密(防逆向)
Xilinx 7 系列及以上支持 AES-256 加密。开启后,即使别人拆下 Flash 也读不出有效内容。
操作路径:
- Project Settings → Bitstream → Set Property
ENCRYPT=TRUE - 生成加密密钥(可通过 Bbram 或 Efuse 存储)
注意:一旦烧入 Efuse,不可逆转,请谨慎测试!
推荐实践 3:为未来留余地——多留点 Flash 空间
哪怕你现在只需要 2MB,也建议选 16MB 以上的 Flash 芯片。
为什么?因为你永远不知道以后会不会加上:
- Bootloader(如 MicroBlaze + lwIP)
- 校准数据表
- 固件日志记录
- OTA 远程升级包缓存
提前规划,后期不慌。
六、总结:全流程概览
[PC]
├── Vivado 开发环境
│ ├── 编写代码 & 添加约束 (XDC)
│ ├── 综合 → 实现 → 生成 .bit
│ ├──【调试阶段】
│ │ └── JTAG 下载 .bit → FPGA SRAM ← 可配合 ILA 调试(临时运行)
│ └──【部署阶段】
│ ├── 生成 .mcs → 写入 SPI Flash ← Program Configuration Memory(永久存储)
│ ↓
│ 断电重启
│ ↓
└── FPGA 自动加载 → 运行设计(无需 PC)
掌握 Vivado 下载与烧录流程,不只是学会点几个按钮,而是理解'软件如何变成硬件行为'的全过程。
弄明白 .bit 是给谁用的、.mcs 又是怎么来的、JTAG 和 SPI 到底各司何职,你就不再是'只会写代码的新手',而是真正掌握了 FPGA 开发闭环的工程师。

