ZYNQ SDK开发 (二 软件工程师SDK调试开发,固化程序到FPGA)

1. SDK调试

1.1 点击 Vivado 菜单“ File –> Launch SDK ”,启动 SDK

SDK实际上指的就是Vivado中的软件开发工具,在2019之后的版本中被独立出来为 Vitis;

image-20220511142846017

启动 SDK 后我们会看到一个文件夹,有一个名为 “system.hdf ”文件,这个文件就包含了 Vivado硬件设计的信息,可以给软件开发使用,也可以看到 PS 端外设的寄存器列表。

在2019以后的版本中,还需要自己利用xac文件新建一个platform project,这里 Launch SDK之后直接就生成了platform,然后同样的要新建一个Application Project ,来做软件开发。

1.2 使用“ Hello World ”模板

​ 可以看到 SDK 创建了一个“ hello ”目录,还有一个 hello_bsp 的目录,在“ hello_bsp“目录中可以找到很多有用的信息,软件开发人员比较清楚, BSP 也就是 Board Support Package板级支持包的意思,里面包含了开发所需要的驱动文件,用于应用程序开发

image-20220511145958271

双击“ system.mss ”,还可以看到有些 PS 外设还提供了例程,这是用来了解学习这些外设的第一手资料。驱动文档说明可以在 Documentation 中找到。通过 Import Examples 引入官方例子,加快学习。

1.3 使用 PuTTY 软件

​ 做为串口终端调试工具, PuTTY 是一个免安装的小软件连接 JTAG 线到开发板、 UART 的 USB 线到 PC。

在上电之前最好将开发板的启动模式设置到 JTAG 模式

1.4 给开发板上电

​ 准备运行程序,开发板出厂时带有程序, 这里可以把运行模式选择 JTAG 模式 然后重新上电 。选择“ hello ”,右键,可以看到很多选项,本实验要用到这里的 Run as就是把程序运行起来,“ Run as ”里又有很对选项,选择第 一个“ Launch on Hardware(System Debuger)”,使用系统调试,直接运行程序即这里的程序掉电或重启后就会消失

image-20220511151118707

这个时候观察 PuTTY 软件,可能有输出显示,也可能没有输出。

1.5 添加一个配置

为了保证系统的可靠调试,需要添加一个配置,右键“ Run As –> Run Configuration”。

选择“ Reset entire system ”复位整个系统,如果系统中还有 PL 设计,还必须选择“ Program FPGA ”,再次点击 Run。

image-20220511151737842

1.6 Debug

除了“ Run As ”,还可以 “Debug As ”,这样可以设置断点,单步运行。

image-20220511151930589

2. 固化程序

普通的FPGA 一般是可以从 flash 启动,或者被动加载, ZYNQ 的启动是由 ARM 主导的,包括 FPGA 程序的加载, ZYNQ 启动一般为最少两个步骤,在 UG585 中也有介绍:

​ Stage 0 :在上电复位或者热复位之后,处理器首先执行 BootRom 里的代码,这一步是最初始启动设置。Boot Rom存放了一段用户不可更改的代码,当然是在非 JTAG 模式下才执行,代码里包含了最基本的 NAND ,NOR ,Quad-SPI, SD 和 PCAP 的驱动。另外一个很重要的作用就是把 stage1 的代码搬运到 OCM 中,就是 FSBL 代码( First Stage Boot Loader ),空间限制为 192KB 。

​ Stage 1:接下来进入 最重要的一步,当 BootRom 搬运 FSBL 到 OCM 后,处理开始执行 FSBL 代码,FSBL 主要有以下几个作用:

  • 初始化 PS 端配置,这些配置也就 是在 Vivado 工程中对 ZYNQ 核的配置。包括初始化 DDR ,MIO, SLCR 寄存器。主要是执行 ps 7_init.c 和 ps7_init.h, ps7_init.tcl 的执行效果跟 ps7_init.c是一样的。

image-20220511153649383

  • 如果有 PL 端程序, 加载 PL 端 bitstream
  • 加载 second stage bootloader 或者 bare-metal 应用程序到 DDR 存储器
  • 交接给second stage bootloaderbare-metal 应用程序

​ Stage 2: Second stage bootloader 是可选项,一般是在跑系统的情况下使用,比如 linux 系统的uboot ,在这里不再介绍,后面会使用 petalinux 工具制作 linux 系统。

2.1 生成FSBL

FSBL是一个二级引导程序,完成 MIO 的分配、时钟、 PLL 、 DDR 控制器初始化、 SD 、 QSPI控制器初始化,通过启动模式查找 bitstream 配置 FPGA ,然后搜索用户程序加载到 DDR ,最后交接给应用程序执行。详情请参考 ug821 文档。

1)新建一个名为 fsbl 的 APP ,特别注意硬件平台选择最新的那个,模板选择 Zynq FSBL。

image-20220511155148797

添加调试宏定义 FSBL_DEBUG_INFO ,可以在启动输出 FSBL 的一些状态信息,有利于调试,但是会导致启动时间变长。

image-20220511155557451

修改后保存,黑金的教程上说 SDK 默认会自动编译,生成 fsbl.elf 文件。但是实际上我看并没有生成fsbl.elf。

因此,完成上述操作后,还是要右键fsbl project,然后 ” Build Project“,才会生成fsbl.elf,同样的hello project最好在编辑完成后最好手动” Build Project“。

可以看一下 fsbl 里包含了很多外设的文件,包括 ps7_init.c ,nand ,nor ,qspi ,sd 等,在 fsbl的 main.c 中,第一个运行的函数就是 ps7_init ,至于后面的工作,大家可以再仔细读读代码。当然这个 fsbl 模板也是可以修改的,至于怎么修改根据自己的需求来做。

