Vivado-Vitis 协同开发工作流指南

一份面向 Zynq-7000 平台的交互式端到端开发手册

引言

本指南为赛灵思(Xilinx)嵌入式开发提供了清晰、完整的操作流程,覆盖从使用 Vivado 进行硬件平台设计,到利用 Vitis 进行软件应用开发和调试的全过程。本指南以 Zynq-7000 器件为例,详细阐述了完成一个基础“Hello, World!”项目的具体步骤,旨在帮助开发者快速掌握该协同开发工作流。

本手册面向已具备基础数字逻辑知识和C语言编程经验的开发者。文档将重点关注工具的使用流程、关键步骤和注意事项,以确保硬件设计与软件程序能够顺利结合,并在目标板卡上成功运行。

第一章:开发框架与核心理念

在进入具体的操作步骤之前,理解赛灵思异构平台“硬件定义,软件开发”的核心思想至关重要。整个开发流程被清晰地划分为两个阶段,分别由Vivado和Vitis两个工具承担,二者通过一个标准化的硬件描述文件进行衔接。

Vivado 到 Vitis 核心工作流

Vivado 硬件系统设计 Vitis 软件应用开发 .xsa 文件 硬件描述归档

1.1 硬件与软件分离的协同设计流程

赛灵思平台的开发哲学是硬件与软件的协同设计。硬件系统(PL端逻辑和PS端配置)与软件应用(运行在处理器上的代码)是两个相对独立但又紧密耦合的开发过程。

  • Vivado:硬件系统定义。 此工具负责所有底层硬件的设计,包括配置Zynq处理系统(PS)、设计可编程逻辑(PL)中的IP核、定义存储器映射和中断连接等。其最终产物是一个完整的硬件平台描述。
  • Vitis:软件应用开发。 此工具基于Vivado所定义的硬件平台,进行软件应用的开发、编译和调试。软件工程师无需关心底层硬件的实现细节,只需面向一个稳定、明确的硬件接口进行编程。

这种分离式的工作流使得硬件和软件团队可以并行工作,并通过一个明确定义的接口(即XSA文件)进行交互和同步。

核心枢纽:XSA文件的重要性

XSA (Xilinx Shell Archive) 文件是连接Vivado和Vitis的桥梁,是整个工作流中最为关键的交付件。它由Vivado导出,作为Vitis创建软件平台的唯一硬件输入。

可以将其理解为硬件平台向软件开发环境提供的“API文档”或“硬件蓝图”。该文件以二进制格式封装了软件开发所必需的全部硬件信息,包括:

  • 处理器系统(PS)的详细配置。
  • 系统中所有IP核的内存映射(Memory Map)和基地址。
  • 外设与处理器之间的中断连接信息。
  • 系统中各部分的时钟频率。
  • (可选)用于配置FPGA逻辑的比特流(Bitstream)文件。

通过使用XSA文件,Vitis能够精确地了解底层硬件的结构,从而为软件开发自动生成正确的驱动、库和板级支持包(BSP),确保软件代码能够正确地访问和控制硬件资源。

1.2 软件视角:`xparameters.h`的意义

当Vitis基于XSA文件成功创建平台工程后,会在板级支持包(BSP)中自动生成一个至关重要的头文件:`xparameters.h`

这个文件是硬件信息在软件编程层面的直接体现。它将XSA文件中定义的硬件参数(如外设基地址、设备ID、中断号、总线宽度等)转换成C语言的宏定义。例如:


/* 定义UART外设的基地址 */
#define XPAR_XUARTPS_0_BASEADDR 0xE0001000

/* 定义GPIO IP的设备ID */
#define XPAR_GPIO_0_DEVICE_ID 0

/* 定义DDR内存的起始地址 */
#define XPAR_PS7_DDR_0_S_AXI_BASEADDR 0x00100000
                        

在编写应用程序时,开发者只需包含此头文件,即可通过这些具有明确含义的宏来访问硬件,而无需在代码中“硬编码”任何物理地址或数值。这带来了巨大的好处:

  • 抽象与解耦: 软件代码与具体的硬件地址解耦,提高了代码的可读性和可维护性。
  • 可移植性: 如果硬件设计在Vivado中发生变更(例如某个IP的基地址改变),只需重新导出XSA并在Vitis中更新平台,`xparameters.h`便会自动更新。应用程序代码通常无需任何修改即可适应新的硬件配置。

因此,`xparameters.h`文件是软件代码能够感知并正确操作底层硬件的基石。

第二章:Vivado硬件平台设计

硬件平台是软件运行的基础。本章介绍如何使用 Vivado Design Suite 创建一个包含 Zynq-7000 处理系统的基础硬件设计,并最终导出一个供 Vitis 使用的硬件平台文件(.xsa)。

