写在开头

本文讲述了 Xilinx Zynq UltraScale+ MPSoc ZCU102 从开箱到运行第一个程序-HelloWorld 的全部过程。

机器自检

如果是初次拿到 ZCU102 这块板子,个人非常建议在使用之前按照随箱附带的手册进行自检。因为对 ZCU102 的 QSPI Flash 进行烧写后,这段位于 QSPI Flash 自检程序将会被删除。

具体操作参看手册。

Vivado 硬件设计

以截止文章发表时最新的 Vivado 2024.1 为例

安装注意事项

由于涉及到了后续的软件开发,所以需要安装 Vivado SDK 该工具在 Vivado 2019.2 后合并到了 Vitis 中,所以需要安装 Vitis Embedded Development。

其次,由于基于 ZCU102 开发,所以 Production Devices 中需要使用 SoCs 和 UltraScale+

笔者使用的安装如下:

Vivado安装图示

创建硬件工程

  1. 打开 Vivado -> Create Project

    CreateProject

  2. Project Name 自行拟定

    ProjectName

  3. Project Type 选择 RTL Project,勾选 Do not specify sources at this time。

    因为我们不会用到 .v .sv 这样的 RTL 文件。

    RTL

  4. Default Part 切换到 Boards,找到并选择 ZCU102 板卡

    ZCU102板卡选择

  5. 最后配置如图,点击 Finish

    配置总结

创建 MPSOC

  1. 由于 UltraScale+ MPSOC 都是已经配置好的,所以在 IP INTEGRATOR 下直接 Create Block Design 即可。 该选项将创建.bd文件

    BlockDesign

  2. Create Block Design 名字自选。

    CreateBlockDesign

  3. 开始进行作图式硬件设计,点击 ‘+’ 号。

    AddIP

  4. 搜索 Zynq 选择如图所示的 IP 核。

    IP

  5. 最终如图所示

    ZYNQ-MPSOC

配置 MPSOC

  1. 双击 MPSOC 图标打开 MPSOC 配置界面。

  2. 配置 UART,由于创建的 MPSOC 只是 UltraScale+ 的,而不是针对 ZCU102 的,所以 MIO 的配置需要参考 ZCU102 的原理图,如下:

    这里放一个 ZCU102 原理图下载链接,需要可以自取。

    UART-MIO配置
    配置UART

  3. 其余配置如图,也可以参考 ZCU102 用户手册自行配置。

    其他配置

  4. DDR 配置需要注意一点,新版的 ZCU102 如果是镁光的话,可能会是 16bit 位宽的 DDR。所以不再能使用默认配置,需要进行修改。

    新版DDR

    • 首先点击默认的镁光 DDR,选择 YES
      默认镁光.png
    • 修改 DRAM Device Capacity 为 8192,Row Address Count 为 16。剩下不变,点击 OK 完成所有配置。
  5. 最后连接时钟线,防止报错

    时钟线

生成 bit 流文件

  1. 验证设计的正确性

    ValidateDesign.png

    出现如下图所示,即为设计正确。

    ValidationSucceed

  2. verilog 化 bd 文件
    切换到 Source 试图,点开 Design Sources 文件夹,右键 .bd 顶层文件,点击 Generate Output Products 生成输出产物,该选项会以 .v 的形式生成 .bd 的下一层,里面包含了该 .bd 使用的所有核。

    生成产物.jpg

    综合选项如下:

    综合选项.png

    其中,Global 代表全部综合,Out of context per IP 代表综合改变的 IP 核,Out of context per Block Design 代表综合改变的 bd 文件。

  3. 让 bd 可综合实现

    和上一步类似,右键 .bd 顶层文件,点击 Create HDL Warpper,选择 Let vivado manage warpper and auto-update。前者将 .bd 用一个 .v 形式的 warpper 包裹起来,使其可以综合实现。后者决定了该 warpper 的生成是 vivado 自动生成的。

    Warpper选项.png

  4. 生成 bit 流

    到这一步,即可和一般开发流程一样直接点击 Generate Bitstream. vivado 会自动完成 综合、实现、生成比特流。

    生成比特流.png

    耐心等待一会,可以查看右上角来看自己进行到了哪一步,出现下图即为生成成功

    比特流生成成功

    此时已经在工程目录下生成了bit文件:xx/xx.runs/imple_1/xxx_wapper.bit

