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

相关文章

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

linux安装、更新、卸载anaconda实践

《linux安装、更新、卸载anaconda实践》Anaconda是基于conda的科学计算环境,集成1400+包及依赖,安装需下载脚本、接受协议、设置路径、配置环境变量,更新与卸载通过conda命令... 目录随意找一个目录下载安装脚本检查许可证协议,ENTER就可以安装完毕之后激活anaconda安装更

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录