1 重配置Multiboot的应用需求
当多个应用程序同时在一个硬件平台上实现时,各个程序的资源使用和数据通路可能会冲突,这增加了控制电路设计的复杂程度,给开发人员增加了工作量和开发难度。通过多重配置,可以将多个应用程序根据需要分时加载到FPGA中,不仅精简了电路设计,而且使系统更加灵活。FPGA多重配置的特点可以让特定条件下的用户选择片上资源不多的FPGA去实现需要很多资源FPGA才能实现的功能,这大大降低了开发费用,同时提高了FPGA的利用率。
2 ICAP实现Multiboot的原理介绍
FPGA具有多重配置的特性,允许用户在不掉电重启的情况下,根据不同时刻的需求,可以从FLASH中贮存的多个比特文件选择加载其中的一个,实现系统功能的变换。
当FPGA完成上电自动加载初始化的比特流后,可以通过触发FPGA内部的多重启动事件使得FPGA从外部配置存储器(SPI FLASH)指定的地址自动下载一个新的比特流来重新配置。FPGA的多重配置可以通过多种方式来实现。本文采用的是基于ICAP原语的状态机编码方式。通过调用Xilinx自带的ICAP原语,编写状态机按照一定的指令流程对ICAP原语进行不断的配置,可以控制FPGA重新配置。
2.1 IPROG指令序列
在调用了ICAP原语接口之后,通过Verilog/VHDL编码的方式实现状态机。通过状态机发送IPROG指令给ICAP原语,ICAP原语在接收到这些指令后会根据指定的地址自动加载配置文件。
IPROG指令的作用跟外部Program_B管脚的作用类似,都是对FPGA芯片进行复位操作,该复位操作对FPGA内部的应用程序进行复位,复位过程中除专用配置管脚和JTAG管脚,其他输入/输出管脚均为高阻态,同时IPROG指令不能复位专用重配置逻辑,如WBSTAR寄存器、TIMER寄存器、BSPI寄存器和BOOTSTS寄存器。IPROG指令能够触发FPGA开启初始化流程,同时拉低INIT和Done信号。完成复位操作后,将默认的加载地址用热启动地址寄存器(Warm Boot Start Address,WB-STAR)中的新地址替换。
2.1.1 IPROG指令包
2.1.2 WBSTAR寄存器
WBSTAR寄存器的组成如下图所示。


(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。
2.2 ICAP原语接口时序
ICAP原语接口时序跟Select Map接口时序非常相似。SelectMap模式下,FPGA的配置和回读是通过CSI_B,RDWR_B和CCLK来控制的。当CSI_B=0时,SelectMap接口使能;当CSI_B=1时,SelectMap接口不使能。当RDWR_B=0时,数据端口为输入,功能为配置FPGA;当DWR_B=1时,数据端口为输出,功能为回读FPGA。SelectMap模式下,当CSI_B=0时,RDWR_B由0变为1或者由1变为0都会触发ABORT。当CSI_B=0时,RDWR_B由0变为1的ABORT现象是配置IO由输入变为输出,同时ABORT的状态信息体现在数据管脚上,此时数据管脚为输出。当CSI_B=0时,RDWR_B由1变为0的ABORT现象是配置IO由输出变为输入,这时ABORT的状态信息无法体现在数据管脚上,因为此时数据管脚为输入。
为了避免ABORT发生,建议在CSI_B=0前,设置好RDWR_B=0或RDWR_B=1,即通过控制CSI_B信号来控制配置或回读,或者通过控制CCLK供给来控制配置或回读。比如配置FPGA的三种接口时序。
2.2.1 连续的配置接口时序

2.2.2 CSI_B控制的断续配置接口时序

2.2.3 CCLK控制的断续配置接口时序

2.3 SelectMap数据顺序
SelectMap有X8、X16和X32模式。Select Map的位顺序的关系如下表所示。

SelectMap-X16数据变换关系如下图所示,X8和X32类推。

因此IPROG的指令序列对应的实际SelectMap-X32数据如下表所示。

3 ICAP实现Multiboot的工程开发
3.1 功能需求
在SPI的flash里烧写有A和B两个程序,FPGA上电后,自动加载A程序,根据外部给FPGA指示信号,FPGA自动切换加载B的程序,同时在B程序运行期间,根据外部给FPGA指示信号,FPGA自动切换加载A的程序。
3.2 验证平台
KC705的评估板,使用的FLASH为N25Q128。
3.3 接口协议
3.3.1 数据包
ICAP传输的数据包即满足SelectMap数据顺序要求的IPROG指令包。

指令序列包中的WBSTAR期望地址的计算方法:由于需要在128Mb的SPI-FLASH中存储2份位流,因为SPI-FLASH是按照字节存储的,因此128Mb的SPI-FLASH大小也为16MB,现计划每份位流存储大小平均分配,均为8MB,远小于实际7K325T的位流大小,因此需要对位流进行压缩。
第1份位流存储的地址为0X000000~0X7FFFFF,对应程序A的地址;
第2份位流存储的地址为0X800000~0XFFFFFF,对应程序B的地址;
3.3.2 接口时序
采用连续的配置接口时序。

3.4 工程实现
3.4.1 系统组成
整个系统工程包括两个工程,分别为Golden工程和Update工程,为了减少开发时间,此Demo程序中的Golden工程和Update工程很相似,Golden工程和Update工程在此次案例中差异见下图中的红色部分。

各功能块的功能描述如下。
(1) 系统时钟/复位:对输入的时钟和复位信号进行处理,得到满足要求的系统时钟和系统复位信号。
(2) 开关处理:对输入的Sel_multiboot进行简单处理,Golden工程是直接输出给ICAP控制器,Update工程是取反后输出给ICAP控制器。
(3) 流水灯:此功能是为了验证Golden工程和Update工程切换是否成功,两个工程的流水灯的功能差异通过输入的参数led_constant来体现。
(4) ICAP_multiboot:此功能模块通过ICAP原语给FPGA的配置电路发送IPROG指令序列,触发FPGA执行多重加载功能,其中SelectMap数据生成是用来将输入的指令进行bit_SWAP转换,从而满足SelectMap传输要求,ICAP控制器是将输入的SelectMap数据以SelectMap连续配置接口时序发送给ICAP原语,从而达到触发Multiboot的功能,其中输入的参数addr_multiboot表示即将切换程序的存储首地址。
3.4.2 ICAP控制器设计
整个工程中的关键在于ICAP控制器的设计,本案例中ICAP控制器使用状态机来实现。

3.4.3 位流生成
位流Bit生成:由于7K523T器件本身的特性,生产的bit流文件大小为91548896,约为87Mb,约为11MB。而SPIFLASH的容量为128
Mb即16 MB,这个容量无法满足在一个SPI FLASH上贮存两个bit流文件,需要对生成的bit流进行压缩。在约束XDC文件中添加压缩命令即可。

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

3.5 板级验证
整个Multiboot的功能是FPGA上电自动从外部SPI FLASH加载一个Golden的bit流,当需要执行Update的程序时,需要外部给一个触发条件,Golden程序会根据触发条件以及启动地址发起重新配置指令,从而FPGA开始重新配置。
在板级验证中,通过拨动SW11的最右边的开关,可以满足触发条件实现多重配置。在FPGA上电后,自动加载Golden程序,LED灯呈现一盏流水灯,当拨动SW11的最右边的开关后,FPGA加载Update程序,LED灯呈现两盏流水灯,这时再动SW11的最右边的开关,FPGA又加载Golden程序,LED灯呈现一盏流水灯。板级验证的结果符合预期结果,功能正确,Multiboot跳转正确。

使用ICAP原语实现SPI-Multiboot加载相关推荐

  1. spi 动态加载、卸载_理解 ServiceLoader类与SPI机制

    对于Java中的Service类和SPI机制的透彻理解,也算是对Java类加载模型的掌握的不错的一个反映. 了解一个不太熟悉的类,那么从使用案例出发,读懂源代码以及代码内部执行逻辑是一个不错的学习方式 ...

  2. Kotlin如何运用SPI机制加载运行kts脚本

    说明:此为gradel项目 一般java通过ScriptEngineManager.getEngineBy***()不同的方式来获取相应的脚本,网上有很多方式,这里就不详细解释了. kotlin如何在 ...

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

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

  4. SPI动态加载配置文件

  5. java 上下文加载器_【深入理解Java虚拟机 】线程的上下文类加载器

    线程上下文类加载器 线程上下文类加载器( Thread Context ClassLoader) 是从JDK1.2 引入的,类Thread 的getContextClassLoader() 与 set ...

  6. springcloud bootstrap context加载过程解析以及怎么成为main context的parent

    The Bootstrap Application Context概念 这里是引用 A Spring Cloud application operates by creating a "bo ...

  7. JVM中篇:字节码与类的加载篇

    0.概述 0.1字节码文件的跨平台性 0.1.1.Java语言:跨平台的语言(write once,run anywhere) 当]ava源代码成功编译成字节码后,如果想在不同的平台上面运行,则无须再 ...

  8. FPGA中利用ICAP原语实现Multiboot功能-总结篇

    前言 FPGA的MultiBoot功能可以支持远程动态更新bitstream images,实现bitstream images的实时切换.在MultiBoot配置过程中检测到错误时,FPGA可以触发 ...

  9. NanoPi NEO Air使用十三:使用自带的fbtft驱动点亮SPI接口TFT屏幕,ST7789V,模块加载的方式

    上节使用fbtft来驱动SPI接口TFT屏幕,但是是编译进内核的方式. 本节再来测试下编译成模块的用法. 引脚 240x240分辨率,1.3寸,主控为ST7789VW. 与开发板的引脚连接确定如下: ...

最新文章

  1. 这道算法题太简单?你忽略了时间复杂度的要求!
  2. vue 自定义指令实现,滚动条百分比进度条。
  3. DataGridView 分页显示
  4. 2017-2018-1 20155222 《信息安全系统设计基础》第10周 Linux下的IPC机制
  5. 技术情报局(笛卡尔树)
  6. 云数据库精华问答 | 云数据库与其他数据库的关系
  7. fiddler APP抓包设置
  8. vs2005开发Silverlight平台搭建
  9. Android短信息验证码自动填写详细介绍
  10. matlab 张正友工具箱,TOOLBOX_calib0 张正友的标定工具箱,直接运行会有错误,这是经过修改的 首先 _gui,确 matlab 238万源代码下载- www.pudn.com...
  11. pip 安装 nexmo
  12. 戴尔服务器r510怎么系统,DELLR510服务器上安系统.docx
  13. 冯端:漫谈物理学的过去、现在与未来
  14. 短视频是一种值得被鼓励的创作形式么?
  15. bugku 游戏过关
  16. 【面试招聘】计算机网络专场(一)
  17. 如何使用API接口查询物流信息?
  18. ## STM32F103的光照、烟雾MQ2、有毒气体MQ135的ADC配置(寄存器版与库函数版
  19. 如何做一个基于微信电影播放小程序系统毕业设计毕设作品
  20. 125KHz唤醒功能2.4GHz单发射芯片-Si24R2H

热门文章

  1. Java采集PPI指数_PPI(工业品价格指数)是怎样调查计算出来的?
  2. JDK、JER、JVM三者间的联系与区别
  3. 阿里云独享虚拟主机和共享虚拟主机区别对比
  4. Go 每日一库之 gorilla/sessions
  5. 论文阅读 6 | Bayesian Meta-Learning for the Few-Shot Setting via Deep Kernels
  6. AlexNet_tensorflow2.1_实现狼狗分类
  7. 某汽车轮渡口,过江渡船每次能载 10 辆车过江。
  8. java变量无法解析出现的原因_不明白为什么这个变量无法解析为一个类型? (JAVA)...
  9. 洛谷P1758 [NOI2009]管道取珠(dp 贡献转化)
  10. java drawimage图片不完整_微信小程序canvas.drawImage完全显示图片问题的解决