本文来自amd xilinx工程师 ivy guo。
multiboot 是 fpga 远程更新配置文件时一种非常普遍的应用--为了确保安全,我们通常需要安排一个 golden image,升级失败后 fpga 能回跳 (fallback) 到此配置,从而使 fpga 始终处于可被检测的工作状态。
很多客户有同样的问题:我在升级 update image 一半时突然掉电了,为什么回跳机制不起作用了呢?fpga 怎么挂死了呢?其实这个现象是符合预期的,回跳机制不能应付这种异常。如果配置文件写到一半突然中断,嵌在配置数据流里面的指令序列同样也没有了,并且有可能中断在任意位置。fpga 的控制逻辑此时就失去了工作方向,不知道下一步该做什么。
xapp1247, appendix a提供了一个很好的解决方案。利用两个 timer 或者称之为 barrier 的小image,嵌在 golden 和 update 之间或附在 update 之后,通过合理的给两个 timer 赋值,可以解决 update image 刷新时同步字丢失或者半程掉电的情况。
但是同时又有客户提出了问题:我的应用对回跳时间要求很高,xapp1247,appendix a的方案对于半程掉电的场景,只有搜索完整个 update image 区域,看到 timer#2 的设置才能完成回跳。有没有办法缩短这段时间呢?
multiboot 的跳转实际上是非常灵活的,我们这里就尝试提供一种思路:
1. 去掉 timer#2,只保留 timer#1 作为 golden 和 update image 之间的 barrier image。
2. update image采取从后往前倒着烧录的办法。(在实际应用中,烧写 flash 都是用cpu/mcu/fpga 控制或者第三方编程器实现的,所以这一点也很容易实现)。
3. 精确设定 timer#1的值,使其看到update中的timer指令及赋值但不需更多。
工作原理
timer 寄存器的值只有在 power-cycle 或者 prog_b 过程中才能被清除,或者被新的 timer值覆盖,或者在整个配置数据加载完毕后自动失效。
我们通过精确设定 timer#1的值,使 fpga 控制逻辑有足够时间看到 update image 中新的timer 值。timer 指令位于 image 的头部。因为 update image 是倒着写入的,能看到新的timer 值,说明 update image 基本已经更新好了。由于新的 timer 值是足够控制逻辑加载完整的配置数据的,timer 寄存器被新值更新后,timer#1 相当于失效了。fpga 有充足时间可以顺利读入完整配置数据,开启正常工作。
如果由于断电等原因,update 更新到一半就停止了,此时会缺失 update 的同步字,timer指令等等位于头部的信息。timer#1 在一个有限的时间内搜索 update timer 但是没有看到,timeout 之后就会直接触发回跳。因此不用等待搜索整个 update 存储空间完毕,依靠尾部的timer#2 才能触发回跳了。
整个解决方案的重点就在于设定 timer#1 的值。
这个其实很简单,根据你自己生成的 timer#1和update的mcs文件 (方法参考xapp1247),计算一下 timer#1 的指令到 update 的 timer 之间的字节数即可。
以 ku040 的 bit 为例,观察 update image 头部的命令/数据序列,可以看到有 3002 2001,这就是设置 timer 寄存器的命令timer。我们想timer#1的时间足够看到 update 中的3002 2001命令以及赋值,其他不需要了,随意添加几个 cycle 或者几个字的裕量即可。
比如我们设到3000 8001,多3个字的余量。
timer的格式如下:
barrier/timer#1 里从 timer 及赋值开始,后面有两个 noop 字,加上后续 update 里从ffffffff 开始直到 3000 8001 有28个字,一共30个字,那么就是30*32=960 bit。spix1 串行配置中,一个 cclk 读取一个 bit,所以
timer#1 的值设置为 h‘3c0.
如上图,30 03 e0 01是把 bus width 从默认的 x1 切到 x4 的命令。如果在读入 timer#1 之前中执行了该命令(比如 golden 里面),那么 timer#1 的值需要按照一个 cclk cycle,读取4个 bit 来计算。和 timer 命令类似,在 fpga 控制逻辑读取数据的过程中,如果没有碰到新的30 03 e0 01设定新的数据宽度,那么将一直按照之前设定的 bus width 来读入数据或者指令。
假设 timer#1 以及 update 都是以x4读取的,那么 timer#1 需设为 h’f0.
综上,通过合理设定 barrier#1 中的 timer#1 数值,我们可以极大地缩短升级掉电这种multiboot 失效场景的回跳时间。
中国家电面临六大变化和趋势
FCM980-B专门短波通信设计的综合智能终端是一个高性价比的产品
介绍一款仿真器v2e
温度PLC控制系统的PID控制要求
内存套条和单条的区别
缩短MultiBoot流程中的回跳 (Fallback)时间
正弦波信号发生器基本原理与设计
机器视觉助力物流分拣,发展空间巨大
广东电网出台了竞争性业务发展行动计划将大力拓展综合能源供应业务
AGV小车监控系统的组成、功能与特点分析
手机芯片排名2021最新
中国最美机器人到底长啥样
PCB行业高科技智能化设备的引领者—江西鑫金晖智能科技有限公司
半导体工艺演进对DRAM、逻辑器件和NAND的影响
倪健中参观调研非遗电商博物馆
三星S8这一创新令iPhone 8尴尬:能变身PC办公!
人工智能,自动驾驶的思维起步
儿童点读笔如何挑?首选孩子们都爱玩的阿尔法蛋点读笔
【虹科新闻】虹科入选广州市“专精特新”民营企业扶优计划培育企业
铁三角在CES 2019上发布三款新降噪蓝牙耳机