生成 xsa 文件

因为涉及到了 FPGA 上的软件开发,所以需要使用 vitis,而在 vivado 中对板子的配置就记录在了 xsa 文件中,有了 xsa 文件,在编写软件时就可以忽略硬件。具体生成方式如图:

xsa操作路径

ExportHardware

是否勾选 bit 流则取决于是否用到了 PL,由于本文尝试烧写 Flash,也算是进行了修改所以勾选上,之前生成的 bit 流将会被复制到所选的目录。

Vitis 软件设计

有了硬件描述的 xsa 文件,可以在此基础上进行软件开发。

创建 platform 组件

  1. 首先利用 xsa 文件,因此要先将工作空间创建到我们之前保存 xsa 文件的位置。

    OpenWorkSpace

  2. 打开后,就要使用 xsa 文件来创建 Platform Component,此为 Vitis 使用 xsa 文件的方法。

    Platform-1

    • Name and Location 中,Location 就是工作目录,名字随意。

    • 在 Flow 中,选择 Hardware Design,点击 browse 来选择 xsa 文件

    Platform-2

    • 之后在 OS and Processor 中,Vitis 会自动读取 xsa 配置,提供出可选项,我们只是开发一个程序,所以选择 standalone + cortexa53_0,即使用 ps 的 0 核,并且勾选 FSBL (理解为 bootloader)

    OS

    • 一路确定即可。

    • 创建好后 点击一下 build 将构建出板子对应的 fsbl.elf,出现对号此步骤即完成,在 Output - plaform - sw - boot 下将看到产物。

    BuildFSBL

创建 helloworld 示例

  1. 回到欢迎页,点击 Examples

    HWexample

  2. 选择 Hello World ,点击 + 号,之后的 Name and Location 和前面类似,Hardware 选择刚才创建好的 Platform, domain 选择刚才创建好的 Platform 里面的 CPU(a53_0),完成即可。

    HelloWorld

  3. Build 一下 创建好的 Hello world,此时,所有的编写工作就都完成了,接下来就是烧写和启动。

    BuildHW

创建 Boot.bin

直接点击 Hello world 下的,Create Boot Image,该选项直接按照顺序将 fsbl + wrapper.bit + hello_world.elf 合在一起生成 Boot.bin,只需要指定输出目录即可。

CBootImage

烧写和启动

准备工作

ZCU102示意图

  1. 首先按照图示连接 uart、jtag 线,jtag 用于烧写 QSPI Flash,uart 用于串口通信,连接后打开电脑的设备管理器,理应出现下面的设备:

    COM示意

    其中,COM1通信端口对于 jtag,其余四个对应 uart。如果只有通信端口,那么则可能是本机没有安装 usb 转 uart 的驱动,可以到这里来安装
    CP210x USB to UART Bridge VCP Drivers
    . 安装完即可正常显示。

  1. 下载一个与串口交互的软件,这里使用 MobaXterm,连接到 uart0 串口,即上图中的 Interface 0

    MobaXterm

烧写

  1. 回到 Vitis,查看是否 Vitis 识别到了 Jtag,点击导航栏的 Vitis - Target Connections。

    TargetConnection-1

  2. 双击 Local,打开配置界面,点开 Advance,观察是否有设备出现,如果有,则说明 Vitis 成功识别到了该 FPGA 板子

    TargetConnection-2

    TargetConnection-3

  3. 同样的,点击导航栏的 Vitis - Program Flash,选择好刚才要启动的 Boot.bin,Flash 模式写为很早之前在硬件配置的 Dual Para。Flash Density 可以随意。

    ProgramFlashMemory

  1. Progarm 启动后可能会遇到报错,如果遇到这样的报错:

    乱码报错

    则一般实际上的报错是:

    实际报错

    这个问题比较抽象,解决方法是右键桌面图标 Vitis Console,以记事本编辑,删掉下图中的两个空格:

    解决方法

  2. 等待烧写,可以在界面看到烧写进度,出现如下图类似的输出即为烧写成功。

    烧写成功

启动

关掉 ZCU102 板子,将 MobaXterm 打开,连接到 UART0 ,启动 ZCU102 观察是否有下图输出,有则证明全过程正确,本文结束。

结果展示