FPGA远程更新升级和测试(MultiBoot)
最近项目上要使用FPGA程序的远程更新功能,空闲时间在自己的开发板上先搞了一套(千兆网接口),并实现在线重加载;参考了之前的内容,将3字节指令的flash驱动兼容到4字节指令上:
FPGA实现千兆网UDP协议(含ARP、ICMP)
FPGA外挂存储器应用2——QSPI Flash读写等功能
基于ZYNQ的远程更新功能
测试硬件FPGA(Ku5p)、NorFlash(MX25U512)
适用场景:板卡有对外接口(比如:网口、串口、USB、PCIe等),板卡与板卡互联且有上述对外接口等。
远程更新Flash特别适用于人员不方便接触板卡,比如产品部署在偏远的通信基站、机房服务器或者密封的设备机箱中,突然发现一个bug需要修复,或者要增加一个新功能等。
远程更新完Flash后,重加载程序,可以通过外部MCU或者FPGA内部IPROG命令(等同赋值PROGRAM_B负脉冲)在线重加载,或者掉电重启。
1. MultiBoot方案
为例规避在线更新程序的过程中出现断电、断线、通信中断、传输的文件有问题等意外情况,使得固化程序未全部写入Flash,造成FPGA变砖无法启动,只能通过JTAG再次更新程序;FPGA厂商都考虑了这个问题,提供了双镜像方案,比如Xilinx的Golden镜像和Multiboot镜像,允许在同一个配置Flash中存储多个bitstream,并在不同镜像之间进行动态切换。
可参考:
ug570-ultrascale-configuration
xapp1257-multiboot-fallback-spi-flash
xapp1296-multiboot-fallback-icap
1.1. 启动流程
通过双镜像架构和Fallback回退机制,即使在升级过程中发生意外(断电、通信中断、文件错误等),系统也能自动恢复到稳定状态,从根本上解决了FPGA远程升级“变砖”的问题。
在MultiBoot方案中,通常包含两个镜像:
Golden Image(黄金镜像):存储在Flash的起始地址(0x00000000),包含FPGA的基本功能和远程升级逻辑。这个镜像具备远程更新Flash功能,固化后不要更新,是系统最后的容错保障。
Update Image(更新镜像):存储在自定义的Flash某高位地址,包含实际的业务功能。这个镜像是实际远程升级的。
配合Fallback(回退)机制,当Update Image加载失败时,FPGA会自动回退到Golden Image,确保系统始终能够正常运行保障仍可再次远程更新。
主要有以下几个步骤:
上电启动:FPGA上电后,从Flash的0地址开始加载Golden Image。
检测IPROG命令:Golden Image的Header中包含一个特殊的IPROG(Internal Program)命令和WBSTAR(Warm Boot Start Address)寄存器,后者指向Update Image的存储地址。
跳转加载:FPGA检测到IPROG命令后,跳转到WBSTAR指定的地址,开始加载Update Image。
正常运行:如果Update Image加载成功,FPGA运行更新后的业务功能。
触发回退:如果加载过程中出现错误(CRC校验失败、IDCODE不匹配、Watchdog超时等),FPGA自动触发Fallback,重新从0地址加载Golden Image。
1.2. 相关配置
G镜像的约束文件需要指定M镜像的位置,如果Flash容量大于128Mb,需要开启4字节地址。根据自己板卡的原理图设置SPI是单线、双线还是四线模式。
M镜像需要使能Fallback回退。
比如本板卡的设置:
关于Flash的片选和信号线的约束,UltraScale+和其他系列不同;U+系列使用STARTUPE3源语,无需对Flash管脚IO进行约束;其他U和7系列使用STARTUPE2源语,指定程序启动后的Flash时钟,其他的Flash管脚片选和MSIO进行XDC约束。
程序远程更新完后,如果想使用不掉电在线切换程序,U+系列使用ICAPE3源语,指定M镜像的位置,需要注意每字节内高低位互换,参考UG570
1.3. 初次配置
初次固化G镜像和M镜像时,可通过Vivado生成固化文件:
上述设置G镜像位于地址0x00000000,M镜像位于0x02000000(即G镜像指定的M镜像位置),本板用于配置启动的norflash接了4线,为了快速启动采用了SPIX4。
生成G和M镜像的合成文件后,通过JTAG将合成文件TEST_ALL.bin固化到Flash中,板卡即具备了远程加载和在线重启的功能。
2. 功能测试
开发Golden Image和Update Image功能,开发上位机界面,进行测试:
2.1. 约定命令
上位机下发擦除指令:
指令头4B | 指令码4B | M镜像起始地址4B | 擦除块数4B | 结束码4B |
AA55A5A5 | B2C1B3FD | EEEEFFFF |
FPGA擦除完成反馈指令:
指令头4B | 指令码4B | 备份4B | 备份4B | 结束码4B |
AA55A5A5 | B2C1B3FD | EEEEFFFF |
上位机下发更新指令:
指令头4B | 偏移地址4B | 更新数据256B | 结束码4B |
55AAAA55 | EEEEFFFF |
FPGA每包数据更新完成反馈指令:
指令头4B | 更新地址4B | 备份4B | 备份4B | 结束码4B |
55AAAA55 | EEEEFFFF |
上位机下发在线重加载指令:
指令头4B | 指令码4B | 备份4B | 备份4B | 结束码4B |
AA55A5A5 | FFEEDDCC | EEEEFFFF |
2.2. 远程更新测试
固化文件大小约4.77MB,需要进行sector擦除4KB的个数为1223个
擦除完成时间约28s,平均每4KBsector擦除时间约23ms与Flash Datasheet相符。
从指令下发,历经擦除、逐256B更新,到更新完成整个过程约41s,下载过程相比Vivado还是快很多的。
在线重加载后,可以通过测试指示灯,也可查看M镜像是否启动,经寄存器观测,没有回退,即更新程序启动成功:
往期精彩回顾
FPGA开发PCIe系列2:实现Block DMA的H2C、C2H
FPGA开发中常用的TLP包
FPGA的时钟动态调相和鉴相功能
基于7系列FPGA实现万兆网通信
FPGA实现千兆网UDP协议(含ARP、ICMP)
FPGA 40G/50G Ethernet Subsystem核的使用
基于FPGA的千/万兆以太网通信巨型帧 Jumbo的处理测试
基于FPGA实现NVMe硬盘的读写功能
基于FPGA开发应用SATA硬盘
FPGA实现SD卡内文件的读写功能(FAT32文件系统)
FPGA光通信系列4 — 基于64b/66b编码的自定义协议
FPGA光通信系列3 — 基于8b/10b编码的自定义协议应用
FPGA光通信系列2——Aurora 64B/66B的使用
FPGA实现Aurora光通信应用
JESD204B的使用系列——3、DAC的应用(AD9164 9.6GSPS)
JESD204B的使用系列——2、协议及ADC的应用(AD9689)
JESD 204B的使用系列—1、时钟芯片的应用