FPGA程序远程在线更新QUICKBOOT


前言

学习一下FPGA的远程在线更新功能 QUICKBOOT。


一、更新流程

这部分是直接摘抄的官方文档。

在这里插入图片描述
1、关键开关字的控制。

2、Flash 存储器与QuickBoot flash 模块的地址映射。

3、位流包的大小以及Flash 存储器大小的确定。

4、QuickBoot配置时间

5、QuickBoot验证update bitstream的正确性

二、具体操作

下面写的这些根本不好用,我自己搞了半天没搞懂。重新去找了一个用MultiBoot的方法,原理上是一样的,有一点点区别就是不过对具体操作来说好像不用管。可以直接看第三章。
~~ ## 1.生成MCS文件
首先需要把我们工程的bit文件转成mcs文件,可以用VIVADO的TOOLS里面的Generate Memory Configuration file…命令生成,也可以直接在TCL命令栏里面直接输入以下指令:
write_cfgmem -format mcs -interface spix1 -size 256 -loadbit “up 0 F:/XXX.bit” -file F:/XXX.mcs
路径需要根据你项目工程所在文件夹进行更改。~~
## 2.生成初始化文件
使用以下命令
xilPerl MakeSpiFlashProgrammerMcsFiles.pl XXX.mcs
可以把mcs文件转成两个文件,一个是XXX_initial.mcs,另一个是XXX_update.mcs
2.1 其中的XXX_initial.mcs就是我们需要的Golden文件,也就是最原始的版本,可以直接用烧写器下载到FLASH里面。
2.2 再把XXX_update.mcs转成XXX_update.bin文件。

## 3.生成更新文件
第二步生成的XXX_update.bin就是更新文件,每次更新了程序,重复上面的第1,2两个步骤,再把这个文件通过FPGA在线更新到FLASH。

三、MultiBoot实现

1.原理

通常在设计多版本启动及远程更新时,用户需要分别准备两个镜像工程:Golden镜像和MultiBoot镜像,为了方便描述,Golden镜像和MultiBoot镜像分别称为G镜像和M镜像。如图1所示,上电后,FPGA会启动M镜像,如果配置成功,FPGA将会运行在M镜像,若配置失败,则FPGA会回退到G镜像。通常情况下,M镜像是用户实际运行的镜像,当用户设计发生变更时,可以通过远程更新的方式对M镜像进行更新,而G镜像是一个基本镜像,通常情况下它只包含接收一个M镜像配置文件并写入到FLASH的功能,并且不建议对G镜像进行更新。
在这里插入图片描述

2.GOLDEN模块工程实现

在这里插入图片描述
FPGA工程里面主要的几个功能模块:
1.FPGA接收外部更新包。
这个是由用户的工作模式决定的。我以前的工程是用的FSMC通信来接收STM32的数据,所以这里直接用的以前的工程代码。稍微改了一下接口。
2.控制模块
这个是我们要写的核心模块,主要是完成接收更新包和把更新包写入FLASH的控制时序。
3.FPGA和FLASH的SPI通信模块。
这个模块主要是把更新包写到FLASH里面。这个可以找现有的模块直接调用。其实就是一个FLASH的读写模块。

3.GOLDEN模块仿真

因为FLASH的通信模块不是我自己写的,目前我用TESTBENCH仿真的时候因为收不到FLASH的返回数据到处卡死,正在慢慢调试。仿真通过了再用以前的板子试一下实际使用效果。
整整弄了两天,差不多把仿真跑通了,头都弄晕了。主要是因为FLASH每次读写都需要查询状态寄存器,TESTBENCH给的返回值没给对就会卡死。把我弄晕的是他里面有三个相互嵌套的状态机,第一个是n25q_spi_block模块里面的,每次向FLASH里面写入256BYTE数据;第二个是n25q_ctrl_module模块里面的,查询FLASH的状态参数;第三个是prog_file模块里面的,与用户的模块交互,缓存数据。

4.正常工作时的更新问题

