ZYNQ A7系列纯软核micro程序烧录及启动速度优化

概要

公司低成本化项目用到ZYNQ-Artix7系列芯片以节约成本,其相较于7015等芯片主要在于阉割了ARM核,仍可以通过开MicroBlaze软核的方式来做一些信号采集,数据转发的功能。

本文旨在MicroBlaze程序固化中碰到的一些问题记录和分享。

解决问题历程

micro程序固化的流程网上很多也很详细,由于我们工程的需要,大量使用了DDR,我参照了以下文章在外部DDR3内存中运行的MicroBlaze程序的固化方法_microblaze固化_巨大八爪鱼的博客-CSDN博客本文以基于米联客MA703FA开发板的MicroBlaze LWIP千兆以太网例程为例,详细介绍在外部DDR3内存中运行的MicroBlaze程序的固化方法。FPGA型号:XC7A35TFGG484-2首先打开Vivado工程,进入Block Design,添加AXI Quad SPI IP核:点击Run Connection Automation,连接AXI LITE总线,并导出SPI引脚:再次点击Run Connection Automation,连接Quad SPI的时钟:._microblaze固化https://blog.csdn.net/ZLK1214/article/details/115875025

在完成固化以后,发现虽然可以正常启动,但是仅仅360KB的elf文件整整引导了3分半的时间,因为本项目中micro的作用为传感器数据采集与转发的作用,涉及到了其他芯片程序中自检功能的运作,完全不能满足时效性的要求,于是开始从网上寻找解决方案,在参考【JokerのKintex7325】SDK程序从QSPI启动。_Joker_是小王。的博客-CSDN博客软件环境:vivado 2018.1 硬件平台:XC7K325大年初一,祝大家新年快乐。抗击病毒形势这么严峻,哪里都去不了,窝家里写写笔记吧。继续之前的博客内容,把在SDK下的程序通过QSPI启动这个话题再延伸延伸,说说在K7的软核microblaze下面怎么搞,跟Z7下面的方式还是有区别的。虽说只摆个microblaze软核,建个最小工程就能验证QSPI的烧写,但这里还是...https://blog.csdn.net/natty715/article/details/104084681?ydreferer=aHR0cHM6Ly9jbi5iaW5nLmNvbS8%3D该篇文章后,了解了Xilinx官方库的SREC  Bootloader启动流程,实际上软核启动慢的问题主要在于该Bootloader无法直接将micro的elf文件直接引导至DDR中运行,其实有一种解决方式特别简单:直接把micro程序放在BRAM中运行,实测大概6,7秒就启动了,但是我们这个项目FPGA资源紧张,BRAM只能分配出32KB的大小,且需要DDR搬运数据、图像,叠加OSD等功能,无奈只好将程序跑在DDR中,如果BRAM资源充足还是建议将elf程序直接和bit文件合并成download.bit烧录至FLASH中运行,这样也不需要Bootloader的引导,简化了流程。

在尝试最终解决方案之前,也尝试了网上说的其他方法:

        1. 屏蔽串口打印-----实测无效;

        2. 替换官方论坛Xilinx Customer Communityhttps://support.xilinx.com/s/article/75646?language=en_US中的Bootloader.c文件,原理是SDK自带的SREC Bootloader为一个一个字节的搬运,其不知道真正需要转义并搬运的SREC文件中数据的实际大小,更改后的Bootloader.c可以提前将SREC文件数据长度读取出来,以减少读取次数以此来减少搬运至DDR的耗时,但是实测并没有减少时间,由于考虑到这个解决方案仍治标不治本,就算调通也不会减少很多时间,所以没有细查,不知道是什么原因;

接下来介绍最终的解决方案:上面解释过了SREC Bootloader启动速度慢的原因,如果可以想办法直接引导搬运FLASH的elf文件至DDR,少了SREC文件转elf格式的过程,效率即可大大提升,SREC SPI Bootloader is Very Slow - FPGA - Digilent ForumHello, I am using Vivado 2018.3 and a XC7A100T Artix-7. My project includes a Microblaze and an AXI QSPI controller. I am attempting to boot an SREC from Spansion Flash (S25FL256L) using the SREC SPI Bootloader. My SREC file size is around 830 KB. It takes over 2 minutes for the bootloader to fin...https://forum.digilent.com/topic/18106-srec-spi-bootloader-is-very-slow/在参考这篇论坛后,找到了GitHub上大佬分享的SPI ELF Bootloader源码:

GitHub - henrikbrixandersen/elf-bootloader: SPI ELF bootloader for Xilinx Microblaze processorsSPI ELF bootloader for Xilinx Microblaze processors - GitHub - henrikbrixandersen/elf-bootloader: SPI ELF bootloader for Xilinx Microblaze processorshttps://github.com/henrikbrixandersen/elf-bootloader?_ga=2.259888963.835186866.1691390458-2003547133.1691118205根据其文档进行操作:

        1. 在SDK软件菜单中选择Repositories,添加一个新的本地或全局repository,路径选择从GitHub下载下来的顶层文件夹;

        2. 创建一个新的工程,类别选中新添加的 SPI ELF Bootloader;

        3. 在eb-config.h文件中更改实际用到的FLASH地址以及匹配FLASH信息,这一步很关键,主要就是修改你对应FLASH的opration指令以及dummy cycle,可以根据你使用的FLASH类型查阅数据手册,eg: 我这边使用的是Winbond的W25Q128BV,就将SPI_READ_OPERATION改为了0x03,SPI_FLASH_NDUMMY_BYTES改为了0;

         4. 将Bootloader放在BRAM中运行,Micro程序放在DDR中。

最终测试下来,成功将启动时间从3分半减少至了10秒钟。

小结

主要步骤将SREC Bootloader更改为了SPI ELF Bootloader,减少程序从FLASH由BRAM中的Bootloader搬运至DDR中的时间。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值