- 1 -
中国科技论文在线
基于 Xilinx Zynq 的嵌入式系统的 BOOT 方
式探究#
曹英培,徐文波,林家儒**
基金项目:高等学校博士学科点专项科研基金(20120005120009)
作者简介:曹英培(1991-),男,硕士研究生,主要研究方向:信息和信号处理和嵌入式开发
通信联系人:徐文波(1986-),女,副教授,主要研究方向:无线网络中的信号处理、压缩感知、信息论
等
(北京邮电大学信息与通信工程学院,北京 100876) 5
摘要:论文以 Xilinx Zynq-7000 系列的 ARM 与 FPGA 结合的开发板为对象,对嵌入式开发
的引导启动方式进行研究与实现。相对于传统嵌入式系统而言,Zynq-7000可扩展处理平台
将双核 ARM Cortex-A9,可编程逻辑单元和硬 IP 外设紧密集成在一起,提供了灵活性、可配
置性和高性能的结合。这款 ARM 与 FPGA 相结合的 SOC(System On Chip)不仅包含了典10
型的嵌入式的启动方式,同时又增添了 Xilinx 公司独有的 FPGA 启动方式加载模式。论文
以传统嵌入式系统的加载启动方式为基础,阐述了 Zynq7000 系列的各种启动方式,这些启
动方式已经在Zynq7000系列的SOC上进行了实现。同时也对这款芯片上一些冗余的加载步
骤进行了删减和优化。
关键词:嵌入式开发;boot 模式;Xilinx Zynq-7000;ARM;FPGA 15
中图分类号:TP36
Exploration boot mode of the embedded system based on the
Xilinx Zynq
CAO Yingpei, XU Wenbo, LIN Jiaru 20
(School of Information and Communication Engineering, Beijing University of Posts and
Telecommunications, Beijing 100876)
Abstract: This paper studies of embedded development boot startup mode and implementation
based on Xilinx Zynq-7000 series that combine FPGA and ARM in development board.
Compared with traditional embedded system, extensible Zynq-7000 processing platform which 25
dual-core ARM architecture A9, programmable logic unit and hard IP peripherals are closely
integrated, offers a combination of flexibility, configurability and high performance. The ARM
and FPGA combined SOC (System On Chip) not only contains the typical embedded startup mode,
but also provides a unique Xilinx FPGA loading mode. Based on the typical embedded startup
mode the paper mainly expounds the Zynq7000 series of various startup mode which has realized 30
on the SOC in the Zynq7000 the same time the paper conducts some reduction and
optimization for the redundancy on the load steps .
Key words: embedded system;boot mode;Xilinx Zynq-7000;ARM;FPGA
0 引言 35
传统的 ARM 通常分为引导加载程序(Bootloader),嵌入式操作系统内核,文件系统
以及应用程序加载 4 个步骤,FPGA 通常有 JTAG 配置和 FLASH 配置两种模式。Xilinx
Zynq-7000 系列是一种打破传统巧妙地将 ARM 与 FPGA 两种不同架构的芯片相结合的全新
SOC(System On Chip)。在这种 SOC 上其启动引导方式更加多元化,不仅仅包含了传统的
嵌入式中 ARM 的启动方式,更是增添了多种启动 FPGA 的方式,整个系统可以单独引导启40
动 ARM 与 FPGA 的任一模块,也可以两者结合起来运行,并且可以使用高速 AXI 接口进
- 2 -
中国科技论文在线
行交互,这种灵活的架构配置可以进行各种各样的包含通信算法、视频加速、视频压缩和工
业控制的使用[1]。
Zynq 启动方式通常包含有 JTAG 的情况和无 JTAG 的情况两种[2],在有 JTAG 的情况下,
启动方式又分为 3 个阶段[3],BootROM、FSBL 和 SSBL[4],JTAG 口通常只是用来进行开发45
和调试[5];非 JTAG 启动的情况下又包含了 NAND、NOR、SD 和 Quad-SPI 的启动方式,这
些启动方式又包含了安全的和非安全的两种情况,在这些启动阶段中,有用户操作的阶段和
系统自动加载的阶段。
本文着重介绍非 JTAG 启动的步骤,并具体分析每一个启动步骤的作用,同时设计两种
种通过 ARM 来加载 FPGA 的方法。这两种方法具体为只加载可编程逻辑的比特流的启动和50
带 Linux 操作系统的启动方式。
1 Zynq 的启动过程简介
Zynq-7000 AP Soc 器件有效地利用片上的 CPU 来帮助配置。在没有外部 JTAG 的情况
下,处理器系统(PS)与可编程逻辑(PL)都必须依靠 PS 来完成芯片的初始化配置。
配置的控制模块由一下两部分组成:第一部分是启动存储区(BootROM),这是一块55
由 ARM 核上电启动时执行的静态存储区;第二部分是芯片配置单元,该模块控制着 JTAG
debug 的进入点并为 PL 配置与数据解密提供 AES、HMAC、PCAP 模块的接口。这也是 Zynq
的两种启动模式:从 BootROM 主动启动,从 JTAG 被动启动。
无论是否在安全模式的下,PS 与 PL 都由 PS 端来负责配置。但是由于在有外部主机连
接的情况下,也可以使用 JTAG 来进行配置。与其他专门的 FPGA 器件不同的是,Zynq-7000 60
AP Soc 并不支持从 PL 端直接进行启动配置。
Zynq-7000 AP Soc 的启动配置是分多级进行的。配置过程最少需要两步,但通常情况是
按 BootROM、FSBL 和 SSBL 三个阶段进行的。
BootROM
该阶段控制着整个芯片的初始化过程。放在 BootROM 中的代码是固化的,不可修改的,65
处理器在上电时或者软重启时自动运行这部分代码。
当 BootROM 运行时,JTAG 是无效的。当 BootROM 中的代码运行之后,JTAG 接口才
根据 bootmode 的设置来确定是否生效。BootROM 同时包含了加载 FSBL 阶段代码的功能,
当 BootROM 的阶段结束时,用户的软件将会取得整个系统的完整控制权。FSBL 的代码无
论是否加密都必须控制在 192KB 以内[6]。 70
BootROM 包含着安全启动和非安全启动的两种方式,在安全启动的方式中,BootROM
代码对 PS 存储的镜像进行解密和鉴权,将镜像加载到内存模块。在非安全启动方式中,将
BootROM 的鉴权和解密代码屏蔽,直接将镜像加载到内存当中[7]。
- 3 -
中国科技论文在线
找到有效镜
像?
片上执行?
BootROM
跳转到FSBL开始执
行
载入FSBL到OCM中
增加地址偏移量继
续寻找
否
否
图 1 BootROM 加载 FSBL 的过程 75
BootROM FSBL loading process
FSBL
Firsl Stage Boot Loader(FSBL)是在 BootROM 之后启动的引导程序,其启动流程如图 2
所示。这一阶段主要完成以下几项工作:
根据代码中的配置,也可以通过 XILINX 公司专用工具进行配置,完成 PS 端的初80
始化。
帮助 PL 端进行比特文件的加载。
加载下一阶段 SSBL 到内存空间中。
跳转执行 SSBL 或者裸跑程序。
这个阶段的代码是用户自行编写的,需要将 PL 的比特文件与 SSBL 的程序区分开来,85
并且需要对 DDR 进行初始化操作。
SSBL
第三阶段的启动加载是可选的,如果是不需要操作系统的裸奔程序,可以将这一步省略。
通常对于操作系统而言,这一阶段是为操作系统的运行做初始化工作的。
对于 Linux 操作系统而言,这部分就是常用的 bootloader,常用的有 U-boot、E-boot 和90
Vivi-boot。通常在 SSBL 这一阶段提供了用户多种多样的功能,U-boot 之类的拥有非常强大
的功能,提供了许多读写指令、读写内存、USB 设备以及以太网传输等等功能。SSBL 会帮
助我们启动操作系统前的各种设备、硬件的初始化流程,例如串口、DDR 的控制等,而且
拥有多种可操作的加载操作系统内核的方式,包含着从 FLASH 加载,以太网加载甚至可以
从串口加载的功能。这个阶段类似于 PC 机上的 BIOS 程序,是启动操作系统所必不可少的95
部分。
就常用的为 LINUX 操作系统来说,SSBL 是其中必不可少的一部分,它为操作系统的
启动打下的基础,引导着操作系统的启动。
- 4 -
中国科技论文在线
获取分区信息并
进行验证
从内存中启动FSBL
切换到DDR中运行应
用程序
在FLASH中的下一
个32K偏移量中增
加多次启动寄存器
并软复位
增加地址偏移量继续
寻找
从选中的启动FLASH
中加载分区。如果有
比特流则配置PL,如
果有应用程序则复制
到DDR中
未通过
通过
图 2 FSBL 启动流程 100
FSBL startup process
2 Zynq 的启动研究分析与实现
多种 FLASH 启动的选择
在 BootROM 运行的过程中,有一个步骤是加载镜像,而从哪个位置加载镜像就决定从
哪个 Flash 启动。一般在 BootROM 运行的过程中,会读取特定地方的 GPIO 的配置,不同105
的 GPIO 配置决定了不同的启动方式。在 Zynq 上具体的 GPIO 配置如下表 1。
表 1 Zynq 启动管脚配置
Tab. 1 Zynq Boot GPIO
管脚 MIO[5] MIO[4] MIO[3]
JTAG 0 0 0
NOR 0 0 1
NAND 0 1 0
Quad-SPI 1 0 0
SD Card 1 1 0
启动过程的分析与实现
在不带操作系统的过程中,既可以加载 PL(可编程逻辑单元)部分的 BIT,也可以不进110
行 PL 的配置,可以根据不同的情况进行修改。不带操作系统的启动过程中,需要将 SSBL
这一阶段禁用掉。若是不禁用此阶段,将会导致整个启动链路阻塞。需要指出的一点是,PL
的比特流文件、SSBL、裸跑的应用的程序等都必须组织成 Flash 分区镜像。不像其他 ARM
平台,分区的 Flash 格式都是固定的。Zynq 的 Flash 分区镜像不是固定的,可以通过不同的
配置,来选择加载不同的部分。FSBL 将会遍历分区头表寻找比特流文件、SSBL、裸跑程序115
所在的位置进行加载和配置。
只加载 PL 比特流的启动
Zynq 不同于传统的 xilinx 系列的 FPGA,在可编程逻辑单元部分并未直接与 FLASH 相
- 5 -
中国科技论文在线
连接,在官方提供的 Demo 中也未曾提过这方便的信息。但是根据原理上看这部分是可以实
现的,插上 JTAG 线的时候,使用 IMPACT 的软件连接时,发现可以看到类似于 FPGA 的120
FLASH 的模块,如图 3,左边为 ARM 的 DAP 模块,右边的为可编程逻辑单元。
图 3 Zynq JTAG IMPACT 软件
Zynq JTAG IMPACT Software
经过测试,通过这个软件在 JTAG 启动的模式下[8],可以类似于 FPGA 的下载直接将比125
特下载到可编程逻辑单元中。但是在 Q-SPI FLASH 启动的过程,由于 FLASH 并不存在于
可编程逻辑单元之上,所以并不能直接采用传统的方法。在制作烧写文件的过程中,需要在
文件前面加上 BootROM 的引导头,和 FSBL 的代码。一般生成的文件为 mcs 的格式,这种
格式是按照一种特定的协议将二进制排列出的,所以我们也可以把BootROM,FSBL和FPGA
融合生成一个可烧写的 mcs 文件,这个可以采用一些镜像分区软件来实现。具体的分区结130
构如图 4。
BootROM 头
分区列表
FSBL分区
PL 比特文件
保留分区
BootROM Header
图 4 只加载 PL 比特的镜像分区
Only load PL bits of image partition
带 Linux 操作系统的启动 135
这部分是常规的启动方式,嵌入式 Linux 是目前非常流行的嵌入式操作系统,嵌入式从
软件层面考虑可分为以下四个部分:引导程序(Bootloader)、Linux 内核、文件系统、应
用程序。对于 Zynq 平台来说,这些部分都是在 ARM 核上运行的。
BootLoader 在这里使用的是 U-boot,FSBL 帮助我们引导 U-boot 到内存之中。U-boot
将为 Linux 内核初始化内存和必要的外设,设置好启动的参数。在 Zynq 平台中,采用设备140
- 6 -
中国科技论文在线
树来传递驱动部分的参数,所以 U-boot 还将内核拷贝到内存当中。
当 Linux 内核拥有控制权之后,将先进行初始化,建立起内核的运行环境。Linux 内核
在完成虚拟地址到物理地址的映射后,还有一个主要的工作就是驱动设备的初始化与挂载。
在 Zynq 平台中,采用的是设备树的方式传递设备驱动的信息,如果要为 PL 中的 IP 和进行
驱动,也可以采用设备树这种模块化的方式,待 Linux 启动完成之后再进行挂载。当 Linux145
内核运行完之后将运行 init()函数,启动系统的进程。
Zynq Linux 启动的过程中不仅仅需要内核和 U-boot,还需要文件系统的支持。在 Linux
操作系统中,一切都是文件,我们通过统一的接口来访问包括文件系统在内的所有数据。常
见的文件系统有 Jffs、yaffs2、ubifs 等。
在使用 Linux 启动过程中,在制作镜像时,需要增加 4 个分区,U-boot、Linux 内核、150
设备树和文件系统,分区结构如图 5。
BootROM 头
分区列表
FSBL分区
PL 比特文件
U-boot
BootROM Header
Linux内核
保留分区
设备树
文件系统
图 5 带操作系统的镜像分区
With the operating system image partition
3 结论 155
本文对 Zynq 这种 SOC 的启动方式进行了分析、研究与实现,Xilinx 官方给出了许多资
料,但是并未提供每一种启动方式的具体使用方式,本文在官方 demo 的基础上提出了两种
具体的实现方式,使得应用更加广泛和通用。
- 7 -
中国科技论文在线
[参考文献] (References)
[1] F. Cancare, M. D. Santambrogio, D. Sciuto. A direct bitstream manipulation approach for virtex4-based 160
evolvable systems[J]. FPGA Boot Technology, 2010, 26(4): 853-856.
[2] Xilinx.Zynq-7000 EPP Technical Reference Manual [R].USA:Xilinx,2012.
[3] 陆佳华,江舟,马岷. 嵌入式系统软硬件协同设计实战指南-基于 Xilinx Zynq[M]. 北京:机械工业出版
社,2012.
[4] T. Martinek, L. Sekanina. An evolvable image filter: Experimen-tal evaluation of a complete hardware 165
implementation in FPGA[J]. Springer Verlag, 2005: 76-85.
[5] J. Wang, Q. S. Chen, C. Lee. Design and implementation of a virtual reconfigurable architecture for different
applications of intrinsic evolvable hardware[J]. IET Computers and Digital Techniques, 2008: 386-400.
[6] A. Upegui, E. Sanchez. Evolving hardware with self-reconfigurable connectivity in Xilinx FPGAs[J]. IEEE
Computer Society, 2006: 153-160. 170
[7] 邢艳芳,张延冬. 基于 Zynq 的 OLED 驱动设计[J]. 液晶与显示 ,2014,29(2):224-228.
[8] 姜丹丹,李成贵. 基于 ARM 与 FPGA 的主飞行仪显示系统的设计[J]. 计量与测试技术,2009,36(1):
50-51.