Xilinx Vitis | 开发环境搭建、流程设计及故障排除

注:本文为"Xilinx Vitis"相关合辑。

略作重排,如有内容异常,请看原文。

本文档保留操作说明供历史项目参考。


Xilinx Vitis | 开发环境搭建、流程设计及故障排除

1. Vitis 概述

1.1 简介

Vitis 是 Xilinx 出品的一套统一软件开发平台,用于 FPGA 和 SoC 器件的应用开发。与 Vivado 相比,Vitis 具有以下区别:

  1. Vitis 支持 C/C++ 高级语言以及 Verilog 等硬件描述语言实现硬件逻辑,Vivado 仅支持 Verilog 和 VHDL。
  2. Vitis 开发基于一套 Platform(平台)机制,Vivado 需要开发者自行搭建硬件平台。
  3. Vitis 提供 C/C++ 编译的标准库和语法支持,Vivado 不提供。
  4. Vitis 提出 Kernel(内核)的概念(*.xo 文件),使用 AXI、AXI4-Lite、AXIS 三种接口进行通信,分别对应 Verilog 中的相关概念。
  5. 为避免不同时钟差异,Vitis 中一个 Kernel 只能使用一种时钟频率,甚至同一工程内多个 Kernel 也共用同一时钟;Vivado 无此限制。
  6. Vitis 通过 dataflow、unroll、pipeline、task 等编译指示解决并发问题,Vivado 需要开发者手动控制。
  7. Vitis 与 Vivado 对 RAM 访问有相同的限制,Vitis 通过 array_partition 等相关编译指示对 RAM 变量进行分割、重组、位宽管理,以达到最优化效果。
  8. Vitis 对 AXI 访问全局内存采用突发(burst)方式,通过实现 FIFO 缓存、组合请求来优化访问效率。

1.2 Vitis 版本演进

Vitis 2024.1 版本完全移除了传统 GUI 界面,采用统一软件界面(Unified IDE)。该界面整合了 Vitis、Vitis AIE 编译器/仿真器和 Vitis HLS 的图形用户界面,提供一致的操作体验。

Vitis 统一 IDE 的主要特性:

  • Flow Navigator:支持工作流程管理,提供模板样本辅助入门,支持多任务并行执行。
  • AI 引擎优化:软件仿真在 x86 环境下加快迭代速度,AI 引擎的流水线和微代码视图获得多核支持和筛选功能增强。
  • 主题与快捷键:提供明亮和暗色两种主题,支持自定义快捷键,支持 C++ 语法高亮和智能提示。
  • 灵活切换:GUI 和 CLI 模式无缝转换,配置文件实时展示,CLI 用于构建项目,GUI 用于调试和内核分析,操作记录可用于批处理。

2. 环境搭建

2.1 系统要求

推荐使用 Linux 系统进行开发。Vitis 2024.1 在 Ubuntu 22.04 环境下进行测试验证。

2.2 安装 Vitis

2.2.1 安装包选择
  • 安装 Vitis 时自动包含 Vivado。
  • 若仅安装 Vivado,Vitis 不会被安装。
  • 根据需求选择设备支持包,避免安装全部组件占用约 100 GB 空间。
2.2.2 安装步骤

在线安装网速较慢时,可选择离线下载安装包。以 Vitis 2019.2 为例:

bash 复制代码
# 解压缩安装包
tar xvf Xilinx_Vitis_2019.2_1106_2127.tar

# 进入安装目录
cd Xilinx_Vitis_2019.2_1106_2127/

# 执行安装程序
./xsetup

安装需要至少 120 GB 磁盘空间,建议预留 150 GB 以上。安装过程中建议关闭磁盘优化选项(optimize disk usage),否则安装过程可能长时间卡住。

2.2.3 从 Vivado 启动 Vitis

安装完成后,可通过 Vivado 启动 Vitis IDE:

text 复制代码
Vivado -> Tools -> Launch Vitis IDE

2.3 安装 PetaLinux

PetaLinux 用于生成 Linux 镜像。从 Xilinx 官方网站下载对应版本的 PetaLinux 工具和 BSP 文件:

bash 复制代码
https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools.html

安装完成后,设置环境变量:

bash 复制代码
source ~/Desktop/petalinux/settings.sh

创建工程:

bash 复制代码
petalinux-create -t project -s xilinx-zcu102-v2019.2-final.bsp

根据硬件描述文件重新配置:

bash 复制代码
petalinux-config --get-hw-description='/path/to/hardware/description'

2.4 许可证配置

2.4.1 申请 HLS 许可证

依照《Vitis High-Level Synthesis User Guide (UG1399)》中的步骤申请 Xilinx.lic 文件。设置 Host ID 后下载许可证文件。

设置 Host ID

下载 License 文件

2.4.2 导入许可证

在 Linux 系统中,启动 Vivado License Manager 导入许可证文件:

bash 复制代码
source settings64.sh
vlm

按照界面提示导入许可证文件并验证是否导入成功。

2.5 Cable 驱动与串口配置

Linux 系统需手动安装硬件调试的 Cable 驱动。串口调试时注意可能的驱动冲突(如 CH341),出现问题时可尝试卸载无关依赖或禁用冲突程序。

3. Vivado 设计流程

3.1 创建 Vivado 工程

  1. 启动 Vivado,选择 Create Project ,点击 Next。
  2. 输入工程名称并选择保存路径,点击 Next。
  3. 选择工程类型,点击 Next。
  4. 根据目标器件选择器件型号,点击 Next。
  5. 确认工程信息,点击 Finish。

以下截图展示了 Vivado 工程创建向导的各步骤界面,依次呈现工程命名与路径设置、工程类型选择、器件型号选择以及工程信息确认等页面。

3.2 创建 Block Design

  1. 在 Sources 窗口右键,选择 Create Block Design ,修改名称后点击 OK。
  2. 打开 Diagram 窗口,右键空白处或按 Ctrl+I ,选择 Add IP。
  3. 搜索并添加 Zynq Processing System(Zynq7 或 Zynq UltraScale+ MPSoC)。
  4. 右键空白处选择 Run Block Automation 进行自动连线。

以下截图展示了 Block Design 的创建流程,包括新建 Block Design、通过 IP Catalog 添加 IP、搜索并选择 Zynq Processing System IP 以及执行 Block Automation 自动连线等操作界面。

  1. 手动连接 M_AXI_GP0_ACLK 和 FCLK_CLK0。
  2. 双击 Zynq 器件进入配置界面,根据需求配置 PS 端外设(如 UART、DDR 等)。

以下截图展示了手动连接时钟信号后的 Block Design 结果、手动连接 M_AXI_GP0_ACLK 与 FCLK_CLK0 的操作界面,以及 Zynq PS 器件配置窗口中外设参数的设置情况。

3.3 配置 PS 端外设

根据实际需求配置 Zynq PS 的外设:

  • DDR:作为系统运行的必要内存组件。
  • UART:用于串口调试通信。
  • MIO/EMIO:根据外设类型选择复用 I/O 或扩展复用 I/O。

配置完成后取消不需要的时钟和接口勾选,如 FCLK_RESET0_N 和 M_AXI_GP0 接口(若不使用)。

以下截图展示了 Zynq PS 外设配置的具体操作,包括 DDR 内存控制器配置、UART 串口参数设置、取消不需要的时钟输出勾选,以及禁用 FCLK_RESET0_N 和 M_AXI_GP0 接口的配置界面。

PS 外设配置

UART 参数配置

取消不需要的时钟

取消 FCLK_RESET0_N 和 M_AXI_GP0

3.4 验证设计

右键空白处选择 Validate Design 验证 Block Design 的完整性。验证通过后显示成功提示。

以下截图展示了执行 Design Validation 的操作界面以及验证通过后的成功提示信息。

3.5 生成 HDL Wrapper 与比特流

  1. 在 Sources 窗口找到 .bd 文件,右键选择 Create HDL Wrapper。
  2. 勾选 Let Vivado manage wrapper and auto-update ,点击 OK。

以下截图展示了在 Sources 窗口中对 .bd 文件右键创建 HDL Wrapper 的操作界面,以及勾选 "Let Vivado manage wrapper and auto-update" 选项的配置窗口。

  1. 运行综合:右键选择 Run Synthesis。

以下截图展示了在 Vivado 中运行综合(Run Synthesis)的操作界面。

  1. 生成比特流:选择 Generate Bitstream。

以下截图展示了执行 Generate Bitstream 生成比特流的配置与执行界面。

  1. 生成输出产品:右键 .bd 文件选择 Generate Output Products。

以下截图展示了右键 .bd 文件执行 Generate Output Products 的操作界面、生成进度窗口以及完成提示对话框。

3.6 导出硬件描述文件

导出硬件平台文件(*.xsa),该文件在 Vitis 和 PetaLinux 开发中为必需文件:

  1. 选择 File -> Export -> Export Hardware。
  2. 勾选 Include bitstream ,点击 Next。
  3. 为 *.xsa 文件设置存放路径,点击 Finish。

以下截图展示了导出硬件平台文件(.xsa)的完整流程,包括选择 Export Hardware 菜单、配置导出选项(包含比特流)、设置文件保存路径以及导出完成的确认界面。

4. Vitis 开发流程

4.1 启动 Vitis IDE

通过 Vivado 启动 Vitis(Vivado -> Tools -> Launch Vitis IDE),设置工作路径后点击 Launch。

4.2 创建 Platform 工程

  1. 选择 Create Platform Project ,为平台项目命名,点击 Next。
  2. 点击 Browse 选择之前生成的 *.xsa 文件,点击 Finish。

以下截图展示了创建 Platform Project 的工程命名界面以及浏览选择之前导出的 .xsa 硬件描述文件的操作窗口。

4.3 创建 Application 工程

  1. 选择 Create Application Project ,点击 Next。
  2. 选择已创建的 Platform,点击 Next。
  3. 输入应用工程名称,点击 Next。
  4. 选择模板(如 Hello World),点击 Next。
  5. 命名工程,点击 Next。
  6. 选择模板,点击 Finish。

以下截图展示了创建 Application Project 的完整向导流程,包括项目名称设置、Platform 选择、模板选择(Hello World)、工程命名以及最终确认等各个界面。

创建 Application Project

选择 Platform

选择模板

工程命名

选择 Hello World

4.4 编译与调试

右击工程进行编译,选择 Launch Hardware 进行调试运行。

编译与调试

4.5 串口调试

打开 Vitis Serial Terminal 配置接口信息,点击 OK 后 Resume 运行。

4.6 使用 Board Support Package 例程

在 Platform 工程中,展开 platform.spr -> Board Support Package,可查看文档或加载例程:

  1. 点击 Documentation 在浏览器中打开外设 API 文档。
  2. 点击 Import Examples 导入示例代码。

以下截图展示了在 Platform 工程中展开 Board Support Package 查看 BSP 例程的界面,包括 GPIO 外设驱动示例列表、API 参考文档页面以及导入示例代码的操作窗口。

示例说明:

  • xgpiops_intr_example.c:展示如何使用 XGpiops 驱动程序在中断模式下检测按钮事件并控制 LED 输出。
  • xgpiops_polled_example.c:展示如何使用 XGpiops 驱动程序进行引脚的读取/写入操作。

4.7 编写应用程序源码

在应用工程的 src 目录下新建 .c 文件,编写应用程序代码。编译工程后,若使用了 PL 资源需先加载比特流文件对 PL 部分进行配置:

text 复制代码
Xilinx -> Program FPGA

点击 Program 完成 PL 配置后,在应用工程上右击选择 Run As -> Launch Hardware 下载并运行程序。

以下截图展示了在 Vitis 中编写应用程序的完整操作流程,包括新建 .c 源文件、输入文件名 main.c、编译工程、查看编译完成状态、通过 Program FPGA 下载比特流配置 PL 部分,以及串口终端输出运行结果的界面。

串口调试窗口可通过 Window -> Show View -> Terminal 打开,点击右上角 + 连接相应串口。

5. Vitis HLS 开发

5.1 概述

在 Vitis Unified IDE 中,PL 内核被创建为 HLS 组件。开发者可在 C/C++ 源代码上运行 C 仿真,使用编译指示或指令优化设计,综合和分析结果,并将设计导出为 Vivado IP 与 Vivado Design Suite 一起使用,或作为 Vitis Kernel(.xo)文件在更高级别的系统项目中使用。

编写测试平台可提升开发效率。C 函数的执行速度显著高于 RTL 仿真,在综合前使用 C 进行算法开发与验证可缩短开发周期。

5.2 创建 HLS 组件

  1. 选择 HLS Component 类型创建新项目。
  2. 输入组件名称和路径。
  3. 创建配置文件。
  4. 选择综合源文件和 TestBench(可后续添加)。
  5. 选择硬件平台。
  6. 配置 Clock 和 Flow。当未指定时钟不确定度时,默认时钟不确定性为时钟周期的 27%。
  7. 查看摘要信息,完成组件创建。

