软件版本:VIVADO2017.4
操作系统:WIN10 64bit
硬件平台:适用米联客 ZYNQ系列开发板
米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!!
5.1概述
在前面一节做了流水灯实验,但是对于FPGA bit程序断电后就丢失了,所以本课讲解把上一课的流水灯程序可以实现固化到FLASH或者SD卡的方法。
5.2什么是固化
前面章节内容,都是通过JTAG先下载bit流文件,再下载elf文件,最后点击Run As来运行程序。JTAG的方法是通过TCL脚本来初始化PS,然后用JTAG收发信息,用于在线调试。但是这样只要一断电,程序就会丢失,掉电不保存。
如果需要板卡中程序掉电不消失,则需要对程序进行固化。ZYNQ7000 SOC 芯片可以从 FLASH 启动,也可以从 SD 卡启动。本章详细介绍如何制作镜像文件,以及SD和FLASH的固化方法。
SD固化:将镜像文件拷贝到SD卡,设置拨码开关,使系统从SD模式启动。那么每次断电重启后,系统都会从SD启动。
QSPI FLASH 固化:设置拨码开关,将镜像文件烧写进FLASH,使系统从QSPI-FLASH模式启动。那么每次断电重启后,系统都会从FLASH启动。
5.3固化的流程
5.4固化准备
如果我们要固化一个ZYNQ的程序,以及为这个程序做一个镜像文件,那么该如何做呢/p>
首先,想到的两个文件就是PL部分需要的bit文件,以及PS需要的elf文件。但是仅有这两个文件不够的。我们还需要一段代码把bit文件以及elf文件安置好。这段代码就是大名鼎鼎的FSBL.elf。
因此要制作一个镜像文件需要三个文件:
1、FSBL.elf
2、.bit
3、.elf。
最后得到一个等式就是:BOOT.bin = FSBL.elf+该工程.bit+该工程.elf。在工程编译后,会产生该工程的bit文件和elf文件。关键是这个FSBL.elf怎么生成用担心,FSBL.elf文件xilinx早就为我们准备好了。我们可以利用SDK生成它。在此之前,我们先简单了解一下zynq的启动的过程。
5.5 zynq的从SD卡的启动的过程
zynq和大多数arm启动过程一样,启动过程也分为3个阶段,这三个阶段分别称之为阶段0、阶段1和阶段2。
阶段 0:即传统的BootROM过程。ZYNQ芯片ROM里面固化了一段不可修改的程序,只要ZYNQ一上电,这段程序就会执行。它将对ZYNQ的NAND、NOR、SD等基本外设控制器进行初始化。把SD卡这类易失的存储器件初始化后,就会把其中的程序拷贝到ZYNQ的OCM(On-chip memory)。这个被拷贝到片上RAM执行的程序就是我们今天要制作的文件——BOOT.bin。
阶段 1:BOOT.bin加载到OCM上开始执行。 BOOT.bin由FSBL.elf+该工程.bit+该工程.elf构成。阶段1要做的就是:首先配置PS部分,PS完成初始化后,会去配置PL部分,最后去加载阶段2的代码。
阶段 2:这一阶段是可选的,主要是为了完成Linux系统启动过程。本次实验暂时不需要。
5.6 zynq启动模式位的选择
这里有个疑问,众所周知ZYNQ具有多种启动方式:NOR, NAND, Quad-SPI, SD Card 以及JTAG 。ZYNQ如何判断到底从哪里启动呢际上,当上电后,ZYNQ会根据模式管脚的设定,选用boot的方式。
米联客ZYNQ开发板有两种启动模式,一种是SD启动,另外一种是QSPI FLASH启动。开发板通过拨码开关对管脚进行设置,改变启动模式。
注意:请将开发板或核心板电源关闭后,对拨码开关操作,否则会对板卡造成损害。
开发板启动模式及拨码开关状态如下所示,默认拨码是SD启动:
核心板模式开关:
表1. 开发板启动模式
5.7 BOOT.bin制作过程详解
5.7.1 创建工程
Step1:在前面流水灯实验基础基础上增加Block Design。
Step2:新建一个BD文件。单击 Create Block Design,命名为system 之后单击OK。
Step3: 单击下图中添加IP按钮
Step4:搜索单词ZYNQ选择ZYNQ7 Processing System,然后双击
Step5:添加进来了ZYNQ CPU IP
Step6:修改MIO接口配置
修改MIO配置如下,如果不是配套的开发板,读者如何不确定IO设置请阅读原理图查看这部分配置
1、首先修改BANK1的IO电压为1.8V(对应原理图是BANK501)个人感觉XILINX ZYNQ ARM上的BANK分类有点混乱,因为软件里面的BANK1(UG585也是BANK1)是对应原理图中的BANK501,大家不用纠结,反正ARM的IO是固定死的,这些IO又不能当作FPGA的IO自由定义。
1、Qspi FLASH接口
2、配置SDIO 接口,也就是TF卡接口
3、配置串口
Step7:修改时钟
1、对于CPU的时钟,开发板输入33.333333M 所以默认设置
2、DDR时钟也采用默认
3、CPU运行主频设置为默认的667M,对于不同速度等级的CPU, ARM支持的最高频率也不一样,根据情况而定。
4、QSPI 的时钟改到125M,否则可能无法加载FLASH
Step8:修改内存型
PS内存配置:
开发板内存型 配置:
DDR ConfigurationàMemory PartàMT41K256M16 RE-125或MT41K128M16 JT-125
其中:MIZ701A-MINI的DDR型 :MT41K128M16 JT-125
MZ701A、MZ702A、MZ7XB的DDR型 :MT41K256M16 RE-125。
MZ7XA-mini7010内存型 配置如下:
MZ7XA-7010、MZ7XA-7020、MZ7XB内存型 配置如下:
Step9:由于用不到GP接口,所以去掉默认的GP接口
Step9:点击OK完成配置。
Step10:点击Run Block Automation
Step11:搭建好的BD 工程一下就是配置好的ZYNQ IP。
Step12:修改run_led程序,增加 ZYNQ IP接口部分定义实现run_led调用BD 模块
首先,右击BD让软件自动创建一个顶层文件
然后,利用自动产生的system_wrapper.v中对BD 调用的接口代码复制到run_led.v中,这样,run_Led.v就能调用BD文件了。
最后, run_led.v的模块接口,主要修改标点符
Step13:生成bit文件。
5.7.1 导入SDK
生成bit文件后,需要到处硬件,新建SDK工程,启动ZYNQ 7 Processing System IP。
Step1: File->Export->Export Hardware,导出硬件。
Step2:勾选Include bitstream 直接单击OK
Step3:File->Launch SDK加载到SDK,单击OK
Step4:导出完成后如下图
Step5:选择File->New->Application Project
Step6:工程命名为HelloWorld,然后单击NEXT,选择自带的Helloworld程序做测试,单击Finish。
Step7:新建的Helloworld工程。
Step8:新建一个应用工程。
填写工程名FSBL,点击Next,工程类型选择Zynq FSBL。
Step9: 选中helloworld工程(要做固化的工程),然后右单击,选择Creat Boot Image。
Step10:在新窗口中,一共出现三个文件,分别是FSBL.elf、.bit、.elf文件,如图所示。制作镜像文件需要这三个文件。
直接单击Create Image即可完成Boot.bin的创建,此文件可作为SD卡启动文件和SPI启动文件。
完成后,可以看到在helloworld工程(要做固化的工程)的文件夹中出现bootimage文件夹,展开后可以看到生成的BOOT.bin文件。这个BOOT.bin文件用于SD或QSPI固化。
5.8 SD-TF卡启动
将生成的BOOT.bin文件,复制到SD卡,再将SD卡插到开发板,最后打开电源。则开机后系统从SD卡启动,程序掉电不消失。
测试结果:
测试前,连接串口线,在SDK中打开串口。
开发板通电后,流水灯亮起,串口打印出数据。
注意:放到SD卡的bin文件,文件名必须是BOOT.bin,否则不识别。
5.9 QSPI-FLASH启动 (VIVADO 2017.4)
从VIVADO 2017.3版本开始,Xilinx官方为了使Zynq-7000和Zynq UltraScale +实现流程相同,在QSPI FLASH使用上做了变化,即Zynq-7000编程flash需要“指定的fsbl”。这个fsbl用于初始化系统(主要是运行ps7_init()函数)。XILINX官 中Xilinx Answer 70548和Xilinx Answer 70148提供了VIVADIO 2017.3版本QSPI FLASH下载方法。
读者需要注意,如果不修改引导用的fsbl,下载uboot.bin到FLASH会失败,以下就是下载FLASH的具体办法。
本教程提供VIVADO 2017.4 QSPI-FLASH下载方法如下:
Step1: 新建环境变量
计算机à属性à高级系统设置à高级à环境变量à新建系统变量
变量名:XIL_CSE_ZYNQ_UBOOT_QSPI_FREQ_HZ
变量值:10000000
Step2: 生成加载QSPI FLASH的fsbl文件
新建一个新的FSBL文件,命名为zynq_fsbl。FileàNewàApplication Project,输入zynq_fsbl,点击Next。选择Zynq FSBL,单击Finish。
Step3: 打开zynq_fsbl的main.c文件,在此处增加“BootModeRegister = JTAG_MODE; ”保存并编译。
Step4: 模式开关切换到QSPI启动模式(1-ON ,2-OFF),开发板通电。选择Xilinx Tools > Program Flash或单击 Program Flash Memory。
加载刚才生成的BOOT.BIN文件和zynq_fsbl文件,单击Program。
下载过程,需要几分钟时间
Step5:下载过程,输出情况
Step6:下载完成后断电,重新打开电源,就能看到从QSPI FLASH加载。
测试结果:
测试前,连接串口线,在SDK中打开串口。
开发板通电后,流水灯亮起,串口打印出数据。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!