Xilinx 7系列FPGA Multiboot介绍-远程更新

2023-10-23 11:30

本文主要是介绍Xilinx 7系列FPGA Multiboot介绍-远程更新,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在远程更新的时候,有时候需要双镜像来保护设计的稳定性。在进行更新设计的时候,只更新一个镜像,另一个镜像在部署之前就测试过没问题并不再更新。当更新出错时,通过不被更新的镜像进行一些操作,可以将更新失败的数据重新写入Flash。这样即使更新出错,也能保证设计至少可以被远程恢复。
Xilinx的双镜像方案成为Multiboot。本文对Xilinx 7系列的Multiboot做一些简单介绍。


Multiboot直接操作的是两个镜像,但实际上可以用于多个镜像。为了便于描述,Multiboot中的两个镜像分别成为G镜像(Golden)和M镜像(Multiboot)。
远程更新的方案,有一些是通过FPGA来读写Flash的,例如Xilinx平台下需要自己实现的Flash读写控制器,Altera平台下的ASML IP。当无法提供JTAG等其他连接时,Flash的更新就只有FPGA一种方案。
当写入Flash的操作出现错误,或者Flash中部分地址中的数据出现错误,导致无法正确写入或者存储的数据出现错误,这样会导致FPGA无法加载成功。
当FPGA无法加载成功或者工作不正常的时候,Flash的读写操作也就无法得到保证。此时也就不能重新通过远程更新方案来重新读写Flash,纠正之前的错误。所以可以看到,如果Flash直接由FPGA控制,当远程更新出现错误时,很可能导致远程更新彻底失效,只能安排现场更新来修复。
对应方案就是使用双镜像(多镜像),更新的时候只更新M镜像,更新后直接使用M镜像。当出现M镜像更新出现错误的时候,则启动G镜像。通过G镜像中的设计来重新更新Flash中M镜像部分的数据。
由于G镜像从来没有被更新过,这样出现错误的概率也就非常小。这样即使M镜像出现错误,可以通过G镜像来完成一些工作(例如Flash读写操作),由此来保证设计一直可以使用。
从这个分析可以看出,双镜像的方案,需要完成两个任务。
1.正常情况下,加载完成时应该是M镜像在运行
2.出现错误的时候,需要返回G镜像


图片来自UG470
从上图可以看到,Xilinx 7系列FPGA的Multiboot方案是从基地址开始存放G镜像,后续存放M镜像。加载过程中是先加载M镜像,配置完成后如果成功,则运行M镜像;如果运行失败,则重新加载G镜像。
下面就从需要完成的两个任务,结合上图来进行介绍。
先看第一个任务,加载M镜像。
上电完成之后,FPGA就会按照设置,进行加载操作。在主动模式下,FPGA会开始对Flash的操作,尝试读取Flash中存储的配置镜像数据。需要注意的是,主动模式下的这一系列操作都是FPGA自动完成的,用户无法控制。
所以就出现了第一个问题。既然读取操作是自动的,那么FPGA是如何知道M镜像存储在哪里,并先加载M镜像呢?如果是从0地址开始读取,那么应该先完成G镜像的加载。否则,是否使用Multiboot及M镜像的地址,是如何传递给FPGA、让FPGA知晓呢?
Xilinx的Multiboot方案中的解决办法是使用一条加载命令:IPROG。而这条命令,是放在G镜像中。
具体说,对于FPGA直接从0地址开始读取,先开始加载G镜像,但是这个G镜像是经过特别处理的,在镜像数据刚开始的部分添加了IPROG命令和M镜像的地址。当FPGA读取到这个命令之后,就会直接跳过后面的数据,从设置的地址开始继续加载。这样的操作,导致G镜像只是运行了最前面的几条加载命令,而M镜像也只是等了几条命令的操作就开始加载了,保证了M镜像的直接加载。
需要说明的是IPROG这是一条命令,所以既可以在G镜像中生效,也可以在设计中任意使用。用户可以将IPROG命令发给ICAP,来实现任意时间触发重新加载的需求。通过设置合适的地址,可以实现多个镜像的切换。


图片截取自Vivado
从vivado中的设置可以看出,Multiboot的主要设置只有这6个。第一个成为Fallback,最后一个成为Watchdog。这两个下文会做介绍。第四个第五个是关于RS pin。等熟悉Multiboot理解之后可以查看文档进行理解,本文不做深入介绍。
第二个是设置跳转到的地址、第三个是在G镜像中加入IPROG命令。这两个操作可以以命令的形式发给ICAP接口,从而触发Multiboot中转跳并加载新的镜像数据。
看完上述的分析,应该明白如何实现先加载M镜像这个需求了。下一步就是,在加载失败时如何回退到G镜像。
M镜像加载不成功,需要回退到G镜像的操作,Multiboot方案称这一步骤为Fallback。
Fallback在四种条件下会被触发:

