0 前言

本文主要参考博主Cs-Kapok的博文 Zynq的启动与配置过程详解

1 FSBL简介

在Zynq上运行程序的时候,加载过程中肯定需要用到一个文件,那就是FSBL。FSBL的全称为First Stage Boot Loader,从字面上就能够看出这是Zynq启动第一阶段的引导加载程序,经过了FSBL这一阶段,后面系统才能够运行裸奔程序或者是引导操作系统的u-boot。启动过程如下图所示:

1 - Zynq启动流程-LMLPHP

在上图中,Boot Rom是直接固化在Zynq硬件中的,开发者无法更改,fsbl.elf可以在Xilinx的SDK中进行修改。

2 Zynq的JTAG配置过程

初学 Zynq 的时候,我相信大家应该和我一样,开发过程主要经过以下几个步骤:

1. 打开Vivado开发工具
2. 配置PS
3. 开发PL
4. 生成比特流文件(.bit)
5. 导出文件(包括PS部分配置和PL部分比特流)
6. 打开SDK开发工具
7. 开发软件应用程序
8. 将PL的比特流文件(.bit)和软件的可执行链接文件(.elf)下载到Zynq开发板中,进行调试和验证

Zynq的JTAG配置过程大致如下图所示:

1 - Zynq启动流程-LMLPHP

如上图所示,这其实是刚接触Zynq软硬件设计时需要了解的最基本开发流程,也是PS和PL设计结合的完美体现。但是,上述开发的过程都有一个基本的前提,就是Zynq开发板是通过JTAG直接与电脑相连,然后实现程序的下载。从另一个角度来说,PS和PL的配置都可以认为是电脑主机通过JTAG完成的。但是,在实际中,Zynq开发板不可能实时与电脑连接,当JTAG不起作用时,Zynq芯片是怎样实现对自己的配置?这也是本文将要和大家共同讨论的问题。

3 Zynq的启动流程

在无JTAG的模式下,Zynq是通过片上CPU完成对芯片的配置,也就是PS和PL的配置是通过PS处理器 ARM核来实现的。

需要注意的是,与传统的Xilinx 7系列FPGA芯片不同,Zynq是不支持从PL端直接进行启动配置的,加载PL端的比特流文件必须要有PS端的配合

Zynq的具体启动配置是分级进行的,一共可以分为3个阶段,可以用0~2来表示:

  1. Stage 0: BootROM 阶段
  2. Stage 1: FSBL(First Stage Boot loader)阶段
  3. Stage 2: SSBL(Second Stage Boot loader)阶段

3.1 Zynq启动阶段0 - BootROM

阶段0,又称为BootROM阶段:

  1. ROM(Read-Only Memory)是只读存储器的意思;
  2. Boot是引导的意思;
  3. BootROM从字面意思来看,就是只能被读取的引导存储器。

BootRom里存放了一段用户不可更改的代码且只有在JTAG模式下才执行的代码。在上电复位或者热复位之后,ARM处理器首先执行BootRom里的代码,执行过程包括:

  1. 第1步:读取MIO[6:2]引脚的配置情况,决定从何种外部存储设备中加载阶段1的FSBL;
  2. 第2步:对SD卡、NAND、NOR和QSPI Flash等外部存储设备进行初始化,从而使得ARM处理器能够成功访问并使用这些外设;
  3. 第3步:从外部存储设备读取阶段1的FSBL并加载到OCM中(OCM即On Chip Memory,是Zynq中ARM处理器的片上存储器,也叫片上内存)。

自此之后,阶段0的启动任务就算是圆满结束了,接下来就把控制权转移到阶段1。

3.2 Zynq启动阶段1 - FSBL

阶段1,又称为FSBL阶段,本阶段完成的任务是Zynq启动过程中的关键一环,可以分为以下4项:

  1. 完成 PS 的初始化
  2. 加载PL的比特流文件,完成PL配置;
  3. 加载SSBL或是ARM处理器的裸跑程序到DDR;
  4. 跳转执行SSBL或裸跑程序。

阶段1的整个思路还是非常清晰的,执行过程包括:

  1. 第1步:根据在Vivado工程中对PS端的配置,对PS端进行初始化,包括 DDR、MIO等;
  2. 第2步:将比特流文件(.bit)加载到PL端;
  3. 第3步:加载SSBL或裸跑程序(bare-metal program)到DDR内存中;其中,SSBL(Second Stage Boot Loader)是在Zynq需要运行操作系统时才进行加载;;
  4. 第4步:ARM处理器会跳转到DDR中执行所加载的程序。

如上所述,FSBL阶段的执行过程还是很好理解的,如下图所示:

1 - Zynq启动流程-LMLPHP

3.3 Zynq启动阶段2 - SSBL

阶段2,又称为SSBL阶段,该阶段在Zynq的启动过程中是可选的一个阶段,在一些比较小型的程序中,如果不需要用到操作系统的话,那么Zynq的启动流程到FSBL阶段就足够了。

  1. SSBL是面向于需要运行操作系统的应用场合;
  2. SSBL是操作系统在启动过程中的引导程序boot loader。

对于Linux系统而言,Zynq的SSBL阶段和u-boot的作用是相同的;具体来说,SSBL的作用就是将Zynq所需要的操作系统加载到DDR内存中,如下图所示:

1 - Zynq启动流程-LMLPHP

08-26 18:50