SRAM 型FPGA 的配置存储器可以看成是由0 和1 组成的二维阵列,帧的高度为矩阵阵列的高度,相同结构的配置帧组成配置列,如CLB 列、IOB 列、输入输出互联(Input Output Interconnect,IOI)列、全局时钟(Global Clock, GCLK)列、BRAM 列和BRAM 互联列。配置存储器阵列由3 个独立的模块组成,即CLB 块(包含CLB、GCLK、IOB、IOI)、BRAM块和BRAM 互联块,其中这两个BRAM 块包含了SRAM 型FPGA 所有BRAM 单元的数据和互联,CLB 块则包含了FPGA 中可编程单元的所有配置信息。
不同型号的SRAM 型FPGA 列数及每列对应的帧数有所区别,且在比特流中的位置也有差异。
1.配置数据容错方案
回读是将内部配置存储器中的指定数据帧读出的过程,可以用来校验当前的配置数据是否正确。对于回读数据的校验,常用的方法有两种:一种方法是逐位比对法,另一种方法是CRC 校验。
1.1逐位比对法
逐位比对法是将回读数据帧和原始的配置文件中比特流的位映射进行逐比特比较,如下图所示,但并非所有的回读数据都被用来校验,例如配置RAM 中的数据跟用户的设计相关且处于动态变化过程中,用户逻辑比特是为了内部寄存器状态而保留的存储器位置,下图 中的Mask 过滤文件就被用来过滤配置RAM 和用户逻辑比特。可见此过程需要保存配置文件以及过滤文件,并且过滤文件的大小与配置文件相同,这样增加了系统设计需要的存储器资源,因此该方法存在一定的局限性。
1.2CRC 校验
相比之下,CRC 校验只需要保存正确的CRC结果值就能校验配置数据的正确性,对系统资源的消耗较少,因此常采用此方式进行回读校验。
回读除了用于调试和验证外,还可以通过回读校验判断配置数据是否出现单粒子翻转,并对出现单粒子翻转的回读进行刷新操作。刷新是一种简单的对FPGA配置数据进行重新写入的方法,刷新可以分为外部刷新和内部刷新两种方式。
2.刷新
2.1外部刷新
外部刷新示意图如下图所示,其中原始配置数据一般存储在外部的PROM 中,并通过JTAG 接口或SelectMAP 接口来读写配置数据,完成对内部配置RAM 的刷新操作,此方案设计较为复杂,多出的外部PROM 也增加了系统的消耗。
2.2内部刷新
内部刷新方式更加方便灵活,如下图所示,该方式不需要外部存储器,依靠内部配置的ICAP 接口完成刷新时的读写操作,大大缩短了读写时间,并简化了系统的设计。
基于配置刷新方式进行SEU 故障修复又可分为定时刷新和局部重配置两种方式。
2.3定时刷新
定时刷新就是以一定的刷新频率对FPGA 已写入的内容进行全局覆盖,该方式实现相对简单,但是由于缺乏故障检测操作,大部分资源被浪费在了纠正已有的正确数据上,且易打断FPGA 的正常工作状态,导致刷新效率较低。
2.4局部配置
而局部重配置手段则克服了这样的缺陷,和芯片的重启和完全重新配置不同,局部重配置可使新数据下载到芯片上指定的区域,而芯片的其他部分保持不变甚至仍保持正常工作状态。对于Virtex-II 系列FPGA 而言,其动态重构和局部重配置可在Slave SelectMAP 模式或边界扫描配置模式下完成,这样能有效地提高系统的工作效率和可靠性能。