Hello World!”是各种编程语言中最简单,同时也是最经典的入门实验。因此,我们将串口打印“Hello World”作为 ZYNQ 嵌入式系统的开篇实验,这也是我们步入 ZYNQ PS 部分的始发点。通过本次实验我们将了解 ZYNQ 嵌入式系统的开发流程,熟悉 ZYNQ 嵌入式最小系统的搭建。本章包括以下几个部分:
1.1 简介
1.2 实验任务
1.3 硬件设计
1.4 软件设计
1.5 下载验证
1.1 简介
ZYNQ 嵌入式系统的开发流程:

ZYNQ嵌入式系统-Hello World 实验

开发流程大体可以分为 6 步。其中 step1 至 step4 为硬件设计部分,在 Vivado 软件中实现;step5 为软件设计部分,在 SDK 软件中实现;step6 为功能的验证。复杂的程序还涉及 Debug,这个也是在 SDK 软件中实施。具体每一步的操作我们会在后面详细介绍。在简单了解 ZYNQ 嵌入式系统的开发流程后,接下来我们来看一下什么是 ZYNQ 嵌入式最小系统。
ZYNQ 嵌入式最小系统的概念包括以下两个方面:
一、它是使系统正常工作的最小条件;
二、它是其他系统建立的基础。

ZYNQ嵌入式系统-Hello World 实验

如图 1.1.2 所示,以 ARM Cortex-A9 为核心、DDR3 为内存,加上传输信息使用的 UART 串口就构成ZYNQ 嵌入式最小系统。可以看到,这个最小系统只包括了 ZYNQ 中的 PS 部分。下面我们将按照 ZYNQ 嵌入式系统开发流程,一步步的搭建上图所示的最小系统。
1.2 实验任务
在领航者 ZYNQ 开发板上搭建 ZYNQ 嵌入式最小系统,并使用串口打印“HelloWorld”信息。
1.3 硬件设计
在图 1.1.1 中,我们将 step1 step4 划分为硬件设计部分。
step1:创建 Vivado 工程
1-1 打开 Vivado,进入 Vivado 界面后,点击“Quick Start”栏的 “Create Project”。然后在弹出的创建Vivado 工程向导界面,点击“Next”。如下图所示:

ZYNQ嵌入式系统-Hello World 实验

ZYNQ嵌入式系统-Hello World 实验

1-2 进入工程命名界面。设置工程名为“hello_world”,工程路径可使用任意路径,本章我们将该工程放F:\ZYNQ\Embedded_System 文件夹***意,工程名和路径只能由英文字母、数字和下划线组成不能包含中文、空格以及特殊字符!确认已经勾选“Create project subdirectory,点击“Next”,如下图所示:

ZYNQ嵌入式系统-Hello World 实验

ZYNQ嵌入式系统-Hello World 实验

1-3 进入图 1.3.4 所示的界面,在此界面设置工程类型。此处我们选择 “RTL Project”。本次实验不需要添加源文件和约束文件,所以勾选“Do not specify sources at this time”。勾选之后会省略后面添加源文件和约束文件的步骤,点击“Next”直接跳到器件选型界面。
1-4 器件选型界面。所选择的器件型号一定要跟领航者核心板上的 ZYNQ 芯片型号保持一致。领航者核心板上的 ZYNQ 芯片有两种型号,XC7Z010 XC7Z020。大家可以通过查看核心板上 ZYNQ 芯片的私印来确认所使用的芯片型号。这两个芯片主要的差异是PL部分的逻辑资源不同,PS部分相同,另外XC7Z010型号速度等级 speed 为“-1”,XC7Z020 的为“-2”,这在器件选型的时候需要注意。此处以 XC7Z020 为例。
选择器件型号的方式有两种,一种是根据 Parts,另一种是根据 Boards,此处我们使用 Parts 选择器件。在 Family 栏里选择“Zynq-7000, Speed 栏选择“-2”,需要注意的是,在 Package 栏选择“clg400”。然后根据所使用的领航者核心板上的 ZYNQ 芯片型号,在下面的器件列表中选择“xc7z020clg400-2”,如下图所示。若是 XC7Z010,相对应的器件为“xc7z010clg400-1”。