2.1 创建 Vivado 工程

  1. 启动 Vivado,在主界面选择 Create Project
  2. 在工程创建向导中,点击 Next。输入工程名称(例如 `zynq_platform`)及工程存放路径,须确保路径中不包含中文或空格。
  3. 选择 RTL Project,并勾选 Do not specify sources at this time
  4. Default Part 页面,依据所用开发板型号选择正确的芯片。可通过 Boards 标签页选择板卡,或通过 Parts 标签页精确选择芯片型号。选择后点击 Next,然后点击 Finish 完成工程创建。

2.2 创建 Block Design

Block Design 是 Vivado 中用于IP集成的图形化界面,是设计处理系统的核心工具。

  1. 在左侧的 Flow Navigator 窗格中,点击 IP INTEGRATOR 下的 Create Block Design
  2. 保持默认的设计名称(`design_1`),点击 OK

2.3 添加并配置 ZYNQ7 Processing System IP

  1. 在空白的 Diagram 画布上,点击 "+" 按钮或使用快捷键 Ctrl + I,搜索并添加 `ZYNQ7 Processing System` IP核。
  2. 添加IP后,画布上方将出现一个绿色提示条。点击 Run Block Automation
  3. 在弹出的窗口中,勾选 `Apply Board Preset` 选项。此操作将根据已选择的板卡型号自动配置DDR、时钟等关键参数。点击 OK
  4. 双击 ZYNQ7 Processing System IP核以打开配置窗口。在此可检查和修改配置,例如在 MIO Configuration 中使能 UART、SPI、I2C 等外设。对于初学者,Board Preset 的默认配置通常已足够满足需求。
提示: Board Preset 功能极大地简化了Zynq-7000的配置过程。若未使用官方支持的板卡,则需要依据板卡的原理图手动配置DDR、时钟、外设等参数。

2.4 IP核产物生成与顶层文件封装

  1. 在 Diagram 画布上方的工具栏中,点击 Validate Design 按钮(快捷键 F6),以确保设计无连接错误。
  2. 验证通过后,在 Sources 窗口中,右键点击 Block Design 文件(例如 `design_1.bd`),选择 Generate Output Products...
  3. 在弹出的窗口中保持默认设置,点击 Generate。此步骤会预先综合Block Design中的所有IP,生成后续步骤所需的文件。
  4. IP产物生成后,再次在 Sources 窗口中右键点击 Block Design 文件,选择 Create HDL Wrapper...
  5. 选择 Let Vivado manage wrapper and auto-update,点击 OK。Vivado 将自动生成一个顶层Verilog或VHDL文件来例化该Block Design。

2.5 综合、实现与生成 Bitstream

  1. 在左侧的 Flow Navigator 窗格中,点击 Run Synthesis 以执行综合。
  2. 综合完成后,在弹出的对话框中选择 Run Implementation 并点击 OK
  3. 实现完成后,在弹出的对话框中选择 Generate Bitstream 并点击 OK。此步骤将生成FPGA的配置文件,是完整硬件流程的一部分。

2.6 导出硬件平台

此步骤是连接Vivado和Vitis的关键环节,将导出包含硬件信息的文件,供Vitis创建软件平台。

  1. 在 Vivado 菜单栏中选择 File -> Export -> Export Hardware
  2. 在弹出的窗口中,确保 Platform Type 选项为 Fixed
  3. Output 页面,选择 Include bitstream
  4. 指定导出的XSA文件名和路径,然后点击 Finish

第三章:Vitis 软件平台开发

获取硬件描述文件(.xsa)后,即可进入 Vitis 环境进行软件开发。Vitis 是一个集成开发环境,用于开发、调试和部署运行在赛灵思平台上的加速应用和嵌入式软件。

3.1 创建 Vitis Workspace

  1. 打开 Vitis IDE。首次启动时,系统将提示选择一个工作空间(Workspace)。
  2. 选择一个空目录作为工作空间,例如 `vitis_workspace`。此目录将用于存放所有Vitis工程文件。

3.2 创建平台工程 (Platform Project)

  1. 在 Vitis 菜单栏选择 File -> New -> Platform Project
  2. 为平台工程命名,例如 `z7_platform`。
  3. 在下一页中,选择 Create from hardware specification (XSA),然后通过 Browse... 按钮指定在 Vivado 中导出的 `.xsa` 文件。
  4. Software Specification 页面,可保持默认的操作系统(`standalone`)和处理器(`ps7_cortexa9_0`)设置。点击 Finish
  5. 创建后,Vitis将自动根据XSA文件生成板级支持包(BSP)和驱动。在 Explorer 视图中可看到平台工程。右键点击该工程,选择 Build Project 来构建平台。

3.3 创建应用工程 (Application Project)

  1. 在 Vitis 菜单栏选择 File -> New -> Application Project
  2. 在向导中,选择已创建的平台(`z7_platform`)。
  3. 为应用工程命名,例如 `hello_world`。
  4. Domain 页面,保持默认设置。
  5. Templates 页面,选择 Hello World 模板。点击 Finish

3.4 Vitis IDE 界面概览

