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

7系列FPGA基于SPI接口实现多重启动(MultiBoot)

08/04 09:10
380
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

前言:本文我们介绍在串行外设接口(SPI)配置模式下,基于7系列FPGA搭建可靠多重启动(MultiBoot)设计的核心原理,包括实现多重启动功能的分步操作流程、启动回退(fallback)触发方案,同时说明如何利用FPGA状态寄存器调试与验证回退机制。

1、概述

FPGA多重启动功能能够实现镜像之间的即时切换。若多重启动配置流程中检测到错误,FPGA可触发启动回退机制,保障器件加载一份已知可靠的程序镜像。

发生启动回退时,内部产生复位脉冲,对全部配置逻辑执行复位;专用多重启动硬件电路、热启动地址寄存器(WBSTAR)、启动状态寄存器(BOOTSTS)不受本次复位影响。

该复位脉冲将INIT_B与DONE信号拉低,清空配置存储器,并从Flash存储器的 0 地址重新启动配置流程。本应用笔记分为以下核心章节:

    MultiBoot基础原理比特流内嵌重配置指令(IPROG)FPGA SPI Flash配置接口Vivado 工具实现流程硬件平台验证调试方法与核查清单

2、MultiBoot 基础原理

FPGA多重启动(MultiBoot)功能支持镜像动态切换,实现远程升级。方案需要Flash划分两块独立存储区域,分别存放:

回退镜像,又称黄金比特流(golden bitstream)

多重启动镜像,又称升级比特流(update bitstream)

MultiBoot功能允许FPGA从Flash的指定地址选择性加载比特流。内部脉冲指令(IPROG)启动配置逻辑,跳转至黄金比特流内WBSTAR(热启动起始地址)寄存器指定的地址,尝试加载升级比特流。如果加载升级比特流的过程中检测到配置错误,则触发启动回退,加载黄金比特流。图1展示了多重启动与启动回退整体流程。

图 1:多重启动与启动回退流程

在MultiBoot流程执行前,内部重配置指令(IPROG)以及下一镜像起始地址(WBSTAR)参数预先配置在黄金比特流中。

实现MultiBoot存在两种方案:

(1)比特流内嵌PROG指令(本文重点阐述方案):通过 NEXT_CONFIG_ADDR 比特流参数使能 IPROG。

(2)通过ICAPE2原语发起IPROG(本文不做介绍):向ICAPE2原语下发寄存器写入指令。

比特流内嵌IPROG属于自动化实现方案 — MultiBoot相关配置直接固化在比特流内;而第二种 ICAPE2 方案属于用户逻辑可控方案,可由工程根据外部事件灵活触发多重启动。

3、比特流内嵌重配置指令(IPROG)

黄金比特流存放于Flash地址0;升级比特流存放地址由黄金比特流内 WBSTAR寄存器(next_config_addr)指定。当WBSTAR配置为非默认地址时,工具会自动将IPROG指令嵌入比特流。

上电后,配置逻辑照常加载存储在Flash地址0的黄金比特流并执行内部指令。一旦识别到IPROG指令,配置控制器跳转至黄金比特流WBSTAR寄存器指定的Flash地址,尝试加载升级比特流。

若因故障导致升级镜像加载失败,则触发启动回退:配置逻辑将INIT_BDONE信号拉低,清空片内配置存储器,重新从Flash地址0加载黄金比特流,重启配置流程。发生回退时,FPGA会忽略WBSTAR地址与IPROG跳转指令。上述Flash分区结构与配置流程见图 2。

图 2:MultiBoot 回退方案 Flash 分区与配置步骤

4、FPGA SPI Flash 配置接口

图3展示了7系列FPGA与单线(x1)位宽SPI闪存的基础硬件连接。FPGA通过主机输出从机输入引脚(MOSI)向SPI闪存发送读指令与地址信息;SPI 闪存通过主机输入从机输出引脚(MISO)回传数据。SCK为串行时钟引脚,SS 为低电平有效的从机片选引脚。

