Vivado 2021.1 + Vitis 实战:从零构建你的首个ZYNQ7000 PS+PL协同设计工程
如果你刚刚接触ZYNQ 7000系列,面对Vivado和Vitis这两个庞大的工具链,可能会感到有些无从下手。网络上教程虽多,但往往只讲流程,不讲背后的逻辑,或者版本陈旧,操作细节对不上。今天,我们就以Vivado 2021.1和Vitis 2021.1为环境,抛开那些复杂的理论,直接动手,通过一个经典的“流水灯+串口打印”案例,带你完整走一遍从硬件设计、软件编程到最终固化启动的全过程。我的目标是,让你做完这个实验后,不仅能点亮LED、看到串口输出“Hello World”,更能透彻理解ZYNQ PS与PL协同设计的核心脉络,以及那个神秘的BOOT.bin文件究竟是如何诞生的。
很多人卡在第一步,不知道硬件描述文件(XSA)怎么来、有什么用;也有人最后一步功亏一篑,SD卡插上板子毫无反应。这些问题,我都会在过程中一一拆解。我们不仅要做出来,更要搞清楚每一步为什么这么做,以及那些容易踩坑的细节在哪里。
1. 工程蓝图与核心概念梳理
在动手写第一行代码之前,我们得先想清楚要做什么。这个实验的目标很明确:让ZYNQ 7000开发板的PL(可编程逻辑)部分控制一组LED灯实现流水效果,同时让PS(处理系统)部分的ARM Cortex-A9核心通过串口向电脑发送信息。最终,我们要把这两部分功能打包,制作成一个能直接从SD卡启动的BOOT.bin文件。
这背后涉及几个关键概念,理解了它们,后面的操作就不会是盲人摸象:
- PS (Processing System): 就是ZYNQ芯片里那个硬核的ARM处理器。它负责运行我们编写的C语言应用程序,管理复杂任务和外设(如串口、SD卡控制器)。你可以把它想象成一台微型电脑的“大脑”。
- PL (Programmable Logic): 就是传统的FPGA部分。它由大量可编程的逻辑单元和布线资源构成,我们可以用硬件描述语言(如Verilog)来定义其功能,实现高速、并行的硬件电路。在这个实验里,它负责精确地控制LED的闪烁时序。
- 协同设计: ZYNQ的精髓在于PS和PL不是孤立的。它们通过高性能的AXI总线紧密互联。PS可以配置、控制PL,也可以与PL高速交换数据。我们的工程就是这种协同的典型体现:PS负责总体控制和通信,PL负责具体的硬件定时。
- 启动流程与BOOT.bin: ZYNQ上电后,首先执行芯片内部ROM中的固化代码(BootROM)。BootROM会根据板上的启动模式拨码开关,从SD卡、QSPI Flash等设备中读取BOOT.bin文件。这个文件不是一个单一的程序,而是一个“容器”,里面按顺序包含了三个关键部分:
- FSBL (First Stage Boot Loader): 第一级引导程序。由Vitis自动生成,负责初始化PS端更复杂的外设(如DDR内存),并加载后续的组件。
- 硬件比特流文件 (.bit): 描述PL部分硬件电路结构的配置文件。FSBL会将它“烧写”到PL中,使其具备我们设计的功能。
- 应用程序可执行文件 (.elf): 这就是我们为ARM处理器编写的C程序编译后的结果,比如实现串口打印的代码。
整个工程的构建流程,其实就是围绕生成这三个文件并正确打包展开的。下面这张表清晰地概括了我们将要经历的四个主要阶段及其产出:
| 阶段 | 主要工具 | 核心任务 | 关键产出文件 |
|---|---|---|---|
| PL硬件设计 | Vivado | 创建LED流水灯的逻辑电路,并配置ZYNQ PS核的基本外设(串口、SD卡、时钟、DDR等)。 | .xpr (Vivado工程文件), .bit (比特流文件) |
| 导出硬件平台 | Vivado | 将设计好的硬件信息(包括PS配置和PL逻辑)封装成一个可供软件开发工具使用的描述文件。 | .xsa (硬件平台描述文件) |
| PS软件开发 | Vitis | 基于上一步的.xsa文件创建软件工程,编写串口打印的C代码,并生成FSBL。 |
.elf (应用程序可执行文件), fsbl.elf |
| 打包与固化 | Vitis | 将FSBL、比特流文件(.bit)和应用程 |
724


&spm=1001.2101.3001.11974&articleId=154972248&d=1&t=3&u=36176b2420424ac2a26563f6557125b0)

被折叠的 条评论
为什么被折叠?