1. ID Code错误
2. CRC错误
3. Watchdog超时
4. BPI地址越界
ID Code错误是指配置文件中的器件型号和当前器件不匹配。CRC校验是指配置数据送入FPGA之后会进行校验,如果数据不一样则会提示CRC错误。这两个基本原理比较容易理解,至于具体细节,需要能解析bit文件的内容之后才能充分理解。
Watchdog超时是指在规定的时间内如果无法配置成功,则触发Watchdog超时,进而会导致Fallback。
BPI地址越界是指发现逐步增长的BPI地址超过最大值,发生溢出,回到0,则除法Fallback。
大概理解一下四个条件之后可以看到,BPI是只针对BPI模式的,和Watchdog有一点类似,都是在一段时间内如果没有加载成功,地址会逐步增加,计时器会逐步增加,超过范围后就触发Fallback,所以BPI就不做进一步解释了。
ID Code也不做进一步解释了,因为ID Code不对,大概率是用错镜像文件了。所以也没有太多可以分析的。
重点是2和3,当存在Multiboot镜像的时候,如M镜像的内容出现问题,则会触发CRC校验错误,这样可以保证镜像加载成功之后,数据是没有问题的。
但是如果没有Multiboot镜像,则CRC校验无法进行,或者加载到一半就挂死了。这个时候就需要Watchdog来触发Fallback。只要一定时间内加载没有完成,就一定会触发Watchdog超时。
所以CRC是用来保证加载正确的,Watchdog是用来保证一定会提示加载失败的。
注意,Watchdogd的计时设置,请设置好然后实际测试一下,而不要仅仅凭经验/文档来推断一个合适的值。
当发生了Fallback之后,工程会反跳回0地址开始加载,从新加载G镜像。这里,FPGA内部的配置寄存器会做记录,当发生Fallback之后,会自动忽略IPROG命令,直接加载G镜像后续的部分,来保证G镜像有机会被完整的加载。
FPGA自带一些寄存器,记录了FPGA加载时的一些状态,通常称为device status寄存器。当初出现加载失败的问题时,可以通过JTAG查看相关寄存器来寻找一些线索,帮助定位问题。
通过这一系列复杂的操作,可以实现双镜像的配置切换。这种方法最大的优点就是速度快。在配置完成之后可以快速的跳转、加载和返回。最关键的双镜像选择这一步是在加载初期就进行转跳,所以跳转非常迅速,适合一些对配置时间有要求的场合。缺点就是原理和设置都相对麻烦了一些。
和上述方法不一样的一个双镜像切换的方法就是用户自行做切换。大致原理是用户利用FPGA的可编程逻辑资源对ICAP模块进行控制,输入需要跳转的地址然后输入IPROG命令,来触发跳转操作。这个操作是需要先加载好G镜像并开始运行,然后由用户来控制什么时候进行跳转。
这样操作的优点有:
1.跳转地址由用户自行选择,所以可以在多个镜像中跳转,而不限于两个;
2.可以选择在合适的时间进行加载,用户选择性更大。
主要缺点:
1.需要对配置过程、ICAP端口和控制命令有更多的理解
2.需要加载完至少一个镜像才能使用,所以对配置时间要求高的场景无法使用
如果仅仅是为了远程更新,那么这个方案,并不合适。用自动的双镜像方案更简单易用一些。只要G镜像调试完毕,整个方案对M镜像的要求比较低。

 

参考链接:1、https://zhuanlan.zhihu.com/p/46239005

2、https://www.cnblogs.com/chensimin1990/p/9067629.html

3、Xilinx FPGA程序升级(https://mp.weixin.qq.com/s/JcyvH0Nr29QM_gtUBXFc8A)

4、http://xilinx.eetrend.com/d6-xilinx/article/2014-04/7009.html

5、https://blog.csdn.net/Reborn_Lee/article/details/88937338

 

这篇关于Xilinx 7系列FPGA Multiboot介绍-远程更新的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/267539

相关文章

Oracle 通过 ROWID 批量更新表的方法

《Oracle通过ROWID批量更新表的方法》在Oracle数据库中,使用ROWID进行批量更新是一种高效的更新方法,因为它直接定位到物理行位置,避免了通过索引查找的开销,下面给大家介绍Orac... 目录oracle 通过 ROWID 批量更新表ROWID 基本概念性能优化建议性能UoTrFPH优化建议注

Java中 instanceof 的用法详细介绍

《Java中instanceof的用法详细介绍》在Java中,instanceof是一个二元运算符(类型比较操作符),用于检查一个对象是否是某个特定类、接口的实例,或者是否是其子类的实例,这篇文章... 目录引言基本语法基本作用1. 检查对象是否是指定类的实例2. 检查对象是否是子类的实例3. 检查对象是否

什么是ReFS 文件系统? ntfs和refs的优缺点区别介绍

《什么是ReFS文件系统?ntfs和refs的优缺点区别介绍》最近有用户在Win11Insider的安装界面中发现,可以使用ReFS来格式化硬盘,这是不是意味着,ReFS有望在未来成为W... 数十年以来,Windows 系统一直将 NTFS 作为「内置硬盘」的默认文件系统。不过近些年来,微软还在研发一款名

Redis中6种缓存更新策略详解

《Redis中6种缓存更新策略详解》Redis作为一款高性能的内存数据库,已经成为缓存层的首选解决方案,然而,使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性,本文将介绍Redis中6种缓存更... 目录引言策略一:Cache-Aside(旁路缓存)策略工作原理代码示例优缺点分析适用场景策略二:Re

Pandas利用主表更新子表指定列小技巧

《Pandas利用主表更新子表指定列小技巧》本文主要介绍了Pandas利用主表更新子表指定列小技巧,通过创建主表和子表的DataFrame对象,并使用映射字典进行数据关联和更新,实现了从主表到子表的同... 目录一、前言二、基本案例1. 创建主表数据2. 创建映射字典3. 创建子表数据4. 更新子表的 zb

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -