0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

深入探究Xilinx Multiboot实例

OpenFPGA 来源:OpenFPGA 作者:碎碎思 2021-09-26 09:37 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

原理

关于Multiboot的原理参考《Xilinx 7系列FPGA Multiboot介绍-远程更新》,基本原理都在此文写的很清楚,本文主要从实例出发演示Multiboot。

补充

FPGA SPI闪存配置接口

7系列FPGA和具有x1数据宽度的SPI闪存之间的基本连接。读取和地址指令通过主输出-从输入(MOSI)引脚从FPGA发送到SPI闪存。数据通过主输入从输出(MISO)引脚从SPI闪存返回。SCK是时钟引脚,SS是低电平从选择引脚。

参考:UG470

Vivado工具流程(Multiboot大致流程)

为Multiboot程序准备bit流

本节概述了为多引导应用程序创建和更新比特流所需的比特流属性。对于未指定的位流选项,请使用默认设置。

表1概述了用于生成和更新具有每个属性描述的位流的基本多引导位流属性。有关这些属性的详细说明,请参阅Vivado Design Suite用户指南:编程和调试(UG908)。

7a9449d8-1111-11ec-8fb8-12bb97331649.png

具体含义如下:

7ade4cea-1111-11ec-8fb8-12bb97331649.png

启用在配置尝试失败时加载默认位流
使用下一个配置映像的启动地址设置热启动启动启动地址(WBSTAR[28:0]位)寄存器
指定启用FPGA位流文件压缩
在Vivado中打开黄金设计实现(Golden)的约束文件(.xdc)。将以下内容复制粘贴到约束文件中,然后保存对.xdc文件所做的更改:

set_propertyBITSTREAM.CONFIG.CONFIGFALLBACKENABLE[current_design]
set_propertyBITSTREAM.CONFIG.NEXT_CONFIG_ADDR0x0400000[current_design]
set_propertyBITSTREAM.GENERAL.COMPRESSTRUE[current_design]
set_propertyBITSTREAM.CONFIG.SPI_BUSWIDTH1[current_design]

上述不理解没关系,后续实例会有使用教程。
接下来,可以在更新设计(将要更新的文件)中打开约束文件(.xdc),并将以下比特流属性添加到约束文件中,然后保存:

set_propertyBITSTREAM.CONFIG.CONFIGFALLBACKENABLE[current_design]
set_propertyBITSTREAM.GENERAL.COMPRESSTRUE[current_design]
set_propertyBITSTREAM.CONFIG.SPI_BUSWIDTH1[current_design]

注:默认情况下,SPI_BUS为x1,如果未使用默认x1模式,请确保设置此属性。

生成SPI闪存编程文件

具体查看《【Vivado那些事】Vivado两种生成、固化烧录文件》。

使用write_cfgmem Tcl命令创建闪存编程文件(.mcs)。

write_cfgmem获取FPGA位流(.bit)并生成可用于编程SPI闪存的闪存文件(.mcs)。

例如,生成包含两个FPGA位流(.bit文件)的闪存编程文件(.mcs)文件,如下所示:

write_cfgmem-formatmcs-interfaceSPIX1-size16-loadbit"up0/golden.bitup
0x0400000/update.bit"/filename.mcs

注:地址值0x0400000是参考设计中使用的示例。应使用黄金图像(更新图像的起始地址)中设置的Addr A1值(见表1)。

