前言

FPGA的MultiBoot功能可以支持远程动态更新bitstream images,实现bitstream images的实时切换。在MultiBoot配置过程中检测到错误时,FPGA可以触发fallback 功能,以确保可以将已知良好的设计加载到器件中。

MultiBoot的大致过程如下图:

MultiBoot的配置文件由两个比特流文件生成,第一个为备份文件,永远都不会变,称为Golden_image,从Flash的0地址存储。

第二个为更新文件,后面远程更新,更新的就是这个文件,称为Update_image,存放在某个地址处,这个地址有热启动地址寄存器(WBSTAR)指定。

配置过程大致如下:FPGA从FLASH的0地址处读取配置,遇到IPROG Command命令时,跳转到WBSTAR寄存器指定的地址,该地址存放Update_image的地址,此时FPGA尝试加载该地址处的比特流文件,配置成功的话,就执行该配置的功能。如果遇到配置错误,则触发FallBack,FPGA重新加载Golden_image。

1、ICAPE3 接口

FPGA实现IPROG通常有两种方式,一种是通过ICAP配置,一种是把相关指令嵌入bit文件中。与通过bit文件实现IPROG相比,通过ICAP更灵活。

在Xilinx FPGA 中ICAP(Internal Configuration Access Port) 指的是内部配置访问端口,其主要作用是通过内部配置访问端口(ICAP),用户可以在FPGA逻辑代码中直接读写FPGA内部配置寄存器(类似SelectMAP),从而实现特定的配置功能,例如Multiboot。
ICAP目前为止有三个版本,包括ICAP,ICAPE2以及ICAPE3。UltraScale系列对应ICAPE3,7系列对应ICAPE2,7系列之前的对应ICAP。

以下以ICAPE3 为例,ICAPE3 的接口如下:


2、IPROG指令

每个UltraScale系列的FPAG包括2个ICAPE3,但实际使用时只能例化并使用一个,默认顶部ICAPE3, 初级玩家采用默认的即可。

IPROG指令的作用跟外部Program_B管脚的作用类似,都是对FPGA芯片进行复位操作,该复位操作对FPGA内部的应用程序进行复位,复位过程中除专用配置管脚和JTAG管脚,其他输入/输出管脚均为高阻态,同时IPROG指令不能复位专用重配置逻辑,如WBSTAR寄存器、TIMER寄存器、BSPI寄存器和BOOTSTS寄存器。IPROG指令能够触发FPGA开启初始化流程,同时拉低INIT和Done信号。完成复位操作后,将默认的加载地址用热启动地址寄存器(Warm Boot Start Address,WB-STAR)中的新地址替换。

通过ICAP发送IPROG指令实现Multiboot的步骤如下:

首先写入同步头 32’hAA995566, 然后将需要跳转到的bit文件的起始地址写入WBSTAR寄存器,最后写入IPROG(internal PROGRAM_B)指令。

WBSTAR寄存器的格式,根据自己的要为Update_image分配在FLASH的地址,按照下面的格式生成一个32位数据。例如,我为Update_image分配的flash地址为0X00800000。

(1)对于BPI模式来说,可以通过RS[1:0]来控制具体位流的读取,也可以通过STAT_ADDR[28:0]地址来控制具体位流的读取。

(2)对于SPI模式来说,只有STAT_ADDR[23:0]地址来表征FLASH器件的地址,当使用32位地址的SPI(容量大于等于256Mb)时,需要将实际存储的高24地址赋值给STAT_ADDR[23:0]。因此在位流存储的起始地址早于255时,这就要求位流中的dummy数目要大于256个,否则就会出现易失部分有效位流读取,导致加载失败。为了安全起见,在使用大于等于256Mb的FLASH时,可以适当在位流头前加入Dummy。

这里需要注意一点,ICAP以及SelectMAP都存在位反转(Bit Swapping),也就是说,上表中所有的数据需要进行位反转之后才能接到ICAP的输入接口,同理,ICAP输出的值需要进行位反转后才能与实际的值对应起来,位反转的示例如下图。

