FPGA装备两种形式:自动装备和被迫装备方法,选用自动装备下,咱们就需要一片FLASH来存储FPGA固件,那么咱们在晋级固件写FLASH的过程中怎样防止因意外状况产生导致晋级失利而使FPGA变砖呢?下面就由笔者带领咱们来挖山掘石、一探终究。
本文首要针对Xilinx的Spartan-6和7-series FPGA。在规划FPGA的长途晋级功用时,咱们要完成以下两个目标:
1、FPGA具有晋级功用,即在正常作业状态下,FPGA能够将新的固件数据烧写到FLASH里边并在下次重启的时分能够正常加载;
2、假如晋级过程中呈现意外状况,FLASH里边原有的固件被损坏,那么FPGA能够从备份固件区发动装备,即FLASH里要有别的一份没有问题的固件备份,且FPGA能够自动跳转到这个固件区读取固件。
好了,功用需求清晰,下面就该潜下心来进行结构流程规划、时序规划、代码编写以及仿真验证了。一番辛苦劳动之后,IP规划好了,这个时分心里暗暗自喜:应该没问题,只待硬件测验啦。三下五除二,找了台机器测验了一遍,发现能够正常晋级,这个时分心里那个是乐开了花啊,一次搞定,哈哈。
接下来就要进行激动人心的防砖测验了,所以你就邀请了周围的搭档来一同见证奇观,所以测验开端,所以在晋级运转的过程中你自傲的断了电,然后你对着周围的搭档说:下面便是见证奇观的时间,所以你接通了电源,此刻你笑的是那么春色绚烂。忽然,你耳边传来一句悄悄的、温顺的耳语:老兄,你的FPGA变砖啦!“怎样可能!”,你不屑的低吼了一句,但是,当你看到那颗小小的LED灯安静的还在熟睡的时分,你傻眼了,“What the hell is going on!”,看着周围的搭档,我了解你的心境:一种被狠狠打脸的刺痛感袭上了你的心头。你埋着头绷着脸,折腾了半响没找出原因在哪,这到底是怎样回事儿呢?
FPGA晋级防砖也即支撑FALLBACK形式,赛灵思官方的辅导文档里也进行了相应的辅导阐明。关于FALLBACK形式,最重要的便是要构建起一个FLASH镜像文件,该镜像文件的架构如图1所示。
图1 FLASH镜像文件架构
关于FLASH镜像架构的信息,赛灵思官方的configuraTIon user guide里有具体阐明。图中,MulTIboot Header决议了FPGA上电之后要先从哪个固件区读取装备文件以及假如失利了该跳转到哪个固件区读取备份装备。咱们的镜像里划分了两片区域用于存储固件,别离为:AcTIve区和Old(golden)区,咱们的晋级指的便是对AcTIve区的固件进行更新,Header区和Old区的信息不改动;FPGA每次上电先从Active区读取装备文件。Old区是一份固件备份,它的效果便是当Active区由于晋级意外而固件被损坏的状况下,FPGA能够从此处发动装备。
那么,怎样确保当Active区的固件由于晋级意外被损坏时FPGA能够自动切换到Old区域读取装备文件呢?这便是咱们要阐明的问题。
FPGA晋级固件的烧写一般有两种方法,别离如下:
1、次序烧写,这是最传统的烧写方法,即不对固件进行任何更改直接往FLASH里烧写;
2、调整固件烧写次序,即对固件进行必定的修正,然后分两次烧写。
咱们在规划的时分首要想到的便是第一种方法,何况赛灵思官方文档也说了在如下状况下FPGA会跳转到备份区发动装备:
1、读取装备文件的同步字超时,此刻会触发跳转;
2、查看到固件CRC犯错,此刻会触发跳转。
依据这些说法,选用第一种方法也不会出问题啊!但是为什么就不可呢?或许仔细测验的你会发现,在擦除的过程中断电的话FPGA能够从备份区发动,在烧写的过程中断电的话FPGA就会发动失利,你,有没有感悟到什么?是不是看到了一丝丝亮光?奥特曼说过:有光的当地就有期望!你可能会问:为什么有第二种烧写方法?要怎样调整固件呢?为什么要调整呢?在这儿,我先给你必定答案:选用第二种方法彻底不会出问题。现在,咱们接着往下卖关子。
已然有上面的一系列疑问,那么咱们就需要去研讨一下ISE东西在生成固件的时分是怎样的一种打包格局。经过研讨发现两个很重要的信息:
1、装备文件的同步字在固件的首部;
2、CRC查看指令一般在固件的后部,而FPGA必须在收到CRC查看指令之后才会去查看CRC值。
前面也提到,当擦除的时分断电FPGA能够产生装备跳转,当烧写的时分断电FPGA无法进行装备跳转,提到这儿再结合上面的两条重要的发现,你或许现已为自己心中的疑问找到答案了吧?很显然,由于固件的同步字很少,所以能够很快被擦除也能够很快被写入FLASH;因而,当擦除的时分断电了,此刻固件的同步字现已损坏,而FPGA读不到同步字就会呈现看门狗超时,那么此刻FPGA就会跳转到备份区读取装备文件;当在烧写的时分断电呢?由于此刻同步字现已被正确写入,而CRC查看指令被损坏了,FPGA在装备的时分会去读CRC查看指令,直到读到停止,但是CRC查看指令被损坏了怎样办呢?没得方法啊,FPGA有一种不撞南墙不回头,撞了南墙仍然不回头的干劲和坚持,它会一直读下去,所以它就堕入死循环了,哎!你说假如爱情里也有这种精力该多好啊!
经过上面的解说,咱们会茅塞顿开:本来经过CRC过错触发FPGA装备跳转不靠谱啊!已然如此,咱们就只能在固件的同步字上做文章了。好了,不卖关子了,其实,在固件的同步字上做文章也就对应着晋级固件的烧写方法2:修正固件并调整固件的烧写次序,简略解说如下:
1、把固件的同步字修正掉,第一步烧写的时分不烧同步字;
2、当固件的其余部分烧写结束之后再独自把固件的同步字烧写入本来对应的FLASH方位处。
这样做了之后,无论是擦除过程中断电仍是烧写的过程中断电,固件的同步字都会被损坏,那么必定会触发FPGA的装备跳转,即FALLBACK必定会成功!小小剧透一下:赛灵思官网里的AR问答记载里也有相应的解决方案阐明哦,自己去搜吧,祝你好运!