请参阅Vivado Design Suite用户指南:编程和调试(UG908或使用Vivado中的-help命令,以了解每个write_cfgmem命令选项的详细说明:

write_cfgmem -help

硬件验证

硬件验证其实很简单,我们分别建立两个工程,两个工程都是流水灯程序,分别从左到右和从右到左流水灯,这样可以很清楚知道FPGA运行了哪个程序。接下来破坏golden程序,按照上述制作MCS文件后运行,看下运行哪个程序。

建立工程

详细的Verilog文件如下:

golden工程

moduleTop_MultiBoot_Module_A(
inputCLK,
outputreg[3:0]LED_Out
);


////////////////////////////////////////////

wireRESET;

assignRESET=1'b1;

////////////////////////////////////////////
//
//首先定义一个时间计数寄存器counter,每当达到预定的100ms时,
//计数寄存器就清零,否则的话寄存器就加1??//然后计算计数器计数的最大值。时钟频率为12MHZ??//也就是周期为1/12M ??3ns,要计数的最大值为T100MS= 100ms/83ns-1 = 120_4818??//

reg[31:0]counter;
parameterT100MS=25'd920_4818;

always@(posedgeCLK)

if(counter==T100MS)

counter<=25'd0;

else

counter<=counter+1'b1;
////////////////////////////////////////////
always@(posedgeCLKornegedgeRESET)
if(!RESET)
LED_Out<=4'b0001;//初值,最低位led[0]灯亮
elseif(counter==T100MS)
begin
if(LED_Out==4'b0000)//当溢出最高位时
LED_Out<=4'b0001;//回到复位时的状态
else
LED_Out<=LED_Out<<1;     //循环左移一位 
 end

endmodule // Run_LED

update工程

moduleTop_MultiBoot_Module_B(
inputCLK,
outputreg[3:0]LED_Out
);


////////////////////////////////////////////


wireRESET;

assignRESET=1'b1;


////////////////////////////////////////////
//
//首先定义一个时间计数寄存器counter,每当达到预定的100ms时,
//计数寄存器就清零,否则的话寄存器就加1��//然后计算计数器计数的最大值。时钟频率为12MHZ��//也就是周期为1/12M ��3ns,要计数的最大值为T100MS= 100ms/83ns-1 = 120_4818��//

reg[31:0]counter;
parameterT100MS=25'd920_4818;

always@(posedgeCLK)

if(counter==T100MS)

counter<=25'd0;

else

counter<=counter+1'b1;
////////////////////////////////////////////
always@(posedgeCLKornegedgeRESET)
if(!RESET)
LED_Out<=4'b0001;//初值,最低位led[0]灯亮
elseif(counter==T100MS)
begin
if(LED_Out==4'b0000)//当溢出最高位时
LED_Out<=4'b0001;//回到复位时的状态
else
LED_Out<=LED_Out<<1;     //循环左移一位 
 end

endmodule // Run_LED

两个工程基本一样,流水的操作是在约束里实现的。

golden工程约束

#CLOCKS
#SYSCLK
set_propertyIOSTANDARDLVCMOS18[get_portsCLK]
set_propertyPACKAGE_PIND27[get_portsCLK]

#GPIOLEDs
#set_propertyPACKAGE_PINAB8[get_portsLED_REVXX[7]]
#set_propertyIOSTANDARDLVCMOS15[get_portsLED_REVXX[7]]
#set_propertyPACKAGE_PINAA8[get_portsLED_REVXX[6]]
#set_propertyIOSTANDARDLVCMOS15[get_portsLED_REVXX[6]]
#set_propertyPACKAGE_PINAC9[get_portsLED_REVXX[5]]
#set_propertyIOSTANDARDLVCMOS15[get_portsLED_REVXX[5]]
#set_propertyPACKAGE_PINAB9[get_portsLED_REVXX[4]]
#set_propertyIOSTANDARDLVCMOS15[get_portsLED_REVXX[4]]

#set_propertyPACKAGE_PINAE26[get_portsLED_Out[3]]
#set_propertyIOSTANDARDLVCMOS33[get_portsLED_Out[3]]
set_propertyPACKAGE_PINT21[get_portsLED_Out[2]]
set_propertyIOSTANDARDLVCMOS33[get_portsLED_Out[2]]
set_propertyPACKAGE_PINT20[get_portsLED_Out[1]]
set_propertyIOSTANDARDLVCMOS33[get_portsLED_Out[1]]
set_propertyPACKAGE_PINR24[get_portsLED_Out[0]]
set_propertyIOSTANDARDLVCMOS33[get_portsLED_Out[0]]

#CFGBVSandSPImodeproperties

set_propertyCFGBVSVCCO[current_design]
set_propertyCONFIG_VOLTAGE2.5[current_design]
set_propertyCONFIG_MODESPIX1[current_design]

#Compressthebitstreamtofiton128MQSPIoftheK7
set_propertyBITSTREAM.GENERAL.COMPRESSTRUE[current_design]

#BITSTREAMPROPERTIESREQUIREDFORGOLDENIMAGE:
set_propertyBITSTREAM.CONFIG.SPI_BUSWIDTH1[current_design]
set_propertyBITSTREAM.CONFIG.CONFIGFALLBACKENABLE[current_design]
set_propertyBITSTREAM.CONFIG.NEXT_CONFIG_ADDR0x0400000[current_design]

#(IftheSPIflashisequaltoorgreaterthan256Mb,uncommenttheconstraintbelow):
#set_propertyBITSTREAM.CONFIG.SPI_32BIT_ADDRYES[current_design]

这里解释一下,前面物理约束不重要,因为“穷”,我的板子只有3颗LED,所以只进行了三个物理约束。

CFGBVS and SPI mode properties及Compress the bitstream to fit on 128M QSPI of the K7、BITSTREAM PROPERTIES REQUIRED FOR GOLDEN IMAGE是重点约束的对象,具体解释看下表一。

set_propertyBITSTREAM.CONFIG.SPI_BUSWIDTH1[current_design]
set_propertyBITSTREAM.CONFIG.CONFIGFALLBACKENABLE[current_design]
set_propertyBITSTREAM.CONFIG.NEXT_CONFIG_ADDR0x0400000[current_design]

这三个约束是和UPDATE工程有关,一个是SPI的BUSWIDTH,一个是否开启CONFIGFALLBACK,最后一个是地址,这是非常重要的。

接下来是update工程的约束文件

#CLOCKS
#SYSCLK
set_propertyIOSTANDARDLVCMOS18[get_portsCLK]
set_propertyPACKAGE_PIND27[get_portsCLK]

#GPIOLEDs
#set_propertyPACKAGE_PINAB8[get_portsLED_REVXX[7]]
#set_propertyIOSTANDARDLVCMOS15[get_portsLED_REVXX[7]]
#set_propertyPACKAGE_PINAA8[get_portsLED_REVXX[6]]
#set_propertyIOSTANDARDLVCMOS15[get_portsLED_REVXX[6]]
#set_propertyPACKAGE_PINAC9[get_portsLED_REVXX[5]]
#set_propertyIOSTANDARDLVCMOS15[get_portsLED_REVXX[5]]
#set_propertyPACKAGE_PINAB9[get_portsLED_REVXX[4]]
#set_propertyIOSTANDARDLVCMOS15[get_portsLED_REVXX[4]]

#set_propertyPACKAGE_PINAE26[get_portsLED_Out[3]]
#set_propertyIOSTANDARDLVCMOS33[get_portsLED_Out[3]]
set_propertyPACKAGE_PINR24[get_portsLED_Out[2]]
set_propertyIOSTANDARDLVCMOS33[get_portsLED_Out[2]]
set_propertyPACKAGE_PINT20[get_portsLED_Out[1]]
set_propertyIOSTANDARDLVCMOS33[get_portsLED_Out[1]]
set_propertyPACKAGE_PINT21[get_portsLED_Out[0]]
set_propertyIOSTANDARDLVCMOS33[get_portsLED_Out[0]]

#CFGBVSandSPImodeproperties

set_propertyCFGBVSVCCO[current_design]
set_propertyCONFIG_VOLTAGE2.5[current_design]
set_propertyCONFIG_MODESPIX1[current_design]

#Compressthebitstream
set_propertyBITSTREAM.GENERAL.COMPRESSTRUE[current_design]

#BITSTREAMPROPERTIESREQUIREDFORGOLDENIMAGE:
set_propertyBITSTREAM.CONFIG.SPI_BUSWIDTH1[current_design]
set_propertyBITSTREAM.CONFIG.CONFIGFALLBACKENABLE[current_design]

#(IftheSPIflashisequaltoorgreaterthan256Mb,uncommenttheconstraintbelow):
#set_propertyBITSTREAM.CONFIG.SPI_32BIT_ADDRYES[current_design]

物理约束同样不重要,重要的还是下面的和multiboot相关的约束,具体解释和上面一样。

生成Bit流并运行

上述两个工程分别生成Bit流并运行,查看两个流水灯是否是两个不同方向的。

合成MCS文件并运行

将两个BIT流文件合成一个MCS文件,命令如下:

write_cfgmem-formatmcs-interfaceSPIX1-size16-loadbit"up0/golden.bitup
0x0400000/update.bit"/filename.mcs

两个bit流文件位置;

filename: mcs文件名称。

将上诉mcs文件下载到FPGA开发板上,可以看见update工程文件运行。

破坏Golden文件

回退到Golden可以通过不同的方式触发。主要有以下几种方式:

  1. ID Code错误
  2. CRC错误
  3. Watchdog超时
  4. BPI地址越界

有关更多信息,请参阅UG470中的重新配置和多引导章节。

本应用说明演示了由CRC错误触发的回退。可以手动损坏更新位流以导致CRC错误。在RESET CRC命令和CRC命令之间有许多可以翻转位的位置。下图显示了一个示例。

  • 1.使用十六进制编辑器(HxD Hex Editor)中打开更新(update)比特流(.bit),在比特流中间翻转一些数据字节,例如从00到11,如图所示。
7b097884-1111-11ec-8fb8-12bb97331649.png

为了保证破坏彻底,可以多更改几处。

  1. 保存损坏的更新位流,并使用此损坏的位流生成新的闪存编程文件(.mcs)。
write_cfgmem-formatmcs-interfaceSPIX1-size16-loadbit"up0/golden.bitup
0x0400000/update.bit"/filename.mcs
  • 3.重新下载文件

观察是Golden还是update文件运行,同理可以将上诉命令修改,将golden和update更换一下mcs文件位置,对比测试,上诉两个情况本人都有亲自测试过,都是golden文件运行,证明multiboot已经生效。

编辑:jq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1655

    文章

    22282

    浏览量

    630071
  • led
    led
    +关注

    关注

    243

    文章

    24433

    浏览量

    687275
  • 闪存编程
    +关注

    关注

    0

    文章

    12

    浏览量

    6854

原文标题:Xilinx Multiboot实例演示

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Xilinx FPGA串行通信协议介绍

    Xilinx FPGA因其高性能和低延迟,常用于串行通信接口设计。本文深入分析了Aurora、PCI Express和Serial RapidIO这三种在Xilinx系统设计中关键的串行通信协议。介绍了它们的特性、优势和应用场景
    的头像 发表于 11-14 15:02 1824次阅读
    <b class='flag-5'>Xilinx</b> FPGA串行通信协议介绍

    低漂移霍尔元件的应用实例

    此章节中将介绍低漂移霍尔元件(砷化镓 (GaAs))的应用实例
    的头像 发表于 07-10 14:27 582次阅读
    低漂移霍尔元件的应用<b class='flag-5'>实例</b>

    无刷直流电机电流测量的探究

    电流进行采样,并利用二阶巴特沃思低通滤波器进行滤波,得到较为平滑的电流,到达有效控制电机的目的。 纯分享帖,点击下方附件免费获取完整资料~~~ *附件:无刷直流电机电流测量的探究.pdf 【免责声明】本文系网络转载,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请第一时间告知,删除内容,谢谢!
    发表于 06-26 13:45

    单片机实例项目:485与CAN总线运用实例

    单片机实例项目:485与CAN总线运用实例,推荐下载!
    发表于 06-03 20:48

    基于AD9613与Xilinx MPSoC平台的高速AD/DA案例分享

    本文主要介绍基于Xilinx UltraScale+MPSoC XCZU7EV的高速AD采集与高速DA输出案例
    的头像 发表于 06-03 14:22 623次阅读
    基于AD9613与<b class='flag-5'>Xilinx</b> MPSoC平台的高速AD/DA案例分享

    XILINX XCZU67DR FPGA完整原理图

    电子发烧友网站提供《XILINX XCZU67DR FPGA完整原理图.pdf》资料免费下载
    发表于 05-30 15:29 3次下载

    请问CCyUSBDevice如何同时实例化2个?

    官方的控制台程序和C++ CYAPI编程手册中,CCyUSBDevice都只实例化了一次即CCyUSBDevice *USBDevice = new CCyUSBDevice(NULL);按照C++
    发表于 05-19 07:27

    深入探究:是什么造就了 MCX 插头的大小之异

    此外,制造工艺与成本因素也在 MCX 插头的尺寸设计中扮演着重要角色。生产小型 MCX 插头需要更为精湛的制造工艺,对生产设备的精度和操作人员的技术水平都有着极高的要求,这无疑增加了生产难度和成本。而大尺寸插头的制造工艺相对简单,生产过程中的容错率更高,成本也更为可控。因此,制造商在生产过程中,需要在满足设备性能要求的基础上,综合权衡成本与效益,合理选择生产
    的头像 发表于 04-30 08:53 336次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>探究</b>:是什么造就了 MCX 插头的大小之异

    深入探究 SMA 插座的原理图绘制及封装方法

    准确绘制 SMA 插座的原理图并合理进行封装,是电子设备设计过程中的关键环节。通过严谨操作与细致检查,能为电子设备的稳定运行筑牢基础,保障信号在传输过程中的高效性与可靠性。
    的头像 发表于 04-14 18:31 1168次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>探究</b> SMA 插座的原理图绘制及封装方法

    如何选择合适的 DC/DC LED Driver?让我带你一探究

    Driver 的身影无处不在。众多品牌纷纷布局这一领域,推出了一系列各具特色的代表性物料。接下来,就让我们深入探究 DC/DC LED Driver 有哪些品牌以及那些具有代表性的物料。​
    的头像 发表于 03-24 11:36 718次阅读
    如何选择合适的 DC/DC LED Driver?让我带你一<b class='flag-5'>探究</b>竟

    华为云 Flexus X 实例性能实测:速度与稳定性的完美结合

    前言 在当今快速发展的云计算领域,华为云 Flexus X 实例以其卓越的性能和稳定性脱颖而出。通过全面的实测,我们验证了其在处理能力、网络延迟和安全性等方面的出色表现。本文将深入探讨华为云
    的头像 发表于 01-17 09:21 1193次阅读
    华为云 Flexus X <b class='flag-5'>实例</b>性能实测:速度与稳定性的完美结合

    VSCode应用实例

    电子发烧友网站提供《VSCode应用实例.pdf》资料免费下载
    发表于 01-16 15:17 0次下载
    VSCode应用<b class='flag-5'>实例</b>

    云服务器 Flexus X 实例:部署 Gitea,拥有自己的 Git 仓库,管理本地代码

    、零售、金融、游戏等众多领域的通用工作负载需求。本文旨在详细阐述如何高效利用“云服务器 Flexus X 实例”,包括如何在其中从零开始,通过安装相关依赖、安装 Docker、安装 Gitea 等步骤,实现自己的 Git 仓库,管理本地代码。精彩内容,不容错过,快来一探究
    的头像 发表于 01-07 16:59 750次阅读
    云服务器 Flexus X <b class='flag-5'>实例</b>:部署 Gitea,拥有自己的 Git 仓库,管理本地代码

    深入解析华为云 X 实例保障云上业务安全的关键策略

    。华为云作为全球领先的云服务提供商之一,在安全性方面为用户提供了全面的保障。其华为云 X 实例凭借强大的性能和安全性,成为众多企业业务部署的重要选择。 本文将详细解析华为云 X 实例的多层次安全策略,深入探讨其如何通
    的头像 发表于 01-03 09:25 1025次阅读
    <b class='flag-5'>深入</b>解析华为云 X <b class='flag-5'>实例</b>保障云上业务安全的关键策略

    一文搞懂软核的固化、启动和MultiBoot实现

    这也是《FPGA实现串口升级及MultiBoot》系列中的一篇文章,作为一个专题单独出来说明。 本篇文章分为三个主题:固化、启动和MultiBoot实现。 固化分为SPI和BPI FLASH两种情况
    的头像 发表于 12-07 11:23 2907次阅读
    一文搞懂软核的固化、启动和<b class='flag-5'>MultiBoot</b>实现