ZYNQ嵌入式系统-Hello World 实验

选中之后,点击“Next”。
1-5 工程摘要界面。这是创建工程的最后一步,显示工程摘要信息,如1.3.6 所示。在此界面检查前面所设置的工程名称、所选择的器件型号等信息。如果发现工程设置有误,则可以通过 Back 按钮返回前面的步骤,重新设置。检查无误后点击“Finish”,完成工程创建。
工程创建完成后的 Vivado 界面如1.3.7 所示。
ZYNQ嵌入式系统-Hello World 实验
step2:使用 IP Integrator 创建 Processing System
Vivado 开发套件中提供了一个图形化的设计开发工具——IP 集成器(IP Integrator),在 IP 集成器中可以非常方便的插入各种功能模块(IP)。它支持关键 IP 接口的智能自动连接、一键式 IP 子系统生成、实时DRC 等功能,能够帮助我们快速组装复杂系统,加速设计流程。
接下来我们将在 IP 集成器中完成 ZYNQ 嵌入式系统的搭建。2-1 在左侧导航栏(Flow Navigator)中,单击 IP Integrator 下的 Create Block Design。然后在弹出的对话框中指定所创建的 Block Design 的名称,在 Design name 栏中输入“system”。如下图所示:

ZYNQ嵌入式系统-Hello World 实验

2-2 点击“OK”按钮,此时 Vivado 界面如下图所示。注意右侧的 Diagram 窗口,我们将在该窗口中以图形化的方式完成设计。

ZYNQ嵌入式系统-Hello World 实验

2-3 接下来在 Diagram 窗口中给设计添加 IP。点击上图中箭头所指示的加号“+”,会打开 IP 目录(IP Catalog)。也可以通过快捷键 Ctrl + I,或者右键点击 Diagram 工作区中的空白位置,然后选择“ADD IP”。
2-4 打开 IP 目录后,在搜索栏中键入“zynq”,找到并双击“ZYNQ7 Processing System”,将 ZYNQ7处理系统 IP 添加到设计中。

ZYNQ嵌入式系统-Hello World 实验

2-5 添加完成后,ZYNQ7 Processing System 模块出现在 Diagram 中,如下图所示:

ZYNQ嵌入式系统-Hello World 实验

2-6 双击所添加的 ZYNQ7 Processing System 模块,进入 ZYNQ7 处理系统的配置界面。界面左侧为页面导航面板,右侧为配置信息面板。如下图所示:

ZYNQ嵌入式系统-Hello World 实验

在 Zynq Block Design 页面,显示了 Zynq 处理系统(PS)的各种可配置块,其中灰色部分是固定的,绿色部分是可配置的,按工程实际需求配置。可以直接单击各种可配置块(以绿色突出显示)进入相应的配置页面进行配置,也可以选择左侧的页导航面板进行系统配置。
PS-PL Configuration 页面能够配置 PS-PL 接口,包括 AXIHP ACP 总线接口。
Peripheral IO Pins 页面可以为不同的 I/O 外设选择 MIO/EMIO 配置。
MIO Configuration 页面可以为不同的 I/O 外设具体配置 MIO/EMIO
Clock Configuration 页面用来配置 PS 输入时钟、外设时钟,以及 DDR CPU 时钟等。
DDR Configuration 页面用于设置 DDR 控制器配置信息。
SMC Timing Calculation 页面用于执行 SMC 时序计算。
Interrupts 页面用于配置 PS-PL 中断端口。
2-7 配置 PS UART。点击 Peripheral I/O Pins 页面,出现以下 IO 引脚配置界面。

ZYNQ嵌入式系统-Hello World 实验

PS 和外部设备之间的连接主要是通过复用的输入/输出(Multiplexed Input/OutputMIO)来实现的。PS的 54 MIO 引脚可以用于连接不同的外设接口,如图 1.3.13 中的 MIO14 和 MIO15,既可以配置成 UART0的引脚接口,也可以配置成 I2C0 或 CAN0 的引脚接口。最终所选择的配置需要与领航者开发板的原理图相对应。

ZYNQ嵌入式系统-Hello World 实验

