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


需要说明的是IPROG这是一条命令 , 所以既可以在G镜像中生效 , 也可以在设计中任意使用 。用户可以将IPROG命令发给ICAP , 来实现任意时间触发重新加载的需求 。通过设置合适的地址 , 可以实现多个镜像的切换 。
图片截取自
从中的设置可以看出 , 的主要设置只有这6个 。第一个成为 , 最后一个成为 。这两个下文会做介绍 。第四个第五个是关于RS pin 。等熟悉理解之后可以查看文档进行理解 , 本文不做深入介绍 。
第二个是设置跳转到的地址、第三个是在G镜像中加入IPROG命令 。这两个操作可以以命令的形式发给ICAP接口 , 从而触发中转跳并加载新的镜像数据 。
看完上述的分析 , 应该明白如何实现先加载M镜像这个需求了 。下一步就是 , 在加载失败时如何回退到G镜像 。
M镜像加载不成功 , 需要回退到G镜像的操作 , 方案称这一步骤为 。
在四种条件下会被触发:
1. ID Code错误
2. CRC错误
3. 超时
4. BPI地址越界
ID Code错误是指配置文件中的器件型号和当前器件不匹配 。CRC校验是指配置数据送入FPGA之后会进行校验 , 如果数据不一样则会提示CRC错误 。这两个基本原理比较容易理解 , 至于具体细节 , 需要能解析bit文件的内容之后才能充分理解 。
超时是指在规定的时间内如果无法配置成功 , 则触发超时 , 进而会导致 。
BPI地址越界是指发现逐步增长的BPI地址超过最大值 , 发生溢出 , 回到0 , 则除法 。
大概理解一下四个条件之后可以看到 , BPI是只针对BPI模式的 , 和有一点类似 , 都是在一段时间内如果没有加载成功 , 地址会逐步增加 , 计时器会逐步增加 , 超过范围后就触发 , 所以BPI就不做进一步解释了 。
ID Code也不做进一步解释了 , 因为ID Code不对 , 大概率是用错镜像文件了 。所以也没有太多可以分析的 。
重点是2和3 , 当存在镜像的时候 , 如M镜像的内容出现问题 , 则会触发CRC校验错误 , 这样可以保证镜像加载成功之后 , 数据是没有问题的 。

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

文章插图
但是如果没有镜像 , 则CRC校验无法进行 , 或者加载到一半就挂死了 。这个时候就需要来触发 。只要一定时间内加载没有完成 , 就一定会触发超时 。
所以CRC是用来保证加载正确的 , 是用来保证一定会提示加载失败的 。
注意 , 的计时设置 , 请设置好然后实际测试一下 , 而不要仅仅凭经验/文档来推断一个合适的值 。
当发生了之后 , 工程会反跳回0地址开始加载 , 从新加载G镜像 。这里 , FPGA内部的配置寄存器会做记录 , 当发生之后 , 会自动忽略IPROG命令 , 直接加载G镜像后续的部分 , 来保证G镜像有机会被完整的加载 。
FPGA自带一些寄存器 , 记录了FPGA加载时的一些状态 , 通常称为 寄存器 。当初出现加载失败的问题时 , 可以通过JTAG查看相关寄存器来寻找一些线索 , 帮助定位问题 。
通过这一系列复杂的操作 , 可以实现双镜像的配置切换 。这种方法最大的优点就是速度快 。在配置完成之后可以快速的跳转、加载和返回 。最关键的双镜像选择这一步是在加载初期就进行转跳 , 所以跳转非常迅速 , 适合一些对配置时间有要求的场合 。缺点就是原理和设置都相对麻烦了一些 。