以下截图展示了在 Vitis Unified IDE 中创建 HLS Component 的完整向导流程,依次呈现选择 HLS 组件类型、输入组件名称与路径、创建配置文件、选择综合源文件和 TestBench、选择硬件平台、配置 Clock 与 Flow 参数、查看配置摘要信息以及组件创建完成等各个界面。

5.3 C Synthesis 配置详解

在 Vivado IP Flow Target 流程中,C Synthesis 提供两类配置选项。

5.3.1 Classic Configuration Settings

在 Vitis HLS 的 Classic 配置界面中,可通过 config_* 命名空间的配置项对综合行为进行精细控制。以下列出各配置组的参数及其默认值与作用说明。

config_array_partition --- 数组分区配置组

  • complete_threshold, default=4 --- 设置完全分区数组的元素数量阈值。元素个数小于该阈值的数组将被完全分区为独立元素,避免综合器对小型数组进行不必要的分区优化。
  • throughput_driven, default=auto (auto/off) --- 控制是否根据吞吐量需求自动执行数组分区。auto 模式下综合器根据数据流分析自动决定分区策略;off 模式禁用自动分区。

config_compile --- 综合编译配置组

  • enable_auto_rewind, default=true --- 启用自动循环回绕机制。为真时,综合器为流水线循环生成替代实现,使用自动循环回绕(auto-rewind)逻辑减少流水线气泡。
  • ignore_long_run_time, default=false --- 忽略长运行时间警告。启用后综合器在耗时较长的综合阶段不会因超时发出警告。
  • name_max_length, default=80 --- 指定函数/信号名称的最大长度。超过该阈值的名称将被截断,以避免 RTL 输出中名称过长导致下游工具解析失败。
  • no_signed_zeros, default=false --- 忽略浮点零的符号位。启用后可对浮点运算进行更激进的合并与化简优化(等价于 -ffast-math 中的 no-signed-zeros 选项)。
  • pipeline_loops, default=64 --- 设置自动流水线化的循环迭代阈值。迭代次数大于该值的循环将被自动应用 PIPELINE 编译指示。
  • pipeline_style, default=frp (stp/flp/frp) --- 设置默认流水线样式偏好。stp(single-threaded pipeline)单线程流水线;flp(flat loop pipeline)扁平循环流水线;frp(flat region pipeline)扁平区域流水线。此为偏好设置而非硬性约束。
  • pragma_strict_mode, default=false --- 启用严格的编译指示语法检查。启用后将旧版或不正确的 #pragma 语法视为错误而非警告。
  • pre_tcl --- 综合前执行的 Tcl 脚本路径。可用于在综合之前注入自定义 Tcl 命令以修改综合选项或环境变量。
  • unsafe_math_optimizations, default=false --- 启用不安全的数学优化。忽略浮点零的符号并允许浮点运算的结合律重排,从而对浮点操作进行激进的编译器优化(可能影响数值精度)。

