这一篇在干嘛?

用大白话讲清楚安路 EG4 系列(比如 EG4S20)的 DUAL BOOT(双启动)功能:它是什么、为什么需要它、Flash 里的两套位流怎么摆放,以及在 TD 软件里怎么一步步把位流烧进去。看完你就能给自己的板子加上”升级失败也不怕变砖”的保险。

先说痛点:为什么需要双镜像?

FPGA 的逻辑配置是靠”位流”(bitstream)文件实现的,上电后芯片从 SPI Flash 里把位流读进来加载。问题来了:如果你正在远程升级固件,写到一半断电了、或者位流文件本身有问题,Flash 里的数据就坏了——下次上电,FPGA 加载失败,板子直接”变砖”,可能还得拆机用下载器救。

DUAL BOOT 的思路很简单粗暴:在 Flash 里放两套位流。上电后 FPGA 先加载 Primary(主)位流;如果 Primary 出错导致加载失败,芯片就自动跳到一个约定好的地址(Golden Address),去加载 Golden(备用)位流。备用镜像平时不动它,专门用来”兜底”,这样就防止了 FPGA 因为位流破坏而无法启动,系统可靠性大大提高。

最佳实践

两套位流可以不一样(主新备旧,升级失败自动回退到旧版本),也可以在求稳的场合放完全相同的位流,双保险。

主备镜像怎么摆?——Flash 空间布局

先了解两个背景知识:

  • EAGLE 系列 FPGA 的配置位流长度约 4.8M~6M bits(具体还和 BRAM 初始化数据长度有关),所以配置芯片容量要 大于或等于 6M bit
  • 配置芯片用工业标准串行 SPI 接口 FLASH 即可,比如 M25Pxx、SST25LFxxx、S25FLxxx 等;EAGLE FPGA 支持读命令为 0x03 的 SPI FLASH。
  • 只有当 SPI Flash 容量 大于 12Mbit 时,MSPI 模式下才支持 DUAL BOOT 功能——选 Flash 时别抠门。

DUAL BOOT 模式下,Flash 的数据空间大致是这样划分的(手册图 1 的示例):

起始地址区域作用
0x000000Primary bitstream主位流,上电第一个加载
0x0C0000Dummy预留空隙
0x0D0000Golden address跳转地址,加载失败后从这里找备用位流
0x0E0000Golden bitstream备用位流,最后的”救命稻草”

关键规则:Golden 位流的起始地址是用户可以配置的,但最小值为 0x0E0000。也就是说备用镜像不能摆得太靠前,得给主镜像留足空间——毕竟主位流本身就要 6M bit 左右。

常见坑

  • Golden 地址设得比 0x0E0000 还小:违反了最小值限制,备用镜像可能和主镜像”打架”(地址重叠),两头都加载不完整。
  • 只更新了主镜像,忘了更新备用镜像:备用位流要是也是坏的,双启动就只剩”双倍绝望”了。升级时记得两套都要检查。
  • Flash 容量不够:位流要 6M bit,两套就是 12M bit 起步,容量小于 12Mbit 的芯片撑不起 DUAL BOOT。

方法一:bit 位流直接烧写(TD Download 工具)

如果只是用下载器本地烧写,用 TD 软件的 Download 工具就够了,不需要额外转换文件。

准备工作:先生成分别要放在 primary 区和 golden 区的两套位流(也可以两个区域放同一套),文件命名区分开,别搞混。

操作步骤:

  1. 目标板通过下载器连接,打开 TD 的 Download 界面,找到器件后,在 mode 栏选择 dualboot 模式
  2. 把两套位流都添加进来:Default 区选择放在 primary 的位流;Golden 区选择放在 golden 区的位流。Golden 区的起始地址在这里也能设置,最小 0x0E0000。
  3. 设置好后直接点 Run,两套位流就一起下载到 FLASH 里了。

TD Download 工具中选择 dualboot 模式并添加主备两套位流的界面

方法二:合成 bin 再转 SVF/TDE(给 MCU 用)

如果你的板子上没有下载器接口直连电脑,而是靠 MCU 上电时往 Flash 里写位流,那就需要 SVF/TDE 格式的文件。流程是三步走:两套 bit → 合成一个 bin → 转成 svf/tde

第一步:用 merge dualboot bit 合成 bin

打开安路 download 软件,选择 merge dualboot bit 功能,然后:

  • Default bit:选择放在 primary 的 bit 位流,起始地址固定为 0x000000
  • Golden bit:选择 golden 的 bit 位流,起始地址用户可设,最小值 0x0E0000
  • Merge bit file:指定生成的 bin 文件的名字和保存位置;
  • generate,就得到了合成的 bin 文件。

merge dualboot bit 界面中设置主备位流起始地址并生成 bin 文件

第二步:用 device chain 工具转 SVF

打开 TD 软件的 device chain 工具,点 add 添加上一步生成的 bin 文件,再点 Create SVF,在弹出的对话框中选择 SVF for SPI,即可生成 MCU 所需要的 svf/tde 文件。

device chain 工具中添加 bin 文件并选择 SVF for SPI 生成 SVF 文件

最佳实践

device chain 工具里其他选项的含义,以及 MCU 具体怎么用 svf/tde 文件对 Flash 进行配置,参考安路的配置文档 TN303_安路 EG4X FPGA 编程和配置使用说明_V1.3,遇到不明白的选项先查它。

别忘了:Global CRC 校验必须打开

最后一条,也是最容易踩的坑:要让 DUAL BOOT 功能正常工作,必须打开 Global CRC 校验功能。芯片就是靠 CRC 校验来判断主位流有没有坏的,这个开关不开,回退机制就是摆设。

较新版本的 TD 软件默认已打开该选项,不需要再设置;但如果用的是旧版本或者被手动关过,一定要去检查一下。

TD 软件中打开 Global CRC 校验功能的选项界面

常见坑

如果你的软件版本里 CRC 选项被关掉了,DUAL BOOT 的失败检测就形同虚设——主位流坏了芯片也”感觉不到”,不会跳转到 Golden 位流。烧写前务必确认这一项。

整体流程小结

  • 本地烧写:生成两套 bit → TD Download 工具选 dualboot 模式 → 分别指定 Default 区(0x000000)和 Golden 区(≥0x0E0000)→ Run。
  • MCU 烧写:两套 bit → merge dualboot bit 合成 bin → device chain 转 SVF for SPI → MCU 把 svf/tde 内容写进 Flash。

一句话收尾

DUAL BOOT = 主镜像 + 备用镜像 + CRC 检测 + 自动跳转。记住”0x0E0000”这个最小地址和”Global CRC 必须开”这条铁律,升级就再也不怕变砖了。