ICAPE3 例化示例

ICAPE3 进行例化,示例如下:

// ICAPE3: Internal Configuration Access Port

// UltraScale

// Xilinx HDL Language Template, version 2019.1

ICAPE3 #(

.DEVICE_ID(32’h03628093),//pre-programmed Device ID value,used for simulation

// purposes.

.ICAP_AUTO_SWITCH(“DISABLE”),//Enable switch ICAP using sync word

.SIM_CFG_FILE_NAME(“NONE”)//Raw Bitstream (RBT) file,parsed by the simulation

// model

)

ICAPE3_inst (

.AVAIL(AVAIL), // 1-bit output: Availability status of ICAP

.O(O), // 32-bit output: Configuration data output bus

.PRDONE(PRDONE),//1-bit output: Indicates completion of Partial Reconfiguration

.PRERROR(PRERROR),//1-bit output: Indicates Error during Partial Reconfiguration

.CLK(CLK), // 1-bit input: Clock input

.CSIB(CSIB), // 1-bit input: Active-Low ICAP enable

.I(I), // 32-bit input: Configuration data input bus

.RDWRB(RDWRB) // 1-bit input: Read/Write Select input

);

// End of ICAPE3_inst instantiation

其中设备号DEVICE_ID需要查找USER GUIDE手册,而ICAP原语接口时序跟Select Map接口时序非常相似。SelectMap模式下,FPGA的配置和回读是通过CSI_B,RDWR_B和CCLK来控制的。

程序步骤

在发送IPROG指令之前,将默认的加载地址用热启动地址寄存器(Warm Boot Start Address,WB-STAR)中的新地址。

然后对ICAP核进行预配置。重载控制模块在收到触发信号后,第一个时钟周期将ICAP核的RDWRB信号和CSIBCSIB信号置高,第二个周期将RDWRB信号置底,CE信号置高,第三个周期将RDWRB信号置底,CSIB信号也置底。

接着在下面的8个时钟周期里,将指令队列中的控制命令逐个发出。

运行工程,生成位流Bit,在约束XDC文件中添加压缩等命令即可。

固化Mcs生成。Xilinx系列的FPGA需要将后缀名为mcs的内存镜像文件固化到外部配置存储器中,FPGA上电后才能自动加载配置文件。一般的mcs文件只包含一个bit流文件,多重启动的mcs固化文件包含多个bit流文件。在将多个bit流整合到mcs文件的过程中,需要指定每个bit流的起始地址,这样FPGA专用配置逻辑才能根据地址找到对应的bit流。在程序设计WBSTAR地址时,确定了Golden位流存储的起始地址为0X00000000,Update位流存储的起始地址为0X00800000,因此在将Bit整合到Mcs过程中需要指定对应的存储起始地址,否则就无法加载成功了。

在SPI的flash里烧写有A和B两个程序,FPGA上电后,自动加载A程序,根据外部给FPGA指示信号,FPGA自动切换加载B的程序,同时在B程序运行期间,根据外部给FPGA指示信号,FPGA自动切换加载A的程序。