config_dataflow --- 数据流配置组

  • default_channel, default=pingpong (fifo/pingpong) --- 设置数据流通道中未显式指定内存类型的数组所使用的默认存储通道类型。pingpong 使用 ping-pong 双缓冲 RAM;fifo 使用 FIFO 内存,适用于流式数据(数据按顺序读取和写入)场景。需配合 set_directive_array_stream 命令将数组设为流式访问。
  • disable_fifo_sizing_opt, default=false --- 禁用 FIFO 大小优化。该优化会自动增大 FIFO 深度以提升性能并减少死锁风险,但会增加资源消耗;禁用后 FIFO 深度保持用户指定值。
  • fifo_depth, default=2 --- 指定 FIFO 通道的默认深度。当使用 ping-pong 存储时此选项不生效。未指定时通道 FIFO 深度自动设为最大生产者或消费者大小中的较大者。
  • override_user_fifo_depth, default=0 --- 覆盖设计中所有 FIFO 的深度(除非用户已指定的深度大于覆盖值)。设为 0 表示不覆盖。
  • scalar_fifo_depth, default=2 --- 指定标量值传播 FIFO 的最小深度。未指定时取 fifo_depth 选项值(若已指定),否则为 2。
  • start_fifo_depth, default=2--- 指定启动传播(start propagation)FIFO 的最小深度。未指定时取fifo_depth` 选项值(若已指定),否则为 2。
  • strict_mode, default=warning (off/warning/error) --- 设置数据流规范消息的严重级别。off 关闭数据流检查消息;warning 以警告级别报告数据流规范问题;error 以错误级别报告并阻止综合。
  • strict_stable_sync, default=false --- 强制稳定端口(stable ports)与 done 信号同步。启用后确保稳定端口的数据在 done 有效时保持稳定。
  • task_level_fifo_depth, default=2 --- 设置任务级 FIFO 的默认深度,用于自动创建的在处理过程之间传输标量的 FIFO。

config_debug --- 调试配置组

  • directory, default=.debug --- 指定调试文件输出目录名称(相对于 solution 方案目录)。
  • enable, default=false --- 启用调试文件生成。开启后综合过程中生成调试信息文件供后续分析使用。

config_export --- 导出配置组(Vivado IP 导出相关选项)

config_interface --- 接口配置组(AXI 接口映射相关选项)

config_op --- 运算符配置组(运算符 RTL 实现风格相关选项)

config_rtl --- RTL 配置组(RTL 输出相关选项)

config_schedule --- 调度配置组

  • enable_dsp_full_reg, default=true --- 启用完整的 DSP48 寄存器利用率。启用后综合器充分使用 DSP48 Slice 内部的流水线寄存器以提升高频性能。

config_storage --- 存储实现配置组

  • fifo impl, default=autosrl (bram/lutram/ram/memory/srl) --- 指定 FIFO 的底层存储实现类型。autosrl 自动选择最优实现;bram 使用 Block RAM;lutram 使用 LUT RAM;ram 使用分布式 RAM;memory 使用 BRAM/URAM;srl 使用移位寄存器链。
  • fifo auto_srl_max_bits, default=1024 --- 设置 FIFO 自动推断 SRL(移位寄存器链)的最大比特数。超过此值的 FIFO 不会使用 SRL 实现。
  • fifo auto_srl_max_depth, default=2 --- 设置 FIFO 自动推断 SRL 的最大深度。深度超过此值的 FIFO 不会使用 SRL 实现。

config_unroll --- 循环展开配置组

  • tripcount_threshold, default=0 --- 设置自动展开循环的迭代次数阈值。迭代次数(trip count)小于该阈值的循环将被自动展开(unroll),设为 0 表示不自动展开。
5.3.2 New Configuration Settings (Vitis Unified IDE)

Array Partition

  • array_partition.complete_threshold: 设置完全分区数组的阈值。具有少于阈值元素的数组将被完全分区为单独的元素。
  • array_partition.throughput_driven: 启用自动部分和/或完全数组分区。

Array Stencil

  • array_stencil.throughput_driven: 启用自动数组模板。

Compile

  • compile.design_size_maximum_warning: 当总设计指令超过此值时显示警告。
  • compile.enable_auto_rewind: 当为真时,启用用于流水线循环的替代 HLS 实现,该实现使用自动循环回绕。
  • compile.ignore_long_run_time: 忽略长运行时间警告。
  • compile.name_max_length: name_max_length 选项将指定函数名称的最大长度。如果长度超过阈值,名称的最后部分将被截断。
  • compile.no_signed_zeros: no_signed_zeros 选项将忽略浮点零的符号,以便编译器可以对浮点操作进行最大程度的优化。
  • compile.pipeline_flush_in_task: 启用数据流中的非回绕流水线默认刷新。
  • compile.pipeline_loops: 循环的迭代次数大于此值将自动进行流水线处理。
  • compile.pipeline_style: 设置默认流水线样式,这是一种偏好而不是硬性约束。
  • compile.pragma_strict_mode: 启用错误而不是警告,用于旧的和不正确的编译指示语法检查。
  • compile.unsafe_math_optimizations: unsafe_math_optimizations 选项将忽略浮点零的符号,并启用浮点操作的结合性,以便编译器可以对浮点操作进行激进的优化。

Dataflow

  • dataflow.default_channel: 默认情况下,在使用数据流流水线时,将以 ping-pong 方式配置的 RAM 内存用于在函数或循环之间缓冲数据。当使用流式数据(数据总是按顺序读取和写入)时,FIFO 内存将更有效,并可以选择为默认内存类型。必须使用 set_directive_array_stream 命令将数组设置为流式,以便执行 FIFO 访问。
  • dataflow.disable_fifo_sizing_opt: 禁用增加资源使用量并可能提高性能并减少死锁的 FIFO 大小优化。
  • dataflow.fifo_depth: 指定 FIFO 的默认深度的整数值。当使用 ping-pong 方式的存储器时,此选项不起作用。如果未指定,通道中使用的 FIFO 将设置为最大生产者或消费者的大小(以较大者为准)。
  • dataflow.override_user_fifo_depth: 设置设计中所有 FIFO 的深度,除非深度已经大于覆盖值。
  • dataflow.scalar_fifo_depth: 指定标量值传播 FIFO 的最小深度的整数值。如果未指定,最小值为 fifo_depth 选项的值(如果指定),否则为 2。
  • dataflow.start_fifo_depth: 指定启动传播 FIFO 的最小深度的整数值。如果未指定,最小值为 fifo_depth 选项的值(如果指定),否则为 2。
  • dataflow.strict_mode: 设置数据流规范形式消息的严重程度。
  • dataflow.strict_stable_sync: 稳定端口强制与 done 同步。
  • dataflow.task_level_fifo_depth: 默认任务级 FIFO 深度(用于自动创建的用于在处理过程之间传输标量的 FIFO)。

Debug

  • debug.directory: 相对于 solution 方案目录的输出目录名称。
  • debug.enable: 启用调试文件生成。
  • debug.enable_verbose_report: 启用覆盖率报告。

Interface

RTL

Schedule

  • schedule.enable_dsp_full_reg: 启用完整的 dsp48 寄存器利用率。

Unroll

  • unroll.tripcount_threshold: 自动展开循环,其迭代次数少于此阈值。

Op

  • hls.syn.op: 配置不同运算符的默认实现样式和延迟。

Storage

  • hls.syn.storage: 配置不同类型存储元素的默认实现样式和延迟。

5.4 C Simulation

Vitis Unified IDE 的 C Simulation 对话框提供以下选项:

  • csim.clean:启用清理构建。如果不选择此选项,csim_design 将进行增量编译。
  • csim.code_analyzer:启用代码分析器。设计在执行过程中将被分析。
  • csim.sanitize_address:启用地址检查器。
  • csim.sanitize_undefined:启用未定义行为检查器。
  • csim.setup:当指定此选项时,C 仿真二进制文件将被创建在当前解决方案的 'csim' 目录中,但不会执行仿真。

5.5 C/RTL Co-simulation、Implementation 与 Package

C/RTL 协同仿真、Implementation 和 Package 流程与传统 Vitis IDE 类似。在 Vitis Unified IDE 中,Package 为独有流程步骤。

以下截图展示了 Vitis HLS 的 C Synthesis、C/RTL 协同仿真、Implementation 和 Package 各流程步骤的配置界面,以及 Classic Configuration 和 New Configuration 两类配置选项的界面对比。

6. Zynq 外设开发

6.1 MIO 与 EMIO

6.1.1 MIO(Multiplexed I/O)

MIO 是用于直接连接 Zynq Processing System(PS)的固定 I/O 接口,支持外设如 UART、SPI 和 I2C。它们不需要通过可编程逻辑(PL)的中介。

配置步骤:

  1. 在 Vivado 中,通过 "Zynq Processing System" 界面分配特定的输入/输出引脚到 MIO。
  2. 开启 MIO 外设功能,例如将 UART1 映射到特定的 MIO 引脚。

Vitis 中的使用:调用适当的外设驱动,如 xuartps(UART 驱动)用于初始化并执行操作,例如发送和接收数据。

6.1.2 EMIO(Extended Multiplexed I/O)

EMIO 允许 PS 和 PL 之间灵活的 I/O 指配,能够借助 FPGA 灵活实现自定义逻辑和外设控制。

配置步骤:

  1. 在 Vivado 的 Block Design 中,将 PL 与 PS 的接口切换至 EMIO。
  2. 利用 PL 来传输信号至外部硬件或在 FPGA 内部逻辑中处理。

Vitis 中的使用:集成对应外设驱动,通过 API 函数来进行 I/O 操作。

6.2 GPIO 实现

6.2.1 AXI 总线概述

AXI 总线提供三种接口类型:

  • AXI-Lite:简化版,用于低延迟控制信号。
  • AXI-Full:全功能版,适合高吞吐量数据传输。
  • AXI-Stream:面向高效数据流传输,无需地址,常用于实时应用。
6.2.2 添加和配置 AXI 外设

在 Vivado 中:

  1. 打开 IP Catalog,选择 AXI GPIO 等外设,配置 AXI 总线参数(地址范围、数据宽度)。
  2. 将这些外设通过 Block Design 集成到 Zynq PS 的 AXI 总线上。

在 Vitis 中:

  • 使用 xgpio 驱动 APIs 进行操作,初始化(XGpio_Initialize())、方向设置(XGpio_SetDataDirection())、数据读写(XGpio_DiscreteWrite() 和 XGpio_DiscreteRead())。
6.2.3 AXI GPIO 示例代码
c 复制代码
#include "xgpio.h"

XGpio Gpio;

int main() {
    // 初始化 GPIO
    XGpio_Initialize(&Gpio, GPIO_DEVICE_ID);
    // 设置方向,通道 1 设为输出
    XGpio_SetDataDirection(&Gpio, 1, 0x00);

    while (1) {
        // 写入数据
        XGpio_DiscreteWrite(&Gpio, 1, 0xFF);
    }

    return 0;
}

6.3 中断实现

6.3.1 中断配置

在 Vivado 中:

  1. 激活 Zynq 中断控制器(General Interrupt Controller, GIC)。
  2. 为需要中断支持的外设(如 GPIO、Timer)指定中断线。

在 Vitis 中:

  1. 创建中断向量表,自动生成的 Board Support Package(BSP)中通常包括。
  2. 进行中断处理程序注册和初始化。
  3. 编写中断服务程序(ISR)并用 XScuGic_Enable() 函数激活特定中断。
6.3.2 中断服务程序示例
c 复制代码
void MyInterruptHandler(void *CallbackRef) {
    // 中断处理逻辑
}
6.3.3 中断初始化示例
c 复制代码
XScuGic InterruptController;
XScuGic_Config *ConfigPtr;

// 初始化中断控制器
ConfigPtr = XScuGic_LookupConfig(INTC_DEVICE_ID);
XScuGic_CfgInitialize(&InterruptController, ConfigPtr, ConfigPtr->CpuBaseAddress);

// 注册和启用中断
XScuGic_Connect(&InterruptController, INTR_ID, (Xil_ExceptionHandler)MyInterruptHandler, NULL);
XScuGic_Enable(&InterruptController, INTR_ID);

7. Vitis 2024.1 界面变更

7.1 界面变更概述

Vitis 2024.1 不再支持传统界面,采用 Vitis Unified 统一开发环境,将 Vitis HLS 与 SDK 合并至同一界面。

启动 Vitis Unified IDE:

bash 复制代码
vitis -w <workspace>

其中 workspace 是一个文件夹,用于保存设计的各种组件和项目。

传统 Vitis IDE 启动每个 Flow 时都会弹出配置对话框。新 Vitis Unified IDE 全部都在 Vitis Component 下的 Settings 下进行设置,启动每个 Flow 则会直接运行。

各 Flow 配置选项:

C Simulation Dialog

C Simulation 对话框提供 C 仿真相关的配置选项,包括清理构建、代码分析器、地址检查器等设置。

C Synthesis:配置 C 综合目标(速度/面积/时序优化)、时钟频率、存储实现策略等选项。综合完成后生成 RTL 网表文件。

C/RTL Co-simulation:执行 C/RTL 协同仿真,在 RTL 级别验证设计功能正确性,支持信号级波形查看。

Implementation:执行实现流程,包括布局布线(Place & Route)和时序分析,生成比特流文件。

Package (Vitis Unified IDE 独有):将综合实现后的设计打包为 .xo 文件,供 Vitis 上层平台工程使用。

7.3 License 管理

7.3.1 申请 HLS 许可证

HLS 许可证的申请步骤详见本文 [2.4.1 申请 HLS 许可证](#2.4.1 申请 HLS 许可证) 章节。

7.3.2 导入 HLS 许可证

在 Ubuntu 系统中,通过以下命令启动 Vivado License Manager:

bash 复制代码
source settings64.sh
vlm

在 License Manager 界面中,选择 File -> Install License ,浏览并选择已下载的 .lic 许可证文件,按提示完成导入。导入后可通过 File -> View License Status 确认许可证状态。

8. 故障排除

8.1 Vitis IDE 启动失败(闪退)

偶尔使用 Vitis IDE 2022.1 时,发现启动后闪退,闪退后可以在 Windows 任务管理器中看到 eclipse.exe 已运行,但不出现 UI 界面。按照网上做法修改 vitis.bat 无效。

通过如下方式可以临时解决:

  1. 启动 Xilinx Software Command Line Tool 2022.1。
  2. 输入命令:
bash 复制代码
exec vitis -workspace <path to save files>

不可使用鼠标右键菜单,但可以通过 Ctrl+V 粘贴路径地址。

8.2 Vitis IDE Launch Failed / Web Installer Client Obsolete

8.2.1 原因分析

出现 "Vitis IDE Launch Failed" 或 "Web installer client Obsolete" 错误的原因:

  1. 安装 Xilinx 软件时选择的是 Vivado 版本而非 Vitis 版本,导致只安装了 Vivado 和 vitis_hls,未安装 vitis_IDE。
  2. "Web installer client Obsolete" 错误表示当前操作系统版本不是 Xilinx 官方支持的版本,无法通过在线安装器安装。
8.2.2 补救方法
  1. 打开 Terminal,进入 Xilinx 安装路径。
  2. 执行以下命令查看隐藏的安装目录:
bash 复制代码
ls -a

可以看到名为 .xinstall 的隐藏目录。

  1. 进入该目录:
bash 复制代码
cd .xinstall
  1. 进入对应版本的文件夹(如 Vivado_2020.2):

以下截图展示了在 .xinstall 目录下进入对应版本文件夹(如 Vivado_2020.2)的文件管理器界面。

  1. 找到 xsetup 文件并执行:

以下截图展示了在版本目录中找到 xsetup 安装程序文件的文件管理器界面。

bash 复制代码
sudo ./xsetup
# 或者卸载后重装
sudo ./xsetup -Uninstall
  1. 进入安装界面后,选择 Vitis 版本进行安装。此时会下载 Vitis IDE(已安装的 Vivado 和 Vitis HLS 不会重复下载)。

以下截图展示了执行 xsetup 后弹出的 Xilinx 安装界面以及选择安装 Vitis 版本的配置窗口。

  1. 安装完毕后设置环境变量:
bash 复制代码
source [安装路径]/Xilinx/Vitis/2020.2/settings64.sh
source .bashrc
  1. 即可通过 Vivado -> Tools -> Launch Vitis IDE 正常使用。

8.3 Vitis 安装界面

安装时可选择不同的软件组件:

  • 选择 Vitis 版将安装三个主要软件:Vivado、Vitis HLS、Vitis IDE。
  • 选择 Vivado 版仅安装 Vivado 和 Vitis HLS。

9. 开发流程总结

9.1 Vivado 端开发流程

  1. 新建 Vivado 工程,选择器件型号。
  2. 创建 Block Design,添加 Zynq Processing System IP。
  3. 运行 Block Automation 自动连线。
  4. 配置 PS 端外设(UART、DDR 等)。
  5. 验证设计(Validate Design)。
  6. 生成 HDL Wrapper。
  7. 运行综合并生成比特流。
  8. 导出硬件描述文件(.xsa)。

9.2 Vitis 端开发流程

  1. 打开 Vitis IDE,设置工作路径。
  2. 创建 Platform Project,导入 .xsa 文件。
  3. 创建 Application Project,选择模板。
  4. 编写应用程序代码。
  5. 编译工程。
  6. 下载比特流(若使用 PL 资源)。
  7. 运行程序,通过串口查看输出。

9.3 HLS 开发流程

  1. 创建 HLS Component。
  2. 配置时钟和综合选项。
  3. 编写 C/C++ 源代码和测试平台。
  4. 运行 C Simulation 验证功能。
  5. 运行 C Synthesis 综合。
  6. 运行 C/RTL Co-simulation 协同仿真。
  7. 运行 Implementation 实现。
  8. 打包为 .xo 文件供上层项目使用。

Reference

  1. Xilinx UG1209: Embedded Design Tutorial
  2. Xilinx UG1399: Vitis High-Level Synthesis User Guide
  3. Xilinx Vitis 官方文档:https://www.xilinx.com/support/documentation/sw_manuals/xilinx2019_2/ug1209-embedded-design-tutorial.pdf