FPGA中利用ICAP原语实现Multiboot功能-总结篇
前言
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功能-总结篇相关推荐
- FPGA UltraScale+ 利用ICAP原语实现Multiboot功能
例程参考 https://blog.csdn.net/xiaomingzi55/article/details/124365631 1.这个贴子说的很清楚,唯一一点就是它是ICAP2,这样写是没问题的 ...
- python基于opencv的手势识别_怎么在Python3.5 中利用OpenCV实现一个手势识别功能
怎么在Python3.5 中利用OpenCV实现一个手势识别功能 发布时间:2020-12-22 11:56:32 来源:亿速云 阅读:67 作者:Leah 怎么在Python3.5 中利用OpenC ...
- java poi 导出中利用sum函数实现合计功能
java poi 导出中利用sum函数实现合计功能 之前也写过导出功能但是没有写过合计.所以记录下来当做笔记. for(int i = 0; i < arrSize; i++) {JSONObj ...
- ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页
关键字:DataGrid.存储过程.分页 出自: http://blog.csdn.net/yzx110/archive/2004/08/18/78525.aspx 摘要:在最进的一个项目中因为一个管 ...
- FPGA中的ODDR原语是干嘛用的?
文章目录 pll 锁相环实验 锁相环的作用 ip core--clock wizard clk_wiz 例化 oddr 原语 oddr 的作用 pll 锁相环实验 锁相环的作用 他的基本的作用是实现频 ...
- 赛灵思FPGA中的主要时钟资源介绍
把握DCM.PLL.PMCD 和MMCM 知识是稳健可靠的时钟设计策略的基础. 赛灵思在其FPGA 中提供了丰富的时钟资源,大多数设计人员在他们的FPGA 设计中或多或少都会用到.不过对FPGA设计新 ...
- FPGA中ICAP原语的使用——Multiboot功能的实现
ICAP原语的使用 一.杂谈 ICAP原语的介绍 ICAPE2原语的介绍 ICAPE2原语的代码 验证 结束语 一.杂谈 有一段时间没写博客了,因为从学校回家了.现在正值肺炎流行,不给社会添麻烦,自己 ...
- ASP中利用OWC控件实现图表功能详解[zz]
ASP中利用OWC控件实现图表功能详解 在ASP中利用OWC(Office Web Components)控件可轻松实现各种图表功能,如饼图,簇状柱型图,折线图等. 在下面的代码中我详细的给出了饼图, ...
- php利用ajax文件上传,如何在PHP中利用AjaxForm实现一个文件上传功能
如何在PHP中利用AjaxForm实现一个文件上传功能 发布时间:2020-12-18 14:52:38 来源:亿速云 阅读:94 作者:Leah 如何在PHP中利用AjaxForm实现一个文件上传功 ...
最新文章
- 【转】linux服务器性能查看
- Attach Volume 操作(Part I) - 每天5分钟玩转 OpenStack(53)
- JavaScript下拉菜单的例子
- 教你玩4款最新族视频摄像头
- [gtest][001] A quick introduction to the Google C++ Testing Framework
- 海致星图2022校招算法笔试题
- nutch2.1抓取中文网站
- 红旗linux mysql_请问红旗Linux下,安装Mysql时,应该下载mysql 的哪一种rpm包?谢谢
- spring多数据源分布式事务的分析与解决方案
- MongoDB 通过 Java 代码 CRUD 文档
- 为Bootstrap模态对话框添加拖拽移动功能
- linux怎样判断vim是否安装上,Linux系统中vim的安装
- 计算机就是三角函数,三角函数计算器
- Python向已有数据的Excel表写入数据
- c语言 unpack函数,Pack/Unpack 总结
- 如何将QQLive和QQ2010和虚拟光驱运行在ubuntu上
- Echarts 生成地图html
- [Android]iTextG与SpongyCastle踩坑经历
- 曾佳-吴宝峰极分解构造2m元最优代数免疫度平衡布尔函数
- 帆软中python调用_如何1min了解台灣及全球地震分佈情況:用PythonFineReport培養分析思維(上)...
热门文章
- 关于memset,malloc以及free后的野指针误区详解
- typescript (TS)进阶篇 --- 内置高阶泛型工具类型(Utility Type)
- 计算机英语是啥意思啊,电脑的英文是什么意思
- 关于Android ViewPager禁止滑动
- 微信视频服务器能保存多久,微信视频动态保存多久(微信背景视频只能一天吗)...
- 几种数据规整的方法总结
- 家电龙头业绩高 机构重仓股票名单!
- BIGO | imo实时语音传输优化揭秘
- python之scrapy:攻克技术点ASP.NET分页处理、request和response传参、pipeline区分传来Items
- mysql中的resultt框没有了_mysql中的zentao.zt_config表格消失了