从图中我们可以看到,BANK500 中的 MIO14 和 MIO15 被用作 UART 串口通信的引脚,并最终与底板上的 USB 转串口芯片 CH340 连接。因此,为了实现串口通信的功能,我们需要在 PS 中将 MIO14 MIO15 配置成 UART0 模块的接口引脚。
如下图所示,我们在 MIO14 MIO15 下点击 UART0,方框的颜色会变成绿色,与此同时这两个 MIO也会变成绿色。这就表明 MIO14 MIO15 被配置成了 UART 接口引脚,它们与 PS 中的串口电路 UART0连接。

ZYNQ嵌入式系统-Hello World 实验

点击左侧的 MIO Configuration 页面,在右侧展开 I/O Peripherals > UART0,可以看到更具体的引脚配置信息。其中 MIO14 作为 RX 引脚、MIO15 作为 TX 引脚,如下图所示:

ZYNQ嵌入式系统-Hello World 实验

点击左侧的 PS-PL Configuration 页面,我们可以在这里设置 UART0 串口通信的波特率。在 General 目录下,可以看到 UART0 的波特率默认是 115200。通过下拉按钮可以选择其他波特率,一般保持默认设置。
 

ZYNQ嵌入式系统-Hello World 实验

2-8 配置 PS 的 DDR3 控制器。点击左侧的 DDR Configuration 页面,在右侧 DDR Controller Configuration 下的“Memory Part”一栏选择 DDR 的器件,XC7Z020 的核心板选择 MT41J256M16RE-125XC7Z010 的核心板选择 MT41J128M16 HA-125。需要注意的是,我们在这里选择的型号并不是领航者核心板上的 DDR3 型号,而是参数接近的型号,或者说兼容的型号。其他的配置选项保持默认即可。

ZYNQ嵌入式系统-Hello World 实验

2-9 配置 PS 的时钟。
点击左侧的 Clock Configuration 页面,该界面主要是配置 ZYNQ PS 中的时钟频率。比如输入时钟默认33.33333Mhz,这与我们领航者核心板上的 PS 端输入时钟频率相同。对于 CPU 的时钟、DDR 的时钟以及其它外设的时钟,我们直接保持默认设置即可。如下图所示:

ZYNQ嵌入式系统-Hello World 实验

2-10 因为本实验是搭建 ZYNQ 的嵌入式最小系统,只需要使用 ZYNQ 中的 PS 端。因此我们将 PS 与 PL 端交互的接口信号移除。同样是在 Clock Configuration 页面,展开 PL Fabric Clocks,取消勾选 FCLK_CLK0,如下图所示:

ZYNQ嵌入式系统-Hello World 实验

点击左侧的 PS-PL Configuration 页面,然后在右侧展开 General 下的 Enable Clock Resets,取消勾选其
中的 FCLK_RESET0_N。
另外在当前界面中展开 AXI Non Secure Enablement 下的 GP Master AXI Interface,取消勾选其中的 MAXI GP0 interface。如下图所示:

ZYNQ嵌入式系统-Hello World 实验

2-11 配置 ZYNQ7 Processing System 完成,点击“OK”。返回到 Vivado 界面后,在 Diagram 中可以看到 ZYNQ7 Processing System IP 模块发生了变化,如图1.3.22 所示。 我们将其与图 1.3.11 作对比可以发现,ZYNQ7 PS 模块少了四个接口,这正是因为我们在配置 ZYNQ7 PS 的过程中移除了与 PL 相关的接口信号。

ZYNQ嵌入式系统-Hello World 实验

2-12 我们点击上图中箭头所指示的位置“Run Block Automation”,会弹出如下图所示的对话框:

ZYNQ嵌入式系统-Hello World 实验

在该界面中我们可以选择自动连接 IP 模块的接口,包括导出外部端口,甚至可以自动添加模块互联过程中所需的IP。在我们本次设计中只有一个IP模块,在左侧确认勾选processing_system7_0,然后点击“OK”。
此时 ZYNQ7 PS 模块引出了两组外部接口,分别是 DDR 和 FIXED_IO,引出的接口将会被分配到 ZYNQ器件具体的引脚上。大家也可以通过点击 ZYNQ7 PS 模块接口处的加号“+”,来展开这两组接口,观察其中都有哪些信号。如下图所示:

ZYNQ嵌入式系统-Hello World 实验

