一、概述
对于成熟的电子产品,高效稳定的工作是非常重要的一项指标。而一款刚推向市场的产品则需要研发人员或者技术维护人员进行必要的维护或者更新,以求达到更稳定的效果。对于FPGA的逻辑更新来说,因为它直接贴在板卡上,如果将板卡从产品中将拆卸下来是非常的不方便。QuickBoot 提供了FPGA逻辑远程更新近乎完美的解决方案。
二、QuickBoot原理
该方案是通过在FPGA内部增加额外的逻辑功能,无需改变硬件电路,只需要将原来的配置芯片的容量扩大(如果需要的话)。上位机可以通过以太网、PCIe、USB等将更新数据发送到FPGA,FPGA再通过配置接口将数据传输到Flash Memory。FPGA可以通过自动从Flash下载数据,从而完成逻辑远程更新,如果配置过程中发现配置出错,或者CRC校验失败,那么FPGA就会从存放正确位流区域(golden bitstream area)下载数据。
QuickBoot提供以下主要功能:
< 支持全部的7系列FPGA
< 基于HDL的flash programmer参考设计
< 远程更新代码最小化,更新位流和原设计位流大小基本一样
< 简单的可编程传输接口协议
< 内部远程错误自修复/自动返回golden 位流
< 快速的配置时间
< 可兼容多个配置方式:BPI/SPI/加密位流/多片FPGA菊花链配置
三、QuickBoot远程更新流程
QuickBoot远程更新流程框图如下图所示:
QuickBoot远程更新设计的关键有两点:
1、是如何通过FPGA实现自动更新Flash。
2、如果发现配置错误的话如何自动将原来golden 设计重新配置到FPGA。
为此QuickBoot制定了如下一套机制:
由于FPGA配置是从flash的0地址开始读取数据,所以将QuickBoot Header 放在0地址非常关键。QuickBoot Header包括两个部分,第一部分就是关键开关字,第二部分就是热启动跳转序列。
关键开关字,根据配置模式的不同而不同,如BPI模式就是0x00 00 00 BB,而SPI模式就是0x0xAA995566。
如果关键开关字是ON,那么就执行热启动跳转序列,热启动跳转序列包含了需要跳转的地址。然后就跳转到update bitstream area。并且将update bitstream下载下来。
如果关键开关字是OFF,那么就忽略热启动跳转序列,并且继续往下读取数据,这样就可以将golden bitstream area的数据下载到FPGA。
四、QuickBoot的实现
QuickBoot的实现主要包含以下几个关键点:
1、关键开关字的控制。
2、Flash 存储器与QuickBoot flash 模块的地址映射。
3、位流包的大小以及Flash 存储器大小的确定。
4、QuickBoot配置时间
5、QuickBoot验证update bitstream的正确性
一、关键开关字的控制
关键开关字为ON:就是关键开关字存储地址含有准确的、预先设置的值,对于BPI是0x000000BB,对于SPI是0xAA995566。
关键开关字为OFF:就是关键开关字存储地址不含有准确的、预先设置的值。
QuickBoot flash programmer Algorithm:
1、擦除存放关键开关字的块或者sector,使得关键开关字变成OFF。
2、擦除更新包存放的区域。
3、将update bitstream 写进到更新包区域。
4、验证update bitstream的正确性。
5、验证完成之后写开关关键字,使之变成ON。
所以在验证update bitstream正确之前不能将关键开关字设置为ON。验证完成之后需要将开关关键字设置为ON。
二、Flash 存储器与QuickBoot flash 模块的地址映射
我们以Micron N25Q flash memory为例说明Flash 存储器与QuickBoot flash 模块的地址映射关系,如下图所示
从0地址开始存放数据,因为一个地址是代表一个字节,所以对于一个32bit的数据需要4个地址来代表也就是地址的递增是以4为单位递增的。0x0000_0000~0x0000_0FFC对应的是QuickBoot Header PART1。0x0000_1000~0x0000_1020是QuickBoot Header PART2。紧接着 PART2存放的是golden bitstream。跳转地址是0x0020_0000,所以从这个地址开始存放的是update bitstrean,紧接着是update bitstrean的是0xffffffff填充字,最后32bit是CRC校验值。
三、位流包的大小以及Flash 存储器大小的确定
根据xilinx公司提供的ug470_7series_config.pdf page13 我们可以看到如下表
我们可以得到XC7K160T的bit文件大小是53Mbit.所以一般情况下存放该位流至少需要64Mbits的FLASH。如果作为远程更新用的存储芯片大概就需2x64Mbits=128Mbits。
依据上表我们可以算出我们所需flash大小:
L1=32768bit,L2=256bit,L3=53540576bit,L4=53573600bits。
L5=524288bit,L6=103blocks,L7=54001664bit,L8=52Mbit,L9=108003328bit,
L10=104Mb。
目前R-OTDR板使用的SPI FLASH是S25FL064P,所以应该选用一款PIN-TO-PIN完全兼容且容量为128Mbit大小的SPI flash。
四、QuickBoot配置时间
QuickBoot 配置时间将比标准的配置时间多一点点。从下表可以看出。
五、QuickBoot验证update bitstream的正确性
QuickBoot 将标准的bitstream转换成image的步骤如下:
1、生成标准的bitstream。
2、将填充字0xffff_ffff填充到剩下的update area。
3、将bitstream和填充字一起计算出CRC值,并且将它放在image的最后32bits上。
为了验证Update Image, the QuickBoot programming solution会去读取flash中 update area的值,以及最后的CRC值。然后在FPGA中计算出一个CRC值然后再和读回的CRC值进行比较。比较正确说明校验正确,反之则是校验错误。