FPGA中利用ICAP原语实现Multiboot功能-总结篇相关推荐

  1. FPGA UltraScale+ 利用ICAP原语实现Multiboot功能

    例程参考 https://blog.csdn.net/xiaomingzi55/article/details/124365631 1.这个贴子说的很清楚,唯一一点就是它是ICAP2,这样写是没问题的 ...

  2. python基于opencv的手势识别_怎么在Python3.5 中利用OpenCV实现一个手势识别功能

    怎么在Python3.5 中利用OpenCV实现一个手势识别功能 发布时间:2020-12-22 11:56:32 来源:亿速云 阅读:67 作者:Leah 怎么在Python3.5 中利用OpenC ...

  3. java poi 导出中利用sum函数实现合计功能

    java poi 导出中利用sum函数实现合计功能 之前也写过导出功能但是没有写过合计.所以记录下来当做笔记. for(int i = 0; i < arrSize; i++) {JSONObj ...

  4. ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页

    关键字:DataGrid.存储过程.分页 出自: http://blog.csdn.net/yzx110/archive/2004/08/18/78525.aspx 摘要:在最进的一个项目中因为一个管 ...

  5. FPGA中的ODDR原语是干嘛用的?

    文章目录 pll 锁相环实验 锁相环的作用 ip core--clock wizard clk_wiz 例化 oddr 原语 oddr 的作用 pll 锁相环实验 锁相环的作用 他的基本的作用是实现频 ...

  6. 赛灵思FPGA中的主要时钟资源介绍

    把握DCM.PLL.PMCD 和MMCM 知识是稳健可靠的时钟设计策略的基础. 赛灵思在其FPGA 中提供了丰富的时钟资源,大多数设计人员在他们的FPGA 设计中或多或少都会用到.不过对FPGA设计新 ...

  7. FPGA中ICAP原语的使用——Multiboot功能的实现

    ICAP原语的使用 一.杂谈 ICAP原语的介绍 ICAPE2原语的介绍 ICAPE2原语的代码 验证 结束语 一.杂谈 有一段时间没写博客了,因为从学校回家了.现在正值肺炎流行,不给社会添麻烦,自己 ...

  8. ASP中利用OWC控件实现图表功能详解[zz]

    ASP中利用OWC控件实现图表功能详解 在ASP中利用OWC(Office Web Components)控件可轻松实现各种图表功能,如饼图,簇状柱型图,折线图等. 在下面的代码中我详细的给出了饼图, ...

  9. php利用ajax文件上传,如何在PHP中利用AjaxForm实现一个文件上传功能

    如何在PHP中利用AjaxForm实现一个文件上传功能 发布时间:2020-12-18 14:52:38 来源:亿速云 阅读:94 作者:Leah 如何在PHP中利用AjaxForm实现一个文件上传功 ...

最新文章

  1. 【转】linux服务器性能查看
  2. Attach Volume 操作(Part I) - 每天5分钟玩转 OpenStack(53)
  3. JavaScript下拉菜单的例子
  4. 教你玩4款最新族视频摄像头
  5. [gtest][001] A quick introduction to the Google C++ Testing Framework
  6. 海致星图2022校招算法笔试题
  7. nutch2.1抓取中文网站
  8. 红旗linux mysql_请问红旗Linux下,安装Mysql时,应该下载mysql 的哪一种rpm包?谢谢
  9. spring多数据源分布式事务的分析与解决方案
  10. MongoDB 通过 Java 代码 CRUD 文档
  11. 为Bootstrap模态对话框添加拖拽移动功能
  12. linux怎样判断vim是否安装上,Linux系统中vim的安装
  13. 计算机就是三角函数,三角函数计算器
  14. Python向已有数据的Excel表写入数据
  15. c语言 unpack函数,Pack/Unpack 总结
  16. 如何将QQLive和QQ2010和虚拟光驱运行在ubuntu上
  17. Echarts 生成地图html
  18. [Android]iTextG与SpongyCastle踩坑经历
  19. 曾佳-吴宝峰极分解构造2m元最优代数免疫度平衡布尔函数
  20. 帆软中python调用_如何1min了解台灣及全球地震分佈情況:用PythonFineReport培養分析思維(上)...

热门文章

  1. 关于memset,malloc以及free后的野指针误区详解
  2. typescript (TS)进阶篇 --- 内置高阶泛型工具类型(Utility Type)
  3. 计算机英语是啥意思啊,电脑的英文是什么意思
  4. 关于Android ViewPager禁止滑动
  5. 微信视频服务器能保存多久,微信视频动态保存多久(微信背景视频只能一天吗)...
  6. 几种数据规整的方法总结
  7. 家电龙头业绩高 机构重仓股票名单!
  8. BIGO | imo实时语音传输优化揭秘
  9. python之scrapy:攻克技术点ASP.NET分页处理、request和response传参、pipeline区分传来Items
  10. mysql中的resultt框没有了_mysql中的zentao.zt_config表格消失了