此时,Vitis IDE 的 Explorer 视图中应包含两个工程:

  • `z7_platform`: 平台工程,包含硬件信息、驱动和BSP。
  • `hello_world`: 应用工程,包含C语言源代码。

中央区域为代码编辑区,默认将打开 `helloworld.c` 文件。底部为控制台(Console)和问题(Problems)视图。

3.5 源代码

`helloworld.c` 的内容展示了包含 `xil_printf.h` 头文件,并使用 `xil_printf` 函数打印信息的基本结构。


#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"

int main()
{
    init_platform();

    print("Hello World\n\r");
    print("Successfully ran Hello World application");

    cleanup_platform();
    return 0;
}
                        

3.6 构建工程

Vitis 默认开启自动构建功能。若未开启,可右键点击 `hello_world` 应用工程,选择 Build Project。构建过程将编译C代码,并将其链接到平台工程的库文件,最终生成可在处理器上运行的 `.elf` 文件。

生成的 `hello_world.elf` 文件可在 `hello_world` 工程的 `Debug` 或 `Release` 文件夹下找到。

第四章:硬件部署与调试

编译完成后,需将可执行程序下载至开发板并运行。该过程可利用 Vitis 的调试功能完成。

4.1 硬件准备

  1. 使用电源适配器为开发板供电。
  2. 使用USB线连接开发板的 JTAG/UART 端口到计算机。该连接同时用于程序下载/调试和串口通信。
  3. 打开计算机的设备管理器,确保JTAG和串口设备已被正确识别。

4.2 在 Vitis 中运行/调试程序

  1. 在 Vitis 的 Explorer 视图中,右键点击 `hello_world` 应用工程。
  2. 选择 Run As -> 1 Launch on HardwareDebug As -> 1 Launch on Hardware
  3. Vitis 将自动执行以下操作:
    • 通过JTAG连接到开发板。
    • 将 Vivado 生成的 bitstream 下载到FPGA(若存在)。
    • 初始化处理器系统。
    • 将编译好的 `.elf` 文件下载到处理器的内存中。
    • 开始执行程序。

4.3 串口终端交互

为观察程序输出,需要使用串口终端工具,例如 Tera Term, MobaXterm 或 Vitis 自带的 Serial Terminal。

  1. 在 Vitis 中,点击底部面板的 Vitis Serial Terminal 标签页。
  2. 点击右上角的 "+" 号以添加新连接。
  3. 选择正确的 COM 端口,波特率通常设置为 115200。点击 OK
  4. 连接成功后,再次运行程序时,终端窗口将显示 "Hello World" 的打印信息。

第五章:关键注意事项与高级技巧

掌握基本流程后,了解一些关键细节和技巧有助于提升开发效率,并避免常见问题。

5.1 版本匹配

重要: Vivado 和 Vitis 的版本必须完全一致。例如,使用 Vivado 2022.2 导出的 XSA 文件,必须在 Vitis 2022.2 中使用。版本不匹配是导致平台工程创建失败或运行时异常的最常见原因之一。

5.2 硬件设计变更后的工作流

在开发过程中,硬件设计(Block Design)的变更是常见的。正确的更新流程至关重要:

  1. Vivado 中修改 Block Design(例如,添加一个GPIO IP)。
  2. 重新运行 Validate Design, Generate Output Products, Create HDL Wrapper, Synthesis, Implementation, Generate Bitstream
  3. 重新执行 Export Hardware,并覆盖原有的 `.xsa` 文件。
  4. 返回 Vitis,在 Explorer 视图中右键点击平台工程(`z7_platform`),选择 Update Hardware Specification
  5. 在弹出的窗口中,选择新的 `.xsa` 文件。Vitis 将自动检测变更并更新BSP和驱动。
  6. 更新完成后,重新构建平台工程和应用工程。

5.3 常见问题排查 (Troubleshooting)

  • 串口无输出: 检查串口线连接、COM端口和波特率设置是否正确,以及Vivado 中对应的UART外设是否已使能。
  • 程序下载失败: 检查JTAG连接是否稳固、开发板电源是否正常、启动模式是否已设置为JTAG模式。
  • 平台构建失败: 确认Vivado/Vitis版本是否匹配,`.xsa`文件路径是否正确,以及磁盘空间是否足够。

结论

遵循本指南的步骤,开发者可以完成从 Vivado 硬件设计到 Vitis 软件部署的全流程。该“Hello, World!”项目虽简单,但其包含了 Zynq-7000 开发的核心步骤和理念:硬件定义平台,软件基于平台开发。

以此为基础,可进一步探索更复杂的应用,例如:

  • 在 Vivado 中添加 AXI GPIO、AXI Timer 等PL端IP,并在 Vitis 中编写驱动程序进行控制。
  • 尝试运行 FreeRTOS 等实时操作系统。
  • 利用 Vitis HLS 将C/C++代码转换成硬件IP,以实现软硬件加速。

本指南为后续的高级开发奠定了坚实的基础。