在工业控制和嵌入式系统领域,FPGA设备的远程固件升级一直是个痛点问题。传统方式需要工程师到现场通过JTAG口烧写,不仅效率低下,在设备部署于偏远地区时更是成本高昂。我最近负责的一个风电监测项目就遇到了这个难题——分布在多个山头的30多台FPGA数据采集设备需要频繁更新算法。
Xilinx 7系列FPGA的Multiboot功能理论上支持远程更新,但官方文档(XAPP1247)偏重理论,网上能找到的案例要么是Xilinx原厂芯片配Micron Flash的方案,要么就是缺少关键实现细节。我们项目使用的是复旦微电子的K7 FPGA和JFM系列Flash,需要从头搭建完整的解决方案。
经过两周的密集攻关,我成功实现了通过串口(后续可扩展为网口)的可靠升级方案。下面就把这个实战过程中积累的经验和踩过的坑完整分享给大家,特别会说明如何适配不同厂家的Flash芯片。
Multiboot的核心是Golden Image和Update Image的双备份设计:
关键经验:Golden Image必须精简到只含必要功能。我们最初把频谱分析算法也放进去,导致升级时RAM不足,后来只保留UART通信和Flash驱动,体积缩小到300KB。
虽然方案理论上支持任意Flash,但不同厂商的器件需要特别注意:
命令码差异:

坏块处理:
verilog复制// 复旦微Flash的坏块检测方法
if(flash_read(block_addr+0x400) == 0xFF) {
// 好块标准:特定偏移处为全1
}
跨厂商适配技巧:
在XDC文件中必须添加以下约束:
tcl复制# Multiboot配置寄存器设置
set_property BITSTREAM.CONFIG.CONFIGRATE 33 [current_design]
set_property BITSTREAM.CONFIG.NEXT_CONFIG_ADDR 0x080000 [current_design]
set_property BITSTREAM.CONFIG.NEXT_CONFIG_REBOOTDISABLE YES [current_design]
# SPI Flash接口约束
set_property -dict {
PACKAGE_PIN J11
IOSTANDARD LVCMOS33
} [get_ports spi_cs]
Golden Image生成:
bash复制write_bitstream -force golden.bit
promgen -w -p mcs -c FF -o golden.mcs -u 0 golden.bit -spi
Update Image生成:
bash复制write_bitstream -force update.bit
promgen -w -p mcs -c FF -o update.mcs -u 0x080000 update.bit -spi
踩坑记录:早期版本忘记加
-spi选项,导致生成的MCS文件无法被FPGA识别,浪费两天排查时间。
我们采用改良的YMODEM协议:
code复制[HEADER][LENGTH][DATA][CRC32]
verilog复制case(upgrade_state)
IDLE:
if(uart_rx == 0x55) begin
next_state <= HEADER;
crc_reset <= 1'b1;
end
HEADER:
if(uart_rx == 0xAA) begin
next_state <= LENGTH;
byte_count <= 0;
end
// ...其他状态转移逻辑
endcase
断电保护:
数据校验:
c复制// 写入前校验示例
if(crc32(data) != received_crc) {
send_nak();
retry_count++;
if(retry_count > 3) abort_upgrade();
}
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 升级后无法启动 | Flash写入不完整 | 在Golden Image中添加校验程序 |
| 多次升级后变砖 | Flash寿命耗尽 | 改用SLC NAND或增加磨损均衡 |
| 通信中断后卡死 | 状态机未超时 | 添加watchdog定时器复位 |
加速写入:
压缩传输:
python复制# 上位机压缩示例
with open('update.bin', 'rb') as f:
compressed = zlib.compress(f.read(), level=9)
ser.write(compressed)
这套方案已经成功应用于三个项目:
最近还在研究通过PCIe DMA加速的方案,实测500MB的镜像文件升级时间可从15分钟缩短到40秒。这个过程中最深的体会是:FPGA的灵活性既是优势也是挑战,每个细节都需要反复验证才能确保可靠性。