2-12 本次实验不需要添加其它 IP,直接按快捷键 Ctrl+S 保存当前设计。接下来点击下图箭头所指示的按钮,验证当前设计。验证完成后弹出对话框提示没有错误或者关键警告,点击“OK”,如下图所示:

ZYNQ嵌入式系统-Hello World 实验

如果验证结果报出错误或者警告,大家需要重新检查自己的设计。
step3:生成顶层 HDL 模块
3-1 Sources 窗口中,选中 Design Sources 下的 sysetm.bd, 这就是我们刚刚完成的 Block Design 设计。
右键点击 sysetm.bd,在弹出的菜单栏中选择“Generate Output Products”,如下图所示:

ZYNQ嵌入式系统-Hello World 实验

3-2 弹出“Generate Output Products”对话框,如下图所示:

ZYNQ嵌入式系统-Hello World 实验

在对话框中 Synthesis Options 选择 Global;Run Setings 用于设置生成过程中要使用的处理器的线程数,进行多线程处理,保持默认或设置为个人电脑处理器最大可使用线程数都可以,一般选择最大可使用线程数的一般。然后点击“Generate”来生成设计的综合、实现和仿真文件。
在“Generate”过程中会为设计生成所有需要的输出结果。比如 Vivado 工具会自动生成处理系统的 XDC约束文件,因此我们不需要手动对 ZYNQ PS 引出的接口(DDR 和 FIXED_IO)进行管脚分配。Generate 完成后,在弹出的对话框中点击“OK”。
Sources 窗口中,点击“IP Source”标签页,可以看到 Generate 过程生成的输出结果。

ZYNQ嵌入式系统-Hello World 实验

3-3 在“Hierarchy”标签页再次右键点击 system.bd,然后选择“Create HDL Wrapper”。

ZYNQ嵌入式系统-Hello World 实验

在弹出的对话框中确认勾选“Let Vivado manage wrapper and auto-update”,然后点击“OK”。

ZYNQ嵌入式系统-Hello World 实验

创建完成后,Design Sources 结构如下图所示:

ZYNQ嵌入式系统-Hello World 实验

system_wrapper.v 为创建的 Verilog 文件,箭头所指的“品”字形图标指示当前模块为顶层模块。该模块使用 Verilog HDL 对设计进行封装,主要完成了对 block design 的例化,大家也可以双击打开该文件查看其中的内容。
另外我们在图 1.3.30 中勾选了“Let Vivado manage wrapper and auto-update”,这样我们在修改了 Block
Design 之后就不需要再重新生成顶层模块,Vivado 工具会自动更新该文件。
step4:生成 Bitstream 文件并导出到 SDK
如果设计中使用了 PL 的资源,则需要添加引脚约束并对该设计进行综合、实现并生成 Bitstream 文件。由于本次实验未用到 PL 部分,所以无需生成 Bitstream 文件,只需将硬件导出到 SDK 即可。
4-1 导出硬件。
在菜单栏选择 File > Export > Export hardware

ZYNQ嵌入式系统-Hello World 实验

在弹出的对话框中,因为没有生成 bitstream 文件,所以无需勾选“Include bitstream”,直接点击“OK”按钮。

ZYNQ嵌入式系统-Hello World 实验

在上图中,因为选择了“Exort to ”,Vivado 工具会在当前工程目录下新建一个文件夹,名为“hello_world.sdk”,它是我们接下来软件开发的工作空间。
Export Hardware 的过程中,工具会将硬件以一个 ZIP 压缩文件的形式导出到该工作空间中,文件名“system_wrapper.hdf”。该文件包含了我们前面所搭建的硬件平台的配置信息,其后缀名.hdf 的含义为“Hardware Definition File”,即硬件定义文件。
4-2 硬件导出完成后,在菜单栏中选择 File > Launch SDK,启动 SDK 开发环境。如下图所示:

ZYNQ嵌入式系统-Hello World 实验

在弹出对话框中,直接点击“OK”,如下图所示:

ZYNQ嵌入式系统-Hello World 实验

到这里,我们已经完成了 ZYNQ 嵌入式系统的硬件设计部分。接下来需要到 SDK 软件中进行应用程序开发,也就是软件设计部分。

相关文章: