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 问答记录里也有相应的解决方案说明哦,自己去搜吧,祝你好运!

flash 怎么擦掉fpga_升级固件写FLASH如何避免让FPGA发生意外?相关推荐

  1. flash 怎么擦掉fpga_基于FPGA的flash板卡程序擦除与固化

    1.擦除程序,程序擦除是可以用软件,但本文主要讨论用代码实现擦除.擦除已经固化好的程序需要对flash芯片(M25P94)的时序进行描述.时序原理如图所示: 这里主要是对flash的前8个扇区进行擦除 ...

  2. flash 怎么擦掉fpga_SPI FLASH学习笔记(三)擦除操作

    Block Erase (D8H) BLOCK ERASE(D8H)命令用于在块级别擦除.每块有64页,每页2176字节(2048 + 128字节).每个块为136 KB. BLOCK ERASE命令 ...

  3. 乐鑫esp8266学习rtos3.0笔记:仅1M flash 的安信可 ESP-01S 模块,如何二次开发?如何对其 OTA 远程升级固件!

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个" ...

  4. 【STM32】FLASH擦写+FLASH相关操作+注意事项

    有关FLASH读写的函数: 有关库函数: 实现掉电不丢失的主函数(Flash一定要先擦后写): #define FLASH_START_ADDR 0x0801f000 //写入的起始地址int mai ...

  5. flash写保护原理_【转】NOR Flash擦写和原理分析

    概述 Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次 ...

  6. nand读寿命_Nand Flash的擦写次数与使用寿命

    Nand Flash的擦写次数与使用寿命 作者: 来源: 发布时间:2019-09-04 20:28:27   浏览:2086 Nand Flash因为其电气特性,读和写是按页来读取的,而擦除是按照块 ...

  7. Microchip PIC24F dsPIC33E flash 自擦写的尿性小结

    最近摸了好久,发现这个东西真的难, MHCP 这套16bit  体系flash的擦写操作,分为ICSP和RTSP两种方式,前者就是常见的官方pickit/ICD编程烧写操作时序.而后者是为bootlo ...

  8. 提高FLASH的擦写次数 “空间换时间”

    提高FLASH的擦写次数 一.平时正常的读写,及损耗 二. "空间换时间" 三.数据结构 一.平时正常的读写,及损耗 Flash操作是往里面写0,按照平时的逻辑,每次参数发生了改变 ...

  9. silicon labs平台通过串口升级固件方案

    开发环境 windows simplicity studio 5 geck sdk 4.1 一 bootloader 新建BGAPI UART DFU工程 工程新建完成以后看一下linkerfile. ...

  10. c语言 编译 flash,DSP-C2000 flash编程,自己定义的烧写函数在主函数中运行无法通过...

    2018-11-23 14:47:04 评论 提交评论 您好, 的确,Flash API 函数的调用必须在 RAM 中执行.对于 Flash API 函数具体的调用方法,可以参考 ControlSUI ...

最新文章

  1. Android Handler的使用!!!
  2. 群晖 emby_NAS上安装emby,打造家庭媒体中心
  3. 算法----打印二叉树最右侧的节点 Java版
  4. Visual studio那些破事。。。(生成静态库、生成动态库、引用静态库、引用动态库)
  5. python中os.path.join()的循环用法_Python中.join()和os.path.join()两个函数的用法详解
  6. 汇编-简单的条件转移指令应用-附例子:判断坐标所在象限
  7. 数字基带传输学习笔记00引言
  8. 电脑表格制作教程入门_第三节 CorelDRAW制作作品的流程 - CorelDRAW基础入门教程 - 平面设计学院...
  9. Apple Notification Center Service--ANCS【转】
  10. 带你看论文丨全局信息对于图网络文档解析的影响
  11. OCIEnvCreate 失败,返回代码为 -1的解决方法
  12. oracle 中查找不连续的数的最前一个值
  13. 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
  14. 成品app直播源码,RecyclerView实现自动滚动效果
  15. 2022年最新宁夏机动车签字授权人模拟试题及答案
  16. Android 適配器的回調
  17. 手机电池-市场现状及未来发展趋势
  18. 北京小升初计算机编程特长生班,北京特长生小升初测试启动 家长凌晨排队取号 图...
  19. SQL日期时间常用格式化方法
  20. iOS QRcode识别及相册图片二维码读取识别

热门文章

  1. 20210219 plecs为不同的PWM 配置不同的死区时间
  2. 【oracle】中文数字转阿拉伯数字
  3. qq表情包html插件,jQuery QQ表情插件jquery.qqFace.js
  4. f分布表完整图a=0.01_第7章 分布分析
  5. 吴恩达深度学习第一周课程学习笔记
  6. 小米597页招股书中的数据干货,全在这里了!
  7. 数据库工程师基础学习1----计算机硬件基础知识,计算机体系结构与存储系统
  8. 我的世界高亮显示服务器,waila(我的世界高亮显示没了)
  9. java 集合练习题2
  10. 松下plc安装序列号afpsgr7_松下fpwin gr7下载 Control FPWIN GR7(松下plc编程软件) v2.21 中文安装版(附序列号) 下载-脚本之家...