学会Zynq(6)固化程序到SD卡或QSPI Flash

SDK调试程序时都是通过JTAG,将PL的bit流文件和应用程序的ELF文件下载到Zynq中,运行查看效果。调试验证功能后需要将程序固化到板子上,使板子上电后可以从存储单元中加载程序,而无需SDK的调试环境。Zynq支持多种存储设备,本文将介绍如何将程序固化到常用的SD卡和QSPI Flash中。

配置SD卡
首先要查看开发板原理图中SD卡与MIO的连接关系。以火龙果Red Pitaya开发板为例,外部的SD卡插槽通过一个SDIO端口扩展芯片与PS的MIO40-47相连。

配置Zynq时在外设中选择与硬件对应的SD0,可以看到SD信号与硬件之间保持对应关系(因为这部分硬件设计是比较固定的)。CD和WP信号可能不是所有的开发板都有,根据硬件实际情况进行选择。

在Peripheral I/O Pins窗口中,我们可以看到其实可以选择3组MIO作为SD0,硬件设计时选择其中一组用于SD卡存储即可。

Clock Configuration的IO Peripheral Clocks中,可以看到SDIO的默认时钟频率为100MHz。该时钟的设置应该处于SD卡支持的范围内。

配置QSPI Flash
同样也要查看开发板原理图中QSPI Flash与MIO的连接关系。以火龙果Red Pitaya开发板为例,QSPI Flash芯片与MIO1-6相连。

配置Zynq时选中与硬件对应的QSPI Flash,信号与硬件之间保持对应关系。

在Peripheral I/O Pins窗口中,我们可以看到QSPI Flash只能通过MIO1-6与Zynq相连,硬件设计时要特别注意。

同样在IO Peripheral Clocks中,也可以配置QSPI的时钟频率,应该处于QSPI Flash芯片支持的范围内。

Zynq启动模式的选择
如果板子上有多种程序存储设备,Zynq在上电时通过一些MIO的电平状态决定采用哪种启动模式,具体见下表。可以看到主要与MIO3-5三个管脚有关。

米联的MZ7XA开发板集成了QSPI和SD卡,控制启动模式的电路图如下:

从表中可以看到QSPI和SD卡的区别仅在于MIO4,通过一个拨码开关控制模式间的切换,其它MIO固定拉高或拉低即可。注意这个板子的原理图设计时MODE0-4与上表中的BOOT_MODE0-4并不对应,不要混淆。

火龙果开发板的设计要更简洁。它将其它MIO的电平固定拉高或拉低,MIO4直接由SD卡的检测信号驱动,实现了SD卡和QSPI启动模式之间的自动切换。

制作BOOT.bin
BOOT.bin就是存储在SD卡或QSPI Flash中的程序,上电时Zynq会从外部存储设备将BOOT.bin读取到片内存储器中运行。制作BOOT.bin除了需要bit流文件和ELF文件外,还需要一个FSBL文件。FSBL主要用于Zynq第一阶段的初始化,SDK中已经提供了现成的FSBL文件,对于绝大多数应用只要稍许修改即可使用。

为了使用现成的FSBL,先新建一个工程,使用示例工程中的Zynq FSBL工程模板。

选中要创建BOOT镜像的工程,右键->Create Boot Image。一般情况下,SDK会自动设置BOOT.bin的输出路径,自动添加工程中的bit流文件和ELF文件,以及工作环境中存在的FSBL.elf文件。

固化程序
将导出的BOOT.bin文件拷贝到SD卡中,插在开发板上接通电源,可以观察到在没有JTAG的情况下程序便会自动加载运行。注意Zynq的启动模式要设置正确。

连接好JTAG并接通电源,点击Xilinx Tools->Program Flash Memory打开如下窗口:

选择要下载到Flash中的镜像文件,点击Program即可将BOOT.bin导入到QSPI Flash中。将启动模式切换为QSPI Flash启动,在不接JTAG的情况下重新上电,也可以看到程序自动加载后运行。至此便完成了程序的固化。

一开始如果对Zynq的开发流程不是很熟,很容易出现刷进去了BOOT.bin但程序没跑起来的情况。这时候要先确保ELF程序在JTAG模式下是已经无误的(如果DDR3就配置错了,就算代码是对的,程序也会跑不起来),然后要检查Vivado中硬件平台环境配置问题,相应的外设是否启用,SD卡的时钟是否过高等等。


文章来源:FPGADesigner的博客
*本文由作者授权转发,如需转载请联系作者本人

推荐阅读