图 3:FPGA Flash接口

5、 Vivado 工具实现流程

1. MultiBoot应用的比特流准备工作

(1)生成MultiBoot工程所需比特流

本节介绍构建多重启动工程时,黄金比特流升级比特流所需配置的比特流参数。未特别说明的比特流选项,保持默认配置。

表1列举了生成黄金比特流、升级比特流所需的基础多重启动相关比特流参数,并附带各项参数说明。

表 1:MultiBoot 比特流属性

注意:BITSTREAM.GENERAL.COMPRESS为可选配置项,本设计启用该选项,以缩短烧录与配置耗时。

在Vivado中打开黄金镜像工程实现对应的约束文件(.xdc)。将下述代码复制并粘贴至该约束文件中,保存对XDC文件的修改:

set_property BITSTREAM.CONFIG.CONFIGFALLBACK ENABLE [current_design]set_property BITSTREAM.CONFIG.NEXT_CONFIG_ADDR 0x0400000 [current_design]set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 1 [current_design]

(1)BITSTREAM.CONFIG.NEXT_CONFIG_ADDR 0x0400000为参考设计示例地址。可根据SPI Flash容量将该地址修改为其他数值。

(2)SPI总线位宽(SPI_BUSWIDTH)默认为1线模式;若不使用默1线模式,请务必配置该参数。

(3)随后打开升级镜像工程的约束文件(.xdc),将下列比特流属性添加至约束文件并保存:

set_property BITSTREAM.CONFIG.CONFIGFALLBACK ENABLE [current_design]set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 1 [current_design]

注释:SPI_BUSWIDTH默认采用1线模式。若不使用默认的1线模式,务必配置该属性。添加多重启动(MultiBoot)相关属性后,通过Tcl命令write_bitstream分别为黄金镜像工程与升级镜像工程生成比特流文件。生成比特流前,工程必须打开已完成实现的设计。执行write_bitstream时可附加-verbose参数,打印所有生效的比特流配置项汇总。

2. 生成 SPI Flash 烧录文件

通过Tcl命令write_cfgmem生成Flash烧录文件(.mcs)。write_cfgmem 读取FPGA比特流文件(.bit),输出可用于烧写SPIFlash的.mcs文件。示例:利用两路FPGA比特流(.bit文件)生成Flash烧录文件(.mcs),命令如下:

write_cfgmem -format mcs -interface SPIX1 -size 16 -loadbit "up 0 <path>/golden.bit up 0x0400000 <path>/update.bit" <path>/filename.mcs

注释:地址0x0400000仅为参考设计中的示例值。此处应当采用黄金镜像中配置的A1地址(即升级镜像的起始地址)(见表 1)。

6、 硬件验证

该参考设计提供Flash烧录文件(.mcs),可用于快速功能验证。可通过观测通用输入输出(GPIO)LED指示灯状态,判断FPGA当前从黄金镜像还是升级镜像启动。KC705开发板上的GPIO LED位于电源开关附近。

    黄金镜像:GPIO [7:0] LED 从右向左流水点亮升级镜像:GPIO [7:0] LED 从左向右流水点亮

1.如图4所示,将KC705开发板SW13拨码开关设置为对应的配置模式(主 SPI 模式)。采用SPI配置模式时,模式引脚M[2:0]配置为001。

图4、模式引脚M[2:0]配置

2. 连接JTAG下载线缆,给KC705开发板上电;

3.打开Vivado硬件管理器并连接开发板。随后烧写上一节生成的Flash镜像文件(.mcs);也可直接使用参考设计附带预编译文件目录内的kc705_multiboot_spi.mcs

4.SPI Flash烧录成功后,触发PROGRAM_B引脚(按键 SW14)使FPGA从 Flash启动。

