FPGA Flash 烧写实战全解:从比特流到可靠启动
在嵌入式 FPGA 开发中,能跑仿真不等于能上电自启。真正决定产品能否落地的关键一步,是将.bit 文件固化进 QSPI Flash 的全过程。
比特流不是终点,而是起点
综合实现后生成的 .bit 文件只是 FPGA 配置的临时快照,只能通过 JTAG 下载到易失性配置 RAM 中,断电即失。要让 FPGA 记住设计,必须把配置信息转存到外部非易失性存储器(通常是 Quad SPI Flash),并经过封装处理。
为什么要压缩?容量与速度的博弈
现代 FPGA 的配置数据动辄几 MB 甚至十几 MB。以 Zynq-7000 为例,中等规模设计的 .bit 可能达到 8~12MB。启用比特流压缩可将原始体积缩小至 40%~60%,降低 Flash 成本并加快初始化速度。
set_property BITSTREAM.GENERAL.COMPRESS true [current_design]
实践建议:除非有特殊调试需求,否则应始终开启压缩。
四线 SPI 还是单线?硬件说了算
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
这里的 4 代表使用四线 SPI(QSPI 模式)。此设置必须与实际硬件连接一致,否则会导致同步头读取失败或进入安全模式。
注意:某些开发板默认出厂设置为 x1 模式,需确认原理图后再修改该参数。
配置速率别乱调,匹配 Flash 才稳定
set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design]
设定的是 FPGA 发起的 SPI 时钟频率。需参考 Flash 芯片规格,保守起见建议初始设置为 33~50MHz。
把比特流'打包'成 Flash 能认的格式
.bit 文件不能直接写入 Flash,需要生成中间格式 .mcs 文件。
MCS 文件的本质
MCS 是一种文本格式的固件映像,包含地址、长度、数据和校验码。Vivado 通过 write_cfgmem 命令生成:
write_cfgmem -format mcs \
-size 16 \
-interface spi_x4 \
-loadbit "up 0x00000000 ./output/design.bit" \
-checksum enable \
-force \
./output/design.mcs
| 参数 | 含义 | 注意事项 |
|---|---|---|
-size 16 | Flash 容量为 16Mb(即 2MB) | 必须 ≥ 实际 Flash 芯片大小 |
-interface spi_x4 | 使用四线 SPI 接口 | 必须与 BITSTREAM.CONFIG.SPI_BUSWIDTH 一致 |
-loadbit | 映射到 Flash 起始地址 | 多镜像系统可指定不同偏移 |
-checksum enable | 添加 CRC32 校验 | 提升加载可靠性 |

