• 正文
  • 相关推荐
申请入驻 产业图谱

FPGA 设计的快速启动方法与远程更新(二)

01/15 09:15
327
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

前言:本文我们介绍QickBoot实现细节,主要包括BPI和SPI配置模式下关键字含义及配置作用,以及远程升级如何规划Flash各个扇区功能,并给出BPI和SPI模式下Flash扇区规划示例。

1、关键字(Critical Switch Word)

FPGA 嵌入式系统中 “快速启动(QuickBoot)” 功能的实现依赖于以下要素:

(1)关键开关字(Critical Switch Word)

(2)闪存概览与 QuickBoot 闪存组件映射

(3)比特流镜像大小与闪存大小选择

(4)配置时间

(5)QuickBoot 更新镜像验证

1.1  关键开关字定义及配置流程中的作用

关键开关字是一个特殊的字值。只有当关键开关字的存储位置包含一个精确的、预先确定的值时,该开关才会被视为处于开启(ON)状态。

是否存在这个精确的关键开关字值,决定了 FPGA 配置逻辑是否执行热启动跳转序列。要理解关键开关字的工作原理及其特殊的 “开启(ON)” 值,需要对 FPGA 比特流以及 FPGA 的内置配置逻辑有深入的了解。

(1)Xilinx FPGA 比特流文件(.bit)的内部结构

图1:Xilinx FPGA 比特流文件(.bit)的内部结构

Xilinx FPGA 比特流文件通过由一系列 32 位字组成,由 Xilinx 设计工具生成的所有比特流,均按顺序由以下部分组成:总线宽度自动检测字、同步字、FPGA 配置的数据数据包 。

总线宽度自动检测字:FPGA 在 BPI 和 SelectMAP 模式配置开始时,使用该字来自动检测并行配置数据总线的宽度。

同步字:用于标记比特流的开始,并将配置逻辑与同步字之后的数据包的 32 位边界进行同步(适用于所有配置模式)。

包头字 :指定寄存器地址和数据字计数,用于将数据写入寄存器。包命令或数据字 (Packet command or data words):属于每个数据包的一部分。

1.2   BPI 模式下如何识别关键开关字

BPI 模式下利用 “总线宽度自动检测模式” 作为 “关键开关字” 来启动配置流程:当 FPGA 从 BPI 闪存读取数据时,FPGA 配置逻辑会一直停留在第一阶段,直到在其D[0:7] 引脚上从总线宽度自动检测模式的第一个字中检测到 (0x000000BB)即为 QuickBoot 方法的关键开关字。就 QuickBoot 关键开关字而言,FPGA 配置逻辑的后续阶段只有在找到总线宽度自动检测模式之后才会被 “开启(ON)”。

1.3     SPI 模式下如何关键开关字

在 SPI 模式下,FPGA 不使用总线宽度自动检测逻辑,当 FPGA 从 SPI 闪存读取数据时,FPGA 配置逻辑会一直停留在第一阶段,监控传入的数据以寻找同步字 0xAA995566,从而将自身与传入比特流的 32 位字边界进行同步。对于SPI模式配置,同步字即为 QuickBoot 方法的关键开关字,FPGA 配置逻辑的后续阶段只有在找到同步字之后才会被 “开启(ON)”。

表 1 总结了在每种配置模式下,使关键开关字处于 “开启(ON)” 状态的确切数值。

表1:BPI和SPI配置模式关键字ON值

注意:由于存在位和字节的交换(bit and byte swapping),BPI 闪存十六进制数据(MCS)文件中的关键开关字在文件内部显示为 0x0000DD00

2 、QuickBoot 如何规划和利用闪存

QuickBoot 闪存编程算法的实现需要了解 NOR 闪存的架构和操作。特别是,必须将QuickBoot闪存组件映射到特定的闪存区域,并且必须将 QuickBoot算法流程映射到这些特定区域可用的闪存操作上。

2.1  NOR Flash架构以及基本读写操作

NOR 闪存包含一个由数据字或数据字节组成的线性阵列。该线性阵列被分割为可擦除的块(Block)或扇区(Sector)。对于某些 NOR 闪存,扇区还会被进一步分割为子扇区(Subsectors)。有关各分段及其大小的信息,请参阅相应的 NOR 闪存数据手册。

使用新数据值对 NOR 闪存进行重编程(Reprogramming)需要一个两步过程:

(1)擦除操作 (Erase operation):将所选分段的所有数据位重置为1状态。

(2)编程操作 (Program operation):仅将数据位从1状态更改为0状态。

擦除操作可以在块、扇区或子扇区上执行。也就是说,指定分段内的所有数据字或字节都会通过每次擦除操作被擦除。编程操作则可以针对单个字或字节执行。

注意: 通常为了提高速度,每次编程操作都会对一个字缓冲区(buffer of words)或一个字节页(page of bytes)进行编程。

2.2   QuickBoot 组件在闪存中的布局策略

由于修改闪存需要执行擦除操作,且擦除操作会影响整个闪存分段,因此闪存分段架构决定了 QuickBoot 组件在闪存中的布局方式:

图2:QuickBoot 组件在闪存中的布局方式

(1)QuickBoot 头文件按以下顺序放置:

a. QuickBoot 头文件第 1 部分(即关键开关字)放置在其独立的可擦除分段中;

b. QuickBoot 头文件第 2 部分紧随第 1 部分之后,但位于与第 1 部分不同的闪存分段中。

(2)黄金比特流镜像 (Golden bitstream image):紧随 QuickBoot 头文件之后,位于闪存阵列中。(3)更新比特流镜像 (Update bitstream image):放置在其独立的可擦除分段中。更新镜像与黄金比特流镜像不共享任何可擦除分段。

关键开关字被放置在其独立的可擦除分段中,这样擦除操作只会影响关键开关字。同样,更新镜像被放置在其独立的分段中,这样重编程过程就不会影响黄金比特流镜像。

2.3   QuickBoot 组件BPI闪存映射示例

图3 展示了基于 Micron P30 闪存的 QuickBoot 解决方案中,BPI 闪存内容的详细映射图。关键开关字位于第一个可擦除块的末尾,该块大小为 65,536(0x00010000)个 16 位字。该图展示了更新比特流 “完好” 和 “损坏” 的示例。

图3:QuickBoot BPI 闪存映射(含更新镜像完好与损坏的情况)

对于更新成功(good update)的示例,关键开关字位置包含第一个总线宽度自动检测字(0x000000BB)。在此情况下,FPGA 配置逻辑执行以下序列:

(1)开始总线宽度自动检测序列;(2)执行紧随其后的 QuickBoot 头文件第 2 部分中的热启动跳转序列;(3)最后加载更新比特流。

对于更新失败(bad update)的示例,关键开关字位置不包含第一个总线宽度自动检测字。因此,在此情况下,FPGA 配置逻辑执行以下序列:

(1)继续搜索总线宽度自动检测字,忽略 QuickBoot 头文件的第 2 部分。

(2)找到位于黄金比特流开头的标准总线宽度自动检测字。

(3)最后加载黄金比特流。

更新比特流位于其自身的一组可擦除块内。更新比特流的起始位置对齐到其第一个可擦除块的开头,即字地址 0x00100000注意: 特定实现中更新比特流镜像的地址可能与图 3 所示的不同,因为更新镜像的位置取决于比特流的大小。

2.4   QuickBoot 组件SPI闪存映射示例

QuickBoot 组件到 SPI 闪存的映射与 BPI 闪存的映射类似,唯一的区别在于关键开关字。在 SPI 模式下,FPGA 配置逻辑跳过了总线宽度自动检测阶段,而是直接开始搜索同步字(Sync word)。因此,QuickBoot 头文件中省略了总线宽度自动检测字,并且针对 SPI 闪存的 QuickBoot 头文件以同步字作为关键开关字开始。

图4:QuickBoot SPI 闪存映射(含更新镜像完好与损坏的情况)

图 4 展示了基于 Micron N25Q 闪存 QuickBoot 解决方案中,SPI 闪存内容的详细映射图。关键开关字位于第一个可擦除子扇区(sub-sector)的末尾,该子扇区的大小为 4,096(0x00001000)个 8 位字节。

对于更新成功(good update)的示例,关键开关字位置包含正确的同步字(0xAA995566)。因此,在此情况下,FPGA 配置逻辑执行以下序列:

(1)在关键开关字位置进行同步;(2)执行紧随其后的 QuickBoot 头文件第 2 部分中的热启动跳转序列;(3)最后加载更新比特流。

对于更新失败(bad update)的示例,关键开关字位置不包含有效的同步字。因此,在此情况下,FPGA 配置逻辑执行以下序列:

(1)继续搜索同步字,忽略 QuickBoot 头文件的第 2 部分;(2)找到位于黄金比特流开头的标准同步字;(3)最后加载黄金比特流。

更新比特流位于其自身的一组可擦除块内。更新比特流的起始位置对齐到其第一个可擦除块的开头,即字节地址 0x00200000

注意: 特定实现中更新比特流镜像的地址可能与图3 所示的不同,因为镜像更新的位置取决于比特流的大小。

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录

专注FPGA技术开发,涉及Intel FPGA、Xilinx FPGA技术开发,开发环境使用,代码风格、时序收敛、器件架构以及软硬件项目实战开发,个人公众号:FPGA技术实战。