代码编织梦想

上一节我们只使用ZYNQ的PL端资源,单独控制PL端的LED实现流水灯:https://blog.csdn.net/fengyuwuzu0519/article/details/54923413但是掉电后程序会丢失,那么如何固化代码到FLASH呢?就是本节的目的了。

一、ZYNQ的启动流程

        ZYNQ7000 SOC 芯片可以从 FLASH 启动,也可以从 SD 卡里启动, 本节介绍程序 FLASH 启动的方法。Zynq7000 SOC 芯片上电后,最先运行的是ARM端系统(PS)。然后再通过ARM系统软件部分加载FPGA的比特流文件.bit至FPGA(PL),配置FPGA PL端的逻辑功能。

如果是linux开发:

        则只需固化uboot到boot.bin。这样系统启动后,除了配置FPGA端资源,ARM端则运行uboot,uboot负责加载内核到指定位置并启动内核开始运行。

1.1 ZYNQ启动分为两个阶段

  • 第一阶段是 BOOT ROM(ZYNQ厂家固化代码)
  • 第二阶段是 FSBL (First Stage Bootloader)SDK工具来制作。

经过以上两个阶段,PL端配置程序及arm端程序才开始运行。

1.1 第一阶段 (BOOT ROM)

  • 上电后,Zynq7000 SOC 会首先执行片内 Boot ROM 代码,Boot ROM 代码读取 Boot mode 寄存器来判断是哪一种启动方式(SD card/QSPI Flash/JTAG)。
  • 确定好哪种启劢方式后,Boot ROM 从相应的启动设备(SD Card/QSPI Flash)加载 First Stage Bootloader (FSBL) 到On Chip Memory(OCM) RAM,并且将执行权交付给 FSBL。

1.2 第二阶段 FSBL (First Stage Bootloader)

使用SDK 工具一步步生成 FSBL 代码和可执行文件,结合代码可知 FSBL 主要做了如下工作:

  • 初始化 CPU,初始化串口;
  • Processor System (PS) 一些控制器的初始化,如 MIO, PLL, CLK and DDR;
  • 禁止 L1 Data Cache;
  • 注册 ARM 中断向量;
  • 通过 Boot mode 寄存器,判断是哪种启动方式。

1.2.1 QSPI Flash 启动方式:

  • 初始化 QSPI Flash 控刢器;
  • 从 Flash 拷贝 system.bit 到 FPGA (如果 Flash 中存有 system.bit);
  • 从 QSPI Flash 拷贝应用程序的代码到DDR3;
  • 调转到应用程序执行;

1.2.2 SD Card 启动方式:

  1. 初始化 SD 控刢器;
  2. 从 SD Card 拷贝 system.bit 到 FPGA (如果 BOOT.BIN 中存有 system.bit);
  3. 从 SD card 拷贝应用程序的代码到 DDR3;
  4. 跳转到应用程序执行;

1.2.3 JTAG 启动方式,直接退出。

2 制作BOOT.bin

2.1 新建项目

参考LED实验时创建工程的方式:https://blog.csdn.net/fengyuwuzu0519/article/details/54923413

2.2 配置PS端资源、启动SDK、生成BOOT.bin

(1)ZYNQ 的PS开发一般有原理框图的形式来设计,这样硬件的连接看起来会更加直观。点击 Create Block Design 按钮来添加原理图设计文件。

在弹出的对话框里输入原理图设计文件的名字,返里我们取名为"system"。

(2)出现 Diagram 的空白对话框,点击 图标+添加 ARM 处理器内核到这个空白的原理图里。

返里有很多 Xilinx 提供的 IP,我们找到 ZYNQ7 Processing System 双击添加,不要选择后面带 BFM(总线功能模型),带 BFM 的 IP 为早期IP 处理器版本。

(3)双击 Diagram 界面里的 ZYNQ Processing System,打开 ZYNQ 系统的配置界面。

其中 Page Navigator 界面下有 8 个子项,分别为 Zynq Block Design, PS-PL Configuration,Peripheral I/O Pins, MIO Configration, Clock Configuration, DDR Configuration, SMC Timing Calculation, Interrupts。这些页面选项是针对 ZYNQ 的不同硬件模块的配置,其中

PS_PL 页面提供了 PS 到 PL 的相关接口配置信息以及 PS 部分一些配置信息;

Peripheral I/O Pins 页面主要是对一些通用外设接口的配置;

MIO Configruation 页面主要是对 MIO 已经EMIO 的分配控制;