2.2 创建BOOT文件

选择 APP 工程,右键选择 Create Boot Image

弹出的窗口中可以看到生成的 BIF 文件路径, BIF 文件是生成 BOOT 文件的配置文件,还有生成的BOOT.bin 文件路径, BOOT.bin 文件是我们需要的启动文件,可以放到 SD 卡启动,也可以烧写到 QSPI Flash 。

image-20220511160534545

​ 在 Boot image partitions 列表中有要合成的文件,第一个文件一定是 bootloader 文件,就是上面生成的 fsbl.elf 文件,第二个文件是 FPGA 配置文件 bitstream ,在本实验中由于没有 FPGA的 bitstream ,不需要添加,第 三个是应用程序,在本实验中为 hello.elf ,由于没有 bitstream在本实验中只添加 bootloader 和应用程序。点击 Create Image 生成 。

2.3 SD卡启动测试

1)格式化 SD 卡,只能格式化为 FAT32 格式,其他格式无法启动

2)放入 BOOT.bin 文件,放在根目录

3)SD 卡插入开发板的 SD 卡插槽,启动模式调整为 SD 卡启动

image-20220511160936600

4)打开 putty 软件,上电启动,即可看到打印信息,红色框为 FSBL 启动信息,黄色箭头部分为执行的应用程序 helloworld

image-20220511161139543

2.4 QSPI启动测试

注意: 使用QSPI启动烧录,需要设置,启动模式为JTAG,否则无法烧录。烧录时设置为JTAG,烧录完成启动还需要设置为QSPI。

  1. 在 SDK 菜单 Xilinx --> Program Flash

Hardware Platform 选择最新的,Image FIle文件选择要烧写的BOOT.binFSBL file 选择芯驿电子定制的特别版本 fsbl.elf ,只有用这个 fsbl 才能烧写。选择Verify after flash,在烧写完成后校验 flash。

image-20220511161540577

注意:
如果使用 Vi vado 2019.1 及以后版本就不需要这个定制的 fsbl ,用自己生成的 fsbl 即可。

  1. 设置启动模式为 QSPI ,再次启动,可以在 putty 里看到与 SD 同样的启动效果。

image-20220511162127386

2.5 Vivado 下烧录QSPI

  1. HARDWARE MANGER 下选择器件,右键 Add Configuration Memory Device

image-20220511163158714

  1. 选择尝试Winbond ,类型选择qspi,宽度选择x4 single,这时候出现 w25q128 ,选择红框型号,开发板使用 w25q256 ,但是不影响烧录。

image-20220511163455735

  1. 选择要烧写的文件和fsbl文件,就可以烧写了,如果烧写时不是JTAG启动模式,软件会给出一个警告,所以建议烧写QSPI的时候设置到JTAG启动模式.

    即:Vivado中烧录的文件也是在SDK里的APP生成的 BOOT Image。

image-20220511163726561

点击OK后,出现:

image-20220511163958793

所以,同样的烧录QSPI还是建议将ZYNQ的启动模式设置为JTAG。(!!!)烧录时设置为JTAG,烧录完成启动还需要设置为QSPI。

如果启动模式是QSPI,可能生效,也可能会失败。

2.6 使用批处理文件快速烧写QSPI

  1. 新建一个 program_qspi.txt 文本文件,扩展名改为 bat, 内容填写如下,其中 set XIL_CSE_ZYNQ_DISPLAY_UBOOT_MESSAGES=1 设置显示烧写过程中的 uboot 打印信息,C:\Xilinx\SDK\2017.4\bin\program_flash 为我们工具路径,按照安装路径适当修改, -f 为要烧写的文件, fsbl 为要烧写使用的 fsbl 文件(芯驿电子特定文件), blank_check verify 为校验选项。
set XIL_CSE_ZYNQ_DISPLAY_UBOOT_MESSAGES=1 
call C:\Xilinx\SDK\2017.4\bin\program_flash -f BOOT.bin -fsbl zynq_fsbl_flash.elf -offset 0 -flash_type qspi_single -blank_check -verify 
pause
  1. 把要烧录的 BOOT.bin 、 fsbl 、 bat 文件放在一个文件夹目录下

image-20220511165430629

  1. 插上 JTAG 线后上电,双击 bat 文件即可烧写 flash 。

注:这里ZYNQ的启动模式,只能设置为QSPI,使用JTAG的话会出错。

image-20220511165723009

3. 仅有PL端逻辑的固化

有很多人会问,如果只有PL 端的逻辑,不需要 PS 端该怎么固化程序呢?不带 ARM 的 FPGA固化是没问题的,但是对于 ZYNQ 来说,必须要有 PS 端的配合才能固化程序。那么对于前面的 ”PL”的 “Hello World ”,”LED “实验 该 怎么固化程序呢?

  1. 根据本章的 PS 端添加 ZYNQ 核并配置,最简单的方法就是在本章工程的基础上添加 LED 实验的 verilog 源文件,并进行例化,组成一个系统,并需要生成 bitstream 。

image-20220511170222899

  1. 生成 bitstream 之后,导出硬件,选择 include bitstream

image-20220511170300212

  1. 在生成 BOOT.BIN 时,还是需要一个 app 工程 hello ,仅仅是为了生成 BOOT.BIN Boot Image Partitions 的文件顺序是fsbl 、 bi tstream 、 app,注意顺序不要颠倒,利用这样生成的 BOOT.BIN就可以按照前面的启动方式测试启动了。

image-20220511170435616

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2024 lk
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信