ZYNQ嵌入式系统-Hello World 实验

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 实验_第1张图片

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

ZYNQ嵌入式系统-Hello World 实验_第2张图片

如图 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 实验_第3张图片

ZYNQ嵌入式系统-Hello World 实验_第4张图片

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

ZYNQ嵌入式系统-Hello World 实验_第5张图片

ZYNQ嵌入式系统-Hello World 实验_第6张图片

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 实验_第7张图片

选中之后,点击“Next”。
1-5 工程摘要界面。这是创建工程的最后一步,显示工程摘要信息,如 1.3.6 所示。在此界面检查前 面所设置的工程名称、所选择的器件型号等信息。如果发现工程设置有误,则可以通过 Back 按钮返回前面的步骤,重新设置。检查无误后点击“Finish”,完成工程创建。
工程创建完成后的 Vivado 界面如 1.3.7 所示。
ZYNQ嵌入式系统-Hello World 实验_第8张图片
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 实验_第9张图片

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

ZYNQ嵌入式系统-Hello World 实验_第10张图片

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

ZYNQ嵌入式系统-Hello World 实验_第11张图片

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

ZYNQ嵌入式系统-Hello World 实验_第12张图片

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

ZYNQ嵌入式系统-Hello World 实验_第13张图片

在 Zynq Block Design 页面,显示了 Zynq 处理系统(PS)的各种可配置块,其中灰色部分是固定的,绿色部分是可配置的,按工程实际需求配置。可以直接单击各种可配置块(以绿色突出显示)进入相应的配置页面进行配置,也可以选择左侧的页导航面板进行系统配置。
PS-PL Configuration 页面能够配置 PS-PL 接口,包括 AXI HP 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 实验_第14张图片

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

ZYNQ嵌入式系统-Hello World 实验_第15张图片

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

ZYNQ嵌入式系统-Hello World 实验_第16张图片

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

ZYNQ嵌入式系统-Hello World 实验_第17张图片

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

ZYNQ嵌入式系统-Hello World 实验_第18张图片

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

ZYNQ嵌入式系统-Hello World 实验_第19张图片

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

ZYNQ嵌入式系统-Hello World 实验_第20张图片

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

ZYNQ嵌入式系统-Hello World 实验_第21张图片

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

ZYNQ嵌入式系统-Hello World 实验_第22张图片

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 实验_第23张图片

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

ZYNQ嵌入式系统-Hello World 实验_第24张图片

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

ZYNQ嵌入式系统-Hello World 实验_第25张图片

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

ZYNQ嵌入式系统-Hello World 实验_第26张图片

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

ZYNQ嵌入式系统-Hello World 实验_第27张图片

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

ZYNQ嵌入式系统-Hello World 实验_第28张图片

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

ZYNQ嵌入式系统-Hello World 实验_第29张图片

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

ZYNQ嵌入式系统-Hello World 实验_第30张图片

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

ZYNQ嵌入式系统-Hello World 实验_第31张图片

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

ZYNQ嵌入式系统-Hello World 实验_第32张图片

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 实验_第33张图片

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

ZYNQ嵌入式系统-Hello World 实验_第34张图片

在上图中,因为选择了 “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 实验_第35张图片

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

ZYNQ嵌入式系统-Hello World 实验_第36张图片

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

你可能感兴趣的:(ZYNQ,FPGA)