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

在远程更新的时候 , 有时候需要双镜像来保护设计的稳定性 。在进行更新设计的时候 , 只更新一个镜像 , 另一个镜像在部署之前就测试过没问题并不再更新 。当更新出错时 , 通过不被更新的镜像进行一些操作 , 可以将更新失败的数据重新写入Flash 。这样即使更新出错 , 也能保证设计至少可以被远程恢复 。
的双镜像方案成为 。本文对 7系列的做一些简单介绍 。
直接操作的是两个镜像 , 但实际上可以用于多个镜像 。为了便于描述 , 中的两个镜像分别成为G镜像()和M镜像() 。
远程更新的方案 , 有一些是通过FPGA来读写Flash的 , 例如平台下需要自己实现的Flash读写控制器 , 平台下的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
从上图可以看到 ,  7系列FPGA的方案是从基地址开始存放G镜像 , 后续存放M镜像 。加载过程中是先加载M镜像 , 配置完成后如果成功 , 则运行M镜像;如果运行失败 , 则重新加载G镜像 。
下面就从需要完成的两个任务 , 结合上图来进行介绍 。
先看第一个任务 , 加载M镜像 。
上电完成之后 , FPGA就会按照设置 , 进行加载操作 。在主动模式下 , FPGA会开始对Flash的操作 , 尝试读取Flash中存储的配置镜像数据 。需要注意的是 , 主动模式下的这一系列操作都是FPGA自动完成的 , 用户无法控制 。
所以就出现了第一个问题 。既然读取操作是自动的 , 那么FPGA是如何知道M镜像存储在哪里 , 并先加载M镜像呢?如果是从0地址开始读取 , 那么应该先完成G镜像的加载 。否则 , 是否使用及M镜像的地址 , 是如何传递给FPGA、让FPGA知晓呢?
的方案中的解决办法是使用一条加载命令:IPROG 。而这条命令 , 是放在G镜像中 。
具体说 , 对于FPGA直接从0地址开始读取 , 先开始加载G镜像 , 但是这个G镜像是经过特别处理的 , 在镜像数据刚开始的部分添加了IPROG命令和M镜像的地址 。当FPGA读取到这个命令之后 , 就会直接跳过后面的数据 , 从设置的地址开始继续加载 。这样的操作 , 导致G镜像只是运行了最前面的几条加载命令 , 而M镜像也只是等了几条命令的操作就开始加载了 , 保证了M镜像的直接加载 。