当前位置:   article > 正文

基于QSPI 的 Multiboot介绍-远程更新_axi quad spi远程更新

axi quad spi远程更新

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

目前,基于FPGA的很多设备需要和上位机进行通信,大多采用的是PCIE接口,类似的,我们对于PCIE的使用在赛灵思平台中采用的是官方的XDMA,该IP提供了标准的AXI4数据接口以及用户侧扩展的AXI-LITE接口,对于用户端的控制采用AXI-LITE接口进行控制就会显得十分方便。本文介绍远程更新也是基于此接口。


一、PL端设计

1、FLASH控制器

远程更新的关键就是需要在PL端对FLASH进行控制,这里也是采用的官方IP QSPI控制器。IP的配置可根据自己的实际硬件自身设计,可参考赛灵思官方给出例程。管脚信息都不需要额外绑定,只需使用STARTUPE3原语切换flash操作时钟即可。具体可参考下面的链接。

参考链接:https://www.xilinx.com/support/documentation/ip_documentation/axi_quad_spi/v3_2/pg153-axi-quad-spi.pdf

https://www.xilinx.com/support/documentation/user_guides/ug570-ultrascale-configuration.pdf

2、约束文件

FPGA从flash启动配置可通过VIVADO界面设置,也可直接修改约束文件,本工程及采用约束文件的方式,具体见下代码:

set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
#a negative edge clocking mode (BITSTREAM.CONFIG.SPI_FALL_EDGE) is available to make better use of the entire clock period and allow higher configuration speed.
set_property BITSTREAM.CONFIG.SPI_FALL_EDGE YES [current_design] 
# The CCLK frequency is adjusted by the Vivado Configuration Rate bitstream setting (BITSTREAM.CONFIG.CONFIGRATE) if the source is the internal oscillator. 
set_property BITSTREAM.CONFIG.CONFIGRATE 33 [current_design]
set_property BITSTREAM.CONFIG.SPI_32BIT_ADDR YES [current_design]
set_property CONFIG_MODE SPIx4 [current_design]

set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
#IPROG options for loading the second bitream
set_property BITSTREAM.CONFIG.CONFIGFALLBACK Enable [current_design]
# Golden Bitstream settings
set_property BITSTREAM.CONFIG.NEXT_CONFIG_REBOOT Enable [current_design]
set_property BITSTREAM.CONFIG.NEXT_CONFIG_ADDR 32'h00F50000 [current_design]
set_property CONFIG_VOLTAGE 1.8 [current_design]
set_property CFGBVS GND [current_design]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

这个是对主分区的配置,也就是基础分区的配置。但这里有一个坑,就是制作第二分区时不能采用这里配置,需要将跳转地址进行更改,否则这个分区固化到第二分区就会进入无限的循环,可以直接将下面的两条指令进行注释,就可以解决上位机只重写主分区可以正常加载,一旦烧录第二分区就无法启动,即使重新使用下载器进行固化也没有反应。

set_property BITSTREAM.CONFIG.NEXT_CONFIG_REBOOT Enable [current_design]
set_property BITSTREAM.CONFIG.NEXT_CONFIG_ADDR 32'h00F50000 
  • 1
  • 2

二、驱动程序

1.中断方式

中断方式的控制可直接根据官方例程进行使用。

2.轮询方式

这里就需要有一定的更改了,这里需要将SPI初始化中的中断关闭,这样在后面的读取数据的过程中就会自行切换,本工程中是采用的pcie接口进行访问,通过中断的方式操作较为复杂,因此采用轮询的方法,更改了spi驱动中读写数据的底层函数,更改为上位机操作AXI-LITE接口程序。


总结

在本次工程搭建的过程中耗时最长的就是上位机驱动的移植,将基于arm的驱动移植到windows的环境上运行,避坑的主要部分就是对中断的处理,不要尝试使用读寄存器的方式解析中断,可以读到中断信号,但使用中断的方式传输数据,spi数据读取是在中断中完成的,虽然能够判断是否有中断,但却无法跳转相应的位置,导致无法正常读出数据。解决上述问题只需在初始化时将中断关闭,驱动自身即可进入轮询工作模式。
另一个坑就是第二分区的boot设置,在第二分区烧录和第一分区相同的配置boot文件是会导致启动无限循环,使程序无法正常加载。

续 第二分区几种回滚情况所需配置

写入文件完整 存在一些错误数据

这种情况是最简单回滚的,只需要配置下面这个约束,即可在上电时检测到错误进行回滚。

set_property BITSTREAM.CONFIG.CONFIGFALLBACK Enable [current_design]
  • 1

写入文件不完整 模拟烧录过程中掉电情况

这种情况下如果仅仅打开CONFIGFALLBACK你会发现FPGA直接无法启动,连接JTAG查看,显示未烧录程序,这就说明xilinx的上电加载bit并不能够检测文件缺失,因此我们就需要采用另一种错误检测机制保证程序回滚到第一分区——看门狗定时器。这个东西用起来确实不是那么方便,根据ug470这个文档可以知道看门狗的计数周期值为4微妙,可以根据程序的启动时间来进行设置这个值,但从测试情况来看,这个值确实是很不准确,还有一个最大的坑是配置的时间不能超过flash的容量???最开始看到这个说法也是一脸懵。后来查了相关的文档后发下这个最大时间应该是读flash的最长时间,也就是读flash的整个时间。所以我们可以大概得出计算这个最大时间的一个公式:时间 = 容量 / 位宽(flash x4 or x2 or x1)/ 时钟频率(CCLK = 3MHz)。这里的容量我们需要注意,如果是0地址则就是整个flash的大小就是最大时间,如果是跳转到第二分区了,则需要从第二分区起始地址开始计算容量。最后我们将 时间 / 4微秒 即可得到看门狗计时器的值。看门狗计时器约束语句如下所示:

set_property BITSTREAM.CONFIG.TIMER_CFG 2600000 [current_design]
  • 1

需要在两个工程中都加上定时器。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/738528
推荐阅读
相关标签
  

闽ICP备14008679号