另一种方式:在硬件管理器中右键选中器件,使用图形界面功能【从配置存储器件启动】(见图 5)。

图 5:Vivado 硬件管理器 — 从配置存储器件启动

4. 观测开发板上DONE引脚状态。FPGA从SPI Flash完成配置后,DONE引脚将置高。

5.确认KC705开发板GPIO[7:0] LED按照从左至右顺序依次点亮:LED [7] → LED [6] → LED [5] → LED [4] → LED [3] → LED [2] → LED [1] → LED [0],代表升级镜像加载成功。

6. 也可查看器件属性下的BOOT_STATUS寄存器,确认触发MultiBoot跳转至升级比特流的内部重配置标志位INTERNAL_PROG(IPROG)状态(见图 6)。

图6加载升级镜像后的BOOT_STATUS寄存器状态(STATUS_VALID、INTERNAL_PROG 标志位有效)

7、 Fallback — 由CRC错误触发

本节演示由CRC错误触发的故障回退功能。可手动篡改升级比特流以产生CRC校验错误。在RESET CRC指令与CRC指令之间存在多处比特位可供人为翻转,图 7、图 8 给出相关示例。

1.使用任意十六进制编辑器打开升级镜像比特流文件(.bit),在文件中段修改若干数据字节,例如将字节00修改为11,如图 7、图 8 高亮区域所示。

图 7:原始升级镜像(Top_MultiBoot_Module_B.bit)

图 8:篡改后的升级镜像(Top_MultiBoot_Module_B_corrupted.bit)

2.保存篡改后的升级比特流文件,使用该损坏比特流生成全新Flash烧录文件(.mcs)。

3.生成全新Flash镜像文件(.mcs)后,重复第7节【硬件验证】中的步骤 1~6,将包含损坏镜像的文件烧录至 SPI Flash。

4.可通过 GPIO [7:0] LED 指示灯验证故障回滚是否成功、FPGA是否加载黄金镜像。

LED 应自右向左依次流水点亮:LED [0] → LED [1] → LED [2] → LED [3] → LED [4] → LED [5] → LED [6] → LED [7]。

也可在Vivado工具中查看BOOT_STATUS寄存器,确认故障回退流程执行成功:a. BIT10_1 与 BIT13_1标志位表明系统发起IPROG内部重配置,并且检测到CRC错误;b. BIT01_0 标志位代表用于故障回退的镜像加载成功。

图 9:BOOT_STATUS 寄存器(故障回退标志与 CRC 错误标志有效)

8、 调试方法与检查清单

1. 文件生成

(1)若通过Vivado图形界面(GUI)配置 MultiBoot 相关属性,需在配置 MultiBoot属性前,完成黄金镜像工程与升级镜像工程的综合、布局布线。

(2)确认黄金镜像与升级镜像的 MultiBoot 比特流相关属性配置无误。

(3)CONFIGRATE配置时钟速率不得超过目标Flash支持的最高时钟频率,详见UG470中《确定最大配置时钟频率》章节。

(4)生成MCS镜像文件时,确认-interface数据位宽选项设置正确。

(5)升级镜像起始地址必须与黄金镜像工程内NEXT_CONFIG_ADDR属性设定值保持一致;若设置过小,将会增加FPGA配置耗时。

2. 配置相关检查项

(1)在添加 MultiBoot属性之前,先验证工程功能正常运行。该步骤有助于定位烧录失败的根本原因,区分问题来源于工程本身还MultiBoot相关配置。

(2)在烧录全新的 (.mcs) 镜像文件前,完整擦除Flash 器件;可执行 “空白校验 (Blank Check)” 确认擦除操作生效。

(3)读取BOOT_STATUSCONFIG_STATUS寄存器获取调试信息;读取器件参数前请先刷新设备连接。

(4)务必保证Flash内黄金镜像存储区域始终受到保护、不被改写;仅允许对升级镜像区域进行更新与修改。

相关推荐

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

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