Clock Configruation 页面主要是对 PS 端时钟资源的配置和管理;

DDR Configration 页面主要是对 DDR控制器一些参数的配置;

Interrupts 页面主要是对中断进行配置管理。

(4)点击 Peripheral I/O Pins ,会出现以下的 IO 配置界面。

因为 ZYNQ 的MIO 管脚可以配置成多种功能,比如 MIO48 和 MIO49, 既可以配置成 SD1引脚,也可以是 UART1 引脚,或者是 I2C1 引脚,也可以配置成 CAN1 引脚。具体如何配置需要跟硬件电路板的原理图对应。我们 MIO48 和 MIO49 是连接到 UART 芯片上,是作为串口通信使用。使能SD、 Quad SPI Flash。

(5)点击 PS-PL Configuration ,在 Gemeral 目录下,我们可以看到UART1 波特率是115200,这个波特率用户可以自己选择,我们返里就保留默认设置就可以了。

(6)点击 Clock Configuration ,返个界面会显示 ZYNQ 系统的一些时钟,比如输入时钟是33.33333Mhz, 这个时钟跟我们开发板上的 PS 的系统时钟是一样的。另外我们可以看到 CPU工作时钟是 666.666666Mhz(767Mhz), DDR 的工作时钟是533.333333Mhz,还有些是外设的工作时钟。这些时钟频率我们目前不需要修改。

(7) 再打开 DDR Configration,在这个界面上是选择 DDR 芯片的名称和一些参数。我们再 Memory Part 中需要选择跟开发板上 DDR3 型号一样的名称(MT41J256M16 RE-125)。

(8) 在 MIO Configuration 顷,把 Quad SPI Flash 的 MIO1~MIO6 Speed 配置成 fast 模式。

在 SD_0 项,选择 CD 前面的钩,IO 选择 MIO47(需要跟开发板一致),SD_0 的 IO 速度配置成 fast 模式。再配置 Bank1 I/O Voltage 的电压为 1.8V。

(9)在 Clock Configuration中,我们可以修改 QSPI 癿时钟频率,默认是 200Mhz。这里不做修改。

(10)在 Diagram 界面里点击"Run Block Automation"完成对 ZYNQ7 Processing System IP核的配置,生成外部 ZYNQ 系统的外部链接 IO 管脚。

生成后的 ZYNQ 系统外部管脚如下,一个是 DDR 的接口,一个是 FIXED_IO。

(11)在 Source 窗口中选中 system.bd,右键并先后选择Generate Output Projects 和 Create HDL Wrapper 选顷迕行操作。生成后如下图所示:

(12)在system_wrapper.v中例化LED程序,并添加相应的管教约束文件。具体可参考PL端的流水灯实验。

(13)重新编译一下工程,生成 bit 文件。

(14)再导出硬件,选择菜单 File->Export->Export Hardware...导出,包含bitstram 文件。

(15)硬件导出后,选择菜单 File->Launch SDK,启动 SDK 开发环境, 会出现1 个 hardware platform:sytem_wrapper_hw_platform_0。

(16)进入SDK 开发环境后,点击菜单 File -> New -> Application Project。

(17)仅在 Project name: 输入 fsbl,Hardware Platform 需要选择system_wrapper_hw_platform_0。

next,选择 Zynq FSBL 模板

(18)软件会自动编译生成 fsbl.elf 文件。

(19)为了能够让串口打印出 Bootloader 癿信息,我们返里需要在 fsbl_debug.h 文件里添加一条语句,定义一下“FSBL_DEBUG_INFO”常量。修改后保存,重新编译一下 fsbl 项目。

(20)接下去我们要把 FSBL 可执行文件,FPGA PL的bit比特流文件和PS应用程序结合成一个 Bin 文件。

选择菜单 Xilinx Tools->Create Boot Image:

点击 Browse 选择选择 Zynq Boot Image 文件.bif 的存放地址。

(21)点击 Add按钮, 在弹出的Add new boot image partition 对话框中, 点击 Browse 选择我们刚生成的 FSBL 可执行文件 fsbl.elf。返里 Partition type 为 bootloader,fsbl.elf 作为bootloader 程序。

(22)点击 Add 按钮,在弹出的 Add new boot image partition 对话框中, 点击 Browse 按钮找到 FPGA PL的比特流文件 system_wrapper.bit, 这里 Partition type 为 datafile。

(23)同样的方法添加应用程序文件如uboot。 返里 Partition type 也是 datafile。3 个文件添加后如下所示:

(24)点击 Create Image 按钮,生成 BOOT.bin。BOOT.bin 文件生成成功。

3、烧写 FLASH 并启动

把生成癿 BOOT.bin 文件烧写到 QSPI FLASH 中

(1)开发板需要连接 JTAG 线到电脑,把开发板的上电启动配置跳线帽选择至 QSPI Flash 启劢,并上电。

(2)在 SDK开发环境里,选择菜单 Xilinx Tools->Program Flash。

(3)在 Program Flash Memory 里, Hardware Platform 中选择 system_wrapper_hw_platform_0, 烧写癿 Image File 选择刚生成的 BOOT.bin 文件,Flash Type 选择 qspi_single。

(4)点击 Program 按钮下载,程序会开始下载 BOOT.bin 文件到开发板的 QSPI FLASH 中。

Console 窗口显示 Flash Operation Successful 信息,说明烧写成功。

(5)断电重新上电,如果开发板连接串口,我们可以在串口工具里看到 bootloader 的启动信息。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fengyuwuzu0519/article/details/80411894

xilinx zynq 7000+vivado2015.2系列(五)之zynq的三种启动方式-jtag、sd card、flash_chuanjiezhu的博客-爱代码爱编程_zynq7000启动方式

前言: 前面我们都是使用JTAG方式下载比特流文件,然后下载elf文件,最后点击Run as或者Debug as来运行程序。JTAG方式是通过tcl脚本来初始化PS,然后用JTAG收发信息,优点是可以在线调试,缺点是断电后程序就丢失了。为了解决程序丢失的问题,可以制作镜像文件烧写到sd卡或者flash中,上电即可加载程序。 ZYNQ有两大类启动模式

vivado里程序固化详细教程_long游天下的博客-爱代码爱编程_vivado 程序固化

Vivado里程序固化详细教程 编者注:初玩FPGA开发板,我们都会遇到这种情况,每次事先写好的程序编译成功后,下载到板子里,输出结果十分赏心悦目,随着掉电之后,程序也就随之消失,再次上电,又要重新编译下载程序,十分麻烦,

玩转zynq连载1——zynq的linux启动过程_nuoson聪的博客-爱代码爱编程

玩转Zynq连载1——Zynq的linux启动过程 更多资料共享 链接:https://share.weiyun.com/5s6bA0s 1概述 简单的,以ug585中的一张图来看,从大的方面说,Zynq中liunx的

zynq 固化程序-爱代码爱编程

目录 1. 工程搭建 2. 生成FSBL   3. 创建BOOT文件  4. SD卡启动测试   5.QSPI启动测试 6.在vivado 下烧写QSPI  1. 工程搭建  平台采用AX7Z100开发平台。 1) 首先搭建好zynq框架,有一个完整的工程。 2)要固化程序必须使能 QSPI 或SD卡。 由于开发板上是由两颗QSPI f

zynq 程序固化和启动-爱代码爱编程

我们前面的例程都是在 SDK 开发环境中用 JTAG 直接下载程序运行,如果开发板断电,程序就会丢失,如何让程序能够在开发板断电后再上电能重新启动,这就需要用到应用程序的固化。 ZYNQ7000 SOC 芯片可以从 FLASH 启动,也可以从 SD 卡里启动, 本文给大家介绍程序的 FLASH 和/或者 SD 卡启动的方法。 前面我们也介绍过, Zynq

2020-11-16 ZYNQ固化过程遇到的问题-爱代码爱编程

用XIlinx 2017.04版本固化程序的时候出现 ****** Xilinx Program Flash ****** Program Flash v2017.4 (64-bit)   **** SW Build 2086221 on Fri Dec 15 20:55:39 MST 2017     ** Copyright 1986-2017 Xi

Zynq程序固化到FLASH和SD卡(Zedboard)-爱代码爱编程

本次参考为Zedborad开发板Flash原理图:根据Flash原理图,管脚配置如下: SD卡原理图:根据SD卡原理图,管脚配置如下: 本次要固化的程序作用是打印串口和点亮PL端的8个led灯和MIO7脚的led灯,SDK工程目录如下: 详细配置流程:第一步: 1.Right click on hello_world_bsp and click Bo

ZYNQ裸板:程序固化篇-爱代码爱编程

前言   一般的调试中我们都是通过 JTAG 接口将 FPGA 配置文件和应用程序下载到 ZYNQ 器件中。同样的,我们也可以将尝试把程序存储在非易失性存储器中,在上电或者复位时让程序自动运行,这个过程需要启动引导程序( Boot Loader) 的参与。 Boot Loader 会加载 FPGA 配置文件,以及运行在 ARM 中的软件应用。好吧下面又要