我发现一个问题,在第一次完成更新之后,每次开机就直接进去M镜像工作了。那我第二次更新的时候怎么回到G镜像去进行更新呢?
我开始想的是在M镜像里面也写一个和G镜像一模一样的模块,不过发现会和我正常工作的其它模块冲突,不知道这个是怎么操作的。
2022.11.29更新:

  1. 首先写好GOLDEN工程,你在VIVADO里面编译好了之后生成mcs文件,生成的时候VIVADO会告诉你文件大小,你就把这个地址写到工程里面做为updata工程写入FLASH的超始地址就行了。
    在这里插入图片描述
  2. 比如我的GOLDEN工程生成的MCS文件大小是0x00136C17,算下来一共要写FLASH的20个扇区。那我的UPDATA程序就从第21个扇区开始写FLASH。把从第21个扇区开始写FLASH这个地址加入到GOLDEN程序的XDC文件之后,又重新编译一次,大小应该不会变。这个GOLDEN程序就完成了。
set_property BITSTREAM.CONFIC.CONFICFALLBACK Enable [current_design]
set property BITSTREAM.CONFIG.NEXT CONFIG ADDR 32 h003E0000
  1. 在UPDATA工程里面也添加GOLDEN工程的模块(我是把GOLDEN工程生成了一个IP核,在UPDATA工程里面调用的),编译生成mcs文件。
  2. 把GOLDEN工程和UPDATA工程合并成一个mcs文件,烧到FLASH里面。
  3. 开机时后直接跳到UPDATA工程运行,现在如果想更新,由UPDATA工程对FLASH进行擦除和写入新工程。
  4. 如果在更新过程中由于断电等原因失败,导致UPDATA区域被擦除,在开机后不能正常跳转到UPDATA区域,会在通过看门狗跳到GOLDEN工程运行,这时可以再次执行更新操作。

5.实际工程问题

最近在帮一个网友解决远程更新问题时,碰到一个关于跳转的问题。
他在开机上电时,怎么都不能正常跳转到UPDATA的区域进行加载,我查了他的XDC文件,里面也设置了跳转区域,后来说用ICAP原语就能正常加载了。
最后发现原因是他一直挂着JTAG,处于调试模式,所以用ICAP相当于在程序内跳转,但是开机就没有执行XDC里面的命令。

6.实际工程下载链接

2023.03.09更新,如有问题可留言或者私信。
https://download.csdn.net/download/pp_0604/87545283

2023.05.16
发现一个工程上的问题:
用VIVADO烧写FLASH时老是报错,找不到FLASH芯片。
原因:用了FPGA远程 更新程序,把FLASH的引脚占用了。
现象:如果FLASH里面已经有了FPGA远程更新的程序,开机用JTAG就找不到FLASH。如果FLASH里面没有FPGA远程更新的程序,用JTAG能找到FLASH,但是如果在线调试了远程更新的代码,即使重新在线挂了别的程序,也无法解除FLASH片选引脚的占用。必须重新开电。
分析:应该是FLASH引脚被占用的原因。在FPGA的启动配置项里面,本项目用的是MASTER SPI,也就是开机读取FLASH进行启动。
一般的FPGA开发板会有开关切换启动模式,如果设置成JTAG启动,应该就可以通过JTAG对FLASH进行烧写;设置成FLASH启动,则可以通过远程更新进行烧写。

总结

根据进度随时更新此文档。~~

  • 12
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
在实际工程应用中,我们时常会遇到为解决某个老产品的BUG,需要在工程现场更新设备的FPGA代码,或者参加电信测试时需要现场升级设备FPGA程序以便于调试。公司现阶段所用的Altera FPGA程序代码一般存放于芯片配套的FLASH存储器中,而常见的对印制板上FLASH编程有几种方法,原始的方法是使用编程器,这种方法需要要将芯片取下,十分不便,或者通过JTAG接口连接到PC机上,但需要专用下载软件(一般由芯片生产厂商提供)。在测试现场或调测机房现场,要找到FPGA的专用下载线是比较困难的,且Altera FPGA的专用下载软件并不是每个PC设备上都有的。有时仅为了更新一个FPGA程序就需要研发或客服人员亲自到现场去烧写程序,这既不便捷,也使得设备维护成本大大增加。  经过可行性与成本的考虑,我们找到一种既方便实用又低成本的方法来实现FPGA程序在线升级。即在MCU中(单片机或ARM均可)用软件来模拟XModem协议,将程序文件传输到FPGA的FLASH中。这种方法使用WINDOWS自带的超级终端软件来传送文件,无需安装专用软件,硬件支持仅需要一根通用串口线,只要在目标板MCU上增加一段实现XModem协议传输的代码,就可以方便的实现FPGA程序下载了。这种特点不仅方便了客服人员,也给研发和生产人员在现场调试和软件升级、修改中带来极大方便。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pp_0604

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值