赞
踩
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目前,基于FPGA的很多设备需要和上位机进行通信,大多采用的是PCIE接口,类似的,我们对于PCIE的使用在赛灵思平台中采用的是官方的XDMA,该IP提供了标准的AXI4数据接口以及用户侧扩展的AXI-LITE接口,对于用户端的控制采用AXI-LITE接口进行控制就会显得十分方便。本文介绍远程更新也是基于此接口。
远程更新的关键就是需要在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
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]
这个是对主分区的配置,也就是基础分区的配置。但这里有一个坑,就是制作第二分区时不能采用这里配置,需要将跳转地址进行更改,否则这个分区固化到第二分区就会进入无限的循环,可以直接将下面的两条指令进行注释,就可以解决上位机只重写主分区可以正常加载,一旦烧录第二分区就无法启动,即使重新使用下载器进行固化也没有反应。
set_property BITSTREAM.CONFIG.NEXT_CONFIG_REBOOT Enable [current_design]
set_property BITSTREAM.CONFIG.NEXT_CONFIG_ADDR 32'h00F50000
中断方式的控制可直接根据官方例程进行使用。
这里就需要有一定的更改了,这里需要将SPI初始化中的中断关闭,这样在后面的读取数据的过程中就会自行切换,本工程中是采用的pcie接口进行访问,通过中断的方式操作较为复杂,因此采用轮询的方法,更改了spi驱动中读写数据的底层函数,更改为上位机操作AXI-LITE接口程序。
在本次工程搭建的过程中耗时最长的就是上位机驱动的移植,将基于arm的驱动移植到windows的环境上运行,避坑的主要部分就是对中断的处理,不要尝试使用读寄存器的方式解析中断,可以读到中断信号,但使用中断的方式传输数据,spi数据读取是在中断中完成的,虽然能够判断是否有中断,但却无法跳转相应的位置,导致无法正常读出数据。解决上述问题只需在初始化时将中断关闭,驱动自身即可进入轮询工作模式。
另一个坑就是第二分区的boot设置,在第二分区烧录和第一分区相同的配置boot文件是会导致启动无限循环,使程序无法正常加载。
这种情况是最简单回滚的,只需要配置下面这个约束,即可在上电时检测到错误进行回滚。
set_property BITSTREAM.CONFIG.CONFIGFALLBACK Enable [current_design]
这种情况下如果仅仅打开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]
需要在两个工程中都加上定时器。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。