ZYNQ7000固化流程-爱代码爱编程

ZYNQ7000固化流程 生成BOOT.bin文件(1)在SDK开发环境下,将FSBL.elf文件,FPGA.bit文件和FW.elf文件按次序添加并打包成BOOT.bin文件   2. BOOT.bin文件固化 (1)在xilinx SDK环境中通过JTAG进行固化,首先通过选项Xilinx->Program Flash进入到烧

ZYNQ7000 (九) 编写LINUX下C程序的步骤在线运行并最终固化到RAMDISK里-爱代码爱编程

视频九:编写LINUX下C程序的步骤在线运行并最终固化到RAMDISK里 编写LINUX下C程序在线运行并最终固化到RAMDISK里 1,使用SDK生成hello文件,通过ftp传输到板子的ramdisc里面运行试验。 2,使用LINUX界面生成hello文件。 3,将hello文件固化到RAMDISK里面。固化和剪裁RAMDISK步骤: 3.1

zynq+linux固化程序,MiZ702学习笔记6——ZYNQ如何固化程序-爱代码爱编程

上次,我们讲到了EMIO的使用,其实那就是一个最简的“PS + PL”运用的体现。我们之前是通过JTAG先下载bit流文件,再下载elf文件,之后点击Run As来运行的程序。但是这样只要一断电,程序就没了。那么今天我们就来试试如何让程序断电不消失。 之前,JTAG的方法是通过TCL脚本来初始化PS,然后用JTAG收发信息,可用于在线调试。这次我们得

zynq启动流程分析-爱代码爱编程

前言 zynq是xilinx推出的一款集成arm核以及fpga可编程逻辑器件的soc芯片,使得它不仅拥有 ASIC 在能耗、性能和兼容性方面的优势,而且具有FPGA 硬件可编程性的优点。zynq主要分为两端,首先是pl端,属于像fgpa开发一样的纯逻辑开发。然后是ps端,我把它类比成是单片机的裸机开发,通过操作库函数配置寄存器等,它的优势是可以将pl端当

如何固化zynq程序-爱代码爱编程

1.验证程序是否可行 首先打开sdk(本文默认读者已经有可使用的sdk工程),连接 JTAG 接口和串口,然后将pl端.bit配置文件下载进开发板 最后下载.elf文件执行查看现象。 2.配置vivado 单击开启qspi,用于操作w25q存储 或者使用sd卡 验证设计可行性 最后按快捷键“ Ctrl + S”保存设计,右键点击 Block Des

ZYNQ裸机同时使用SD0和SD1(emmc),emmc可以挂载成功但f_open报错没有工作区-爱代码爱编程

项目场景: 最近项目需要用到ZYNQ7010的SD0以及SD1(eMMC),裸机跑,但实际中SD0空闲不使用,仅使用EMMC,用领航者开发板V1来进行测试。 问题描述: 单独使用SD0或者emmc的时候,导入原子哥的例程代码均能正常运行,但同时使能sd0和sd1的时候,使用原子哥的例程代码只能实现sd0读写正常,对于eMMC,把int8_t *pPa

ZYNQ 程序固化到QSPI FLASH实验-爱代码爱编程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1. 前言2. Vivado工程的编写3. SDK工程的编写4. QSPI FLASH烧写A. 工程源码下载参考文献: 1. 前言 本实验教程主要指导大家如何将程序固化到QSPI FLASH中,并让ZYNQ芯片上电启动自动加载QSPI中的程序。 2. Vivado

Zynq MIO与EMIO-爱代码爱编程

1、MIO/EMIO简介         ZYNQ 分为 PS 和 PL 两部分,那么器件的引脚(Pin)资源同样也分成了两部分。ZYNQ PS 中的外设可以通过 MIO(Multiuse I/O,多用输入/输出)模块连接到 PS 端的引脚上,也可以通过 EMIO 连接到 PL 端的引脚。Zynq-7000 系列芯片一般有 54 个 MIO、64个EMI

zynq系列fpga如何固化bit文件到qspi_flash-爱代码爱编程

最近由于项目需要,要将bit文件固化到zedboard的flash中,使程序上电自启,断电不丢失。 我们知道,一般板级调试的时候都是直接下载bit流到FPGA就行,固化到Flash的话,也是先生成.mcs文件,然后下载到Flash即可。 但是在经过反复尝试之后,发现对zynq系列好像行不通。 why?这得从zynq的启动流程说起。