fpga远程更新过程防止变成砖方案。 xilinx 7系列。 无需多余电路。 将方案中的代码嵌入到远程更新程序中使用。 不含远程更新方案及代码
大半夜调试远程更新差点把板子干废,这种酸爽老铁们都懂。今天咱们聊聊Xilinx7系FPGA保命技巧------断电重启不翻车,核心就藏在IPROG命令和WBSTAR寄存器这对黄金搭档里。
先看这段救命代码:
c
#define BOOT_ADDR 0x00040000 //备用镜像地址
#define WBSTAR *((volatile uint32_t*)0xF8000008)
#define IPROG_CTRL *((volatile uint32_t*)0xF800000C)
void system_fallback(void)
{
// 看门狗咬人时执行
WBSTAR = BOOT_ADDR; //重定向启动地址
IPROG_CTRL = 0x0000000F; //发射重启信号
while(1); //躺平等重启
}
这段代码的精髓在于玩转FPGA的隐藏技能------多重启动配置。当主程序检测到异常(比如心跳包丢失),直接修改WBSTAR寄存器指向备用固件位置,然后IPROG命令相当于给FPGA来一剂重启药,注意这里不需要任何外部电路干预。
存储布局才是关键,Flash里必须玩俄罗斯方块:
text
0x00000000 | Golden镜像(绝对可靠版)
0x00040000 | 新版本镜像1
0x00080000 | 新版本镜像2
每次更新时不仅要烧新镜像,还得把当前运行的稳定版本复制到相邻区块。这样当新镜像翻车时,WBSTAR能准确找到备用位置。
实战中踩过的坑:IPROG命令执行时系统时钟还在跑,所以要在触发前把该关的中断都掐了。建议在触发重启前加个100ms延时,给Flash足够时间准备。
测试阶段可以这样玩心跳检测:
verilog
// 在PL端埋个地雷
always @(posedge clk) begin
if(!heartbeat) begin
force_fallback <= 1'b1; //强制触发回滚
end
end
最后提醒:别在代码里写死WBSTAR地址,用Xilinx官方宏定义更稳:
c
#include "xil_io.h"
Xil_Out32(XPAR_AXI_GPIO_WBSTAR_BASEADDR, BOOT_ADDR);
记住这个保命套路,远程更新时至少能保住饭碗------毕竟半夜三点跑去机房烧录的滋味,谁试谁知道。
