FPGA Vivado 下载及烧录流程详解
FPGA 本质是一块超大规模的 SRAM 电路板,内部没有存储能力,所有逻辑配置都是靠上电时加载的一串'开关指令'(也就是比特流)来决定的。一旦断电,这些开关状态全归零。所以,我们通常说的'下载',其实分两个层次:
| 类型 | 目标位置 | 是否掉电保存 | 用途 |
|---|---|---|---|
| JTAG 下载 | FPGA 内部 SRAM | ❌ 否 | 调试验证阶段 |
FPGA Vivado 下载及烧录流程详解 FPGA 本质是一块超大规模的 SRAM 电路板,内部没有存储能力,所有逻辑配置都是靠上电时加载的一串'开关指令'(也就是比特流)来决定的。一旦断电,这些开关状态全归零。所以,我们通常说的'下载',其实分两个层次: | 类型 | 目标位置 | 是否掉电保存 | 用途 | | --- | --- | --- | --- | | **JTAG 下载** |…
FPGA 本质是一块超大规模的 SRAM 电路板,内部没有存储能力,所有逻辑配置都是靠上电时加载的一串'开关指令'(也就是比特流)来决定的。一旦断电,这些开关状态全归零。所以,我们通常说的'下载',其实分两个层次:
| 类型 | 目标位置 | 是否掉电保存 | 用途 |
|---|---|---|---|
| JTAG 下载 | FPGA 内部 SRAM | ❌ 否 | 调试验证阶段 |
| 外部 SPI Flash 芯片 |
| ✅ 是 |
| 产品固化部署 |
你可以把前者想象成用 U 盘直接运行程序(即插即用),后者则是把系统装进硬盘里开机自动启动。
很多新人困惑的第一个问题是:
'我都把.bit 文件下进去了,为啥断电就没了?'
答案很简单:FPGA 本质是一块超大规模的 SRAM 电路板。它内部没有存储能力,所有逻辑配置都是靠上电时加载的一串'开关指令'(也就是比特流)来决定的。一旦断电,这些开关状态全归零。
所以,我们通常说的'下载',其实分两个层次:
| 类型 | 目标位置 | 是否掉电保存 | 用途 |
|---|---|---|---|
| JTAG 下载 | FPGA 内部 SRAM | ❌ 否 | 调试验证阶段 |
| Flash 烧录 | 外部 SPI Flash 芯片 | ✅ 是 | 产品固化部署 |
你可以把前者想象成用 U 盘直接运行程序(即插即用),后者则是把系统装进硬盘里开机自动启动。
接下来我们就一步步拆解这两个过程。
在动手前,请确认以下几点已经就绪:
如果 Vivado 打不开 Hardware Manager 或提示'no hardware found',90% 的问题出在这一步。
🔧 小贴士:如果你用的是 Digilent 下载器(比如 Nexys 系列常用),记得额外安装 Digilent Adept Runtime,否则可能无法识别。
当你完成以下流程后,就可以准备下载了:
编写 HDL → 添加 XDC 约束(管脚 + 时钟) → 综合 (Synthesis) → 实现 (Implementation) → 生成比特流 (Generate Bitstream)
其中最关键的一步是 Generate Bitstream,它会输出一个 .bit 文件,这是 FPGA 能读懂的'二进制配置文件'。
⚠️ 注意:
.bit文件默认路径通常是./<project>.runs/impl_1/top.bit,名字取决于顶层模块名。
点击菜单栏 Open Hardware Manager → Open Target → Auto Connect
这时你会看到 JTAG 链上的设备被扫描出来,通常是你的 FPGA 芯片(比如 xc7a35t_0)。
右键选择 Program Device,选中刚才生成的 .bit 文件,点击'Program'。
✅ 成功标志:LED 开始闪烁、串口打印数据、ILA 抓到信号波形……
但这只是暂时的!只要断电,一切归零。
因为快!
改一行代码 → 重新生成 bit → 再下载,整个过程不到一分钟。你可以反复迭代功能,配合 ILA(集成逻辑分析仪)实时观测内部信号,就像给 FPGA 做'心电图'。
而且支持 Partial Reconfiguration —— 高级玩法来了:只更新部分逻辑而不影响其他模块运行,这对通信系统或图像处理流水线特别有用。
现在你要问了:'我总不能每次演示都连电脑吧?能不能让它自己启动?'
当然可以,这就需要把 .bit 文件写进外部 Flash 芯片里。
大多数开发板都会配一颗 SPI Flash 芯片(常见型号如 N25Q128A、S25FL128S),容量一般为 16MB 左右。
FPGA 内部有个隐藏的'小助手'——Bootloader 控制器。上电时,它会根据模式引脚(MODE[2:0])判断是否进入主模式(Master SPI Mode)。如果是,就会主动通过 SPI 接口去读取 Flash 里的比特流,并加载到自身配置内存中。
🔄 这个过程叫 Configuration,不是'执行程序',而是'构建电路'。
.bit 文件不能直接写进 Flash,必须封装成特定格式。最常用的是 .mcs 文件(Motorola HEX 格式),兼容性好,Vivado 原生支持。
在 Hardware Manager 中:
.bit 文件# 指定原始 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 流程中调用,避免手动重复操作。
关键四步:
✅ 如果一切正常,恭喜你完成了从'开发调试'到'独立运行'的跨越!
现象:Hardware Manager 显示'No hardware targets available'
排查清单:
💡 经验之谈:某些 Zynq 器件还需要 PS 端先上电才能激活 PL 端 JTAG,别忘了给 PMOD 供电。
典型原因:电源不稳定或信号干扰
解决方案:
最大陷阱:选错了 Flash 型号!
虽然都是 QSPI Flash,但不同厂商的命令集和扇区结构不一样。Vivado 内置了几十种 Flash 算法,必须严格匹配。
正确做法:
Add Configuration Memory Device 对话框中精确选择;九成概率是这里错了:启动模式没设置对!
FPGA 有多种配置模式,由 MODE 引脚决定:
| MODE[2:0] | 模式 | 应用场景 |
|---|---|---|
| 001 | Master BPI | 大容量并行 Flash |
| 010 | Master SPI | 最常用,推荐 |
| 100 | JTAG | 调试专用 |
| 111 | Slave Serial | 由外部主控驱动 |
请务必检查拨码开关或跳线帽是否将 MODE 设为 010(SPI Master)。
高端应用中常采用'双系统'设计:Flash 中存两份比特流镜像。主镜像升级失败时,自动回退到安全版本。
实现方法:
Xilinx 7 系列及以上支持 AES-256 加密。开启后,即使别人拆下 Flash 也读不出有效内容。
操作路径:
ENCRYPT=TRUE⚠️ 注意:一旦烧入 Efuse,不可逆转,请谨慎测试!
哪怕你现在只需要 2MB,也建议选 16MB 以上的 Flash 芯片。
为什么?因为你永远不知道以后会不会加上:
提前规划,后期不慌。
[PC] │ ├─→ Vivado 开发环境 │ │ │ ├── 编写代码 & 添加约束 (XDC) │ ├── 综合 → 实现 → 生成 .bit │ │ │ ├──【调试阶段】──────────────┐ │ │ ↓ │ │ │ JTAG 下载 .bit → FPGA SRAM ← 可配合 ILA 调试 │ │ (临时运行) │ │ │ └──【部署阶段】──────────────┐ │ ↓ │ │ 生成 .mcs → 写入 SPI Flash ← Program Configuration Memory │ (永久存储) │ ↓ │ 断电重启 │ ↓ └────────────────────→ FPGA 自动加载 → 运行设计 (无需 PC)
掌握 Vivado 下载与烧录流程,不只是学会点几个按钮,而是理解'软件如何变成硬件行为'的全过程。
当你第一次看到 FPGA 脱离电脑、独立运行你写的逻辑时,那种成就感,只有真正做过的人才懂。
而这一切的基础,就是弄明白:
👉 .bit 是给谁用的?
👉 .mcs 又是怎么来的?
👉 JTAG 和 SPI 到底各司何职?
把这些理顺了,你就不再是'只会写代码的新手',而是真正掌握了 FPGA 开发闭环的工程师。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online