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

发布时间:2026/8/4 1:26:46
FPGA 设计的快速启动方法与远程更新(二) 前言本文我们介绍QickBoot实现细节主要包括BPI和SPI配置模式下关键字含义及配置作用以及远程升级如何规划Flash各个扇区功能并给出BPI和SPI模式下Flash扇区规划示例。1、 关键字(Critical Switch Word)FPGA 嵌入式系统中 “快速启动QuickBoot” 功能的实现依赖于以下要素1关键开关字(Critical Switch Word)2闪存概览与 QuickBoot 闪存组件映射3比特流镜像大小与闪存大小选择4配置时间5QuickBoot 更新镜像验证1.1 关键开关字定义及配置流程中的作用关键开关字是一个特殊的字值。只有当关键开关字的存储位置包含一个精确的、预先确定的值时该开关才会被视为处于开启ON状态。是否存在这个精确的关键开关字值决定了 FPGA 配置逻辑是否执行热启动跳转序列。要理解关键开关字的工作原理及其特殊的 “开启ON” 值需要对 FPGA 比特流以及 FPGA 的内置配置逻辑有深入的了解。1Xilinx FPGA 比特流文件.bit的内部结构图1Xilinx 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” 状态的确切数值。表1BPI和SPI配置模式关键字ON值注意由于存在位和字节的交换bit and byte swappingBPI 闪存十六进制数据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 组件在闪存中的布局方式图2QuickBoot 组件在闪存中的布局方式1QuickBoot 头文件按以下顺序放置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,5360x00010000个 16 位字。该图展示了更新比特流 “完好” 和 “损坏” 的示例。图3QuickBoot 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 头文件以同步字作为关键开关字开始。图4QuickBoot SPI 闪存映射含更新镜像完好与损坏的情况图 4 展示了基于 Micron N25Q 闪存 QuickBoot 解决方案中,SPI 闪存内容的详细映射图。关键开关字位于第一个可擦除子扇区sub-sector的末尾该子扇区的大小为 4,0960x00001000个 8 位字节。对于更新成功good update的示例关键开关字位置包含正确的同步字0xAA995566。因此在此情况下FPGA 配置逻辑执行以下序列1在关键开关字位置进行同步;2执行紧随其后的 QuickBoot 头文件第 2 部分中的热启动跳转序列;3最后加载更新比特流。对于更新失败bad update的示例关键开关字位置不包含有效的同步字。因此在此情况下FPGA 配置逻辑执行以下序列1继续搜索同步字忽略 QuickBoot 头文件的第 2 部分2找到位于黄金比特流开头的标准同步字3最后加载黄金比特流。更新比特流位于其自身的一组可擦除块内。更新比特流的起始位置对齐到其第一个可擦除块的开头即字节地址 0x00200000。注意 特定实现中更新比特流镜像的地址可能与图3 所示的不同因为镜像更新的位置取决于比特流的大小。欢迎关注FPGA技术实战公众号喜欢就多多转发吧!