zynq7010之EBAZ4205之helloworld

章鱼哥也想学zynq呀,zynq有arm a9双核的ps部分和和fpga的pl部分,突然发现zynq感觉是世界上最有技巧的一款芯片了,arm部分负责算法部分,pl部分可以用来增加外设,想想你的芯片支持好几个vga,hdmi,10几个串口,是不是很惊人。
为什么要有EBAZ4205呢,大家咸鱼一下50块,淘宝一下zynq 1000块。真香
废话不多说,我们这节课开始学习用arm部分的ps端通过串口输出helloworld
本实验部分参考正点原子的部分教程,
EBAZ4205的原理图和pcb
zynq7010之EBAZ4205之矿卡改造
zynq7010之EBAZ4205之helloworld_第1张图片
第一章 Hello World 实验
“Hello World!”是各种编程语言中最简单,同时也是最经典的入门实验。因此,我们将串口打印“Hello World”作为 ZYNQ 嵌入式系统的开篇实验,这也是我们步入 ZYNQ 的 PS 部分的始发点。通过本次实验我们将了解 ZYNQ 嵌入式系统的开发流程,熟悉 ZYNQ 嵌入式最小系统的搭建。
1.1 简介
首先我们来了解一下 ZYNQ 嵌入式系统的开发流程。zynq7010之EBAZ4205之helloworld_第2张图片
如上图所示,开发流程大体可以分为 6 步。其中 step1 至 step4 为硬件设计部分,在 Vivado 软件中实 现;step5 为软件设计部分,在 SDK 软件中实现;step6 为功能的验证。复杂的程序还涉及 Debug,这个也是在 SDK 软件中实施。具体每一步的操作我们会在后面详细介绍。
在简单了解 ZYNQ 嵌入式系统的开发流程后,接下来我们来看一下什么是 ZYNQ 嵌入式最小系统。
ZYNQ 嵌入式最小系统的概念包括以下两个方面:一、它是使系统正常工作的最小条件;二、它是其他系统 建立的基础。
zynq7010之EBAZ4205之helloworld_第3张图片
如图 1.1.2 所示,以 ARM Cortex-A9 为核心、DDR3 为内存,加上传输信息使用的 UART 串口就构成
了 ZYNQ 嵌入式最小系统。可以看到,这个最小系统只包括了 ZYNQ 中的 PS 部分。
下面我们将按照 ZYNQ 嵌入式系统开发流程,一步步的搭建上图所示的最小系统。
1.2 实验任务
本章的实验任务是在EBAZ4205上搭建 ZYNQ 嵌入式最小系统,并使用串口打印“Hello
World”信息。
1.3 硬件设计
在图 1.1.1 中,我们将 step1 至 step4 划分为硬件设计部分。
创建vivado工程
1-1 打开 Vivado,进入 Vivado 界面后,点击“Quick Start”栏的 “Create Project”。然后在弹出的创建
Vivado 工程向导界面,点击“Next”。如下图所示:zynq7010之EBAZ4205之helloworld_第4张图片
zynq7010之EBAZ4205之helloworld_第5张图片
1-2 进入工程命名界面。设置工程名为“hello_world”,工程路径可使用任意路径,本章我们将该工程放
在 F:\ZYNQ\Embedded_System 文件夹下。注意,工程名和路径只能由英文字母、数字和下划线组成,不能
包含中文、空格以及特殊字符!
确认已经勾选“Create project subdirectory”,点击“Next”,如下图所示:
zynq7010之EBAZ4205之helloworld_第6张图片
zynq7010之EBAZ4205之helloworld_第7张图片
和约束文件的步骤,点击“Next”直接跳到器件选型界面。
1-4 器件选型界面。所选择的器件型号一定要跟领航者核心板上的 ZYNQ 芯片型号保持一致,EBAZ4205s是zynq7010,选择XC7Z010,相对应的器件为“xc7z010clg400-1”。
zynq7010之EBAZ4205之helloworld_第8张图片
选中之后,点击“Next”。
1-5 工程摘要界面。这是创建工程的最后一步,显示工程摘要信息,如图 1.3.6 所示。在此界面检查前
面所设置的工程名称、所选择的器件型号等信息。如果发现工程设置有误,则可以通过 Back 按钮返回前面
的步骤,重新设置。检查无误后点击“Finish”,完成工程创建。
工程创建完成后的 Vivado 界面如图 1.3.7 所示。
zynq7010之EBAZ4205之helloworld_第9张图片
zynq7010之EBAZ4205之helloworld_第10张图片
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”。如下图所示:
zynq7010之EBAZ4205之helloworld_第11张图片
2-2 点击“OK”按钮,此时 Vivado 界面如下图所示。注意右侧的 Diagram 窗口,我们将在该窗口中以
图形化的方式完成设计。
zynq7010之EBAZ4205之helloworld_第12张图片
2-3 接下来在 Diagram 窗口中给设计添加 IP。点击上图中箭头所指示的加号“+”,会打开 IP 目录(IP
Catalog)。也可以通过快捷键 Ctrl + I,或者右键点击 Diagram 工作区中的空白位置,然后选择“ADD IP”。
2-4 打开 IP 目录后,在搜索栏中键入“zynq”,找到并双击“ZYNQ7 Processing System”,将 ZYNQ7
处理系统 IP 添加到设计中。
zynq7010之EBAZ4205之helloworld_第13张图片
2-5 添加完成后,ZYNQ7 Processing System 模块出现在 Diagram 中,如下图所示:
zynq7010之EBAZ4205之helloworld_第14张图片
2-6 双击所添加的 ZYNQ7 Processing System 模块,进入 ZYNQ7 处理系统的配置界面。界面左侧为页
面导航面板,右侧为配置信息面板。如下图所示:
zynq7010之EBAZ4205之helloworld_第15张图片
下面我们简要地介绍一下页面导航面板中各个页面的作用。
在 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 引脚配置界面。
zynq7010之EBAZ4205之helloworld_第16张图片
以上摘抄至正点原子的
下面是EBAZ4205不同的地方,配置不一样
zynq7010之EBAZ4205之helloworld_第17张图片
这是EBAZ4205的串口的电路原理图
zynq7010之EBAZ4205之helloworld_第18张图片
这个是ps端也就是arm端的引脚电路图,话说这是多少呢,我们对比一下其他相黑金,正点的电路图发现是MIO24 MIO25,这是串口1的复用引脚

如下图所示,我们在 MIO24 和 MIO25 下点击 UART1,方框的颜色会变成绿色,与此同时这两个 MIO
也会变成绿色。这就表明 MIO24 和 MIO25 被配置成了 UART 接口引脚,它们与 PS 中的串口电路 UART1相连接。
zynq7010之EBAZ4205之helloworld_第19张图片
点击uart1变成绿色就OK了,至于硬件电路图是怎么样呢,我们看一下pcb
zynq7010之EBAZ4205之helloworld_第20张图片
绿色圈圈的就是了,大家用ch340的串口连接就可以了

注意由于我们的EBAZ4205供电都是3.3v

zynq7010之EBAZ4205之helloworld_第21张图片
我们要选择3.3V,两个都是
zynq7010之EBAZ4205之helloworld_第22张图片
配置串口1波特率为115200,然后点OK就好

接下来配置ddr3控制器,这个不配置用不了,很重要,EBAZ4205是256MB的颗粒的,而且是16位的,因为是单科ddr3,和黑金和正点的不同,他们是2颗铸成32位的,章鱼哥就是在这里吃了亏
zynq7010之EBAZ4205之helloworld_第23张图片
EBAZ4205只有一片ddr3 所以16位
zynq7010之EBAZ4205之helloworld_第24张图片
正点原子有两片 所以32位
zynq7010之EBAZ4205之helloworld_第25张图片
选择256M 大小 16位宽度的,如果选了32位就会出错的 ----重要

2-9 配置 PS 的时钟。
点击左侧的 Clock Configuration 页面,该界面主要是配置 ZYNQ PS 中的时钟频率。比如输入时钟默认
是 33.33333Mhz,EBAZ4205的 PS 端输入时钟频率是33.3M的,默认就好。对于 CPU 的时钟、DDR 的时钟以及其它外设的时钟,我们直接保持默认设置即可。如下图所示:
zynq7010之EBAZ4205之helloworld_第26张图片
2-10 因为本实验是搭建 ZYNQ 的嵌入式最小系统,只需要使用 ZYNQ 中的 PS 端。因此我们将 PS 中 与 PL 端交互的接口信号移除。
同样是在 Clock Configuration 页面,展开 PL Fabric Clocks,取消勾选 FCLK_CLK0,如下图所示:
zynq7010之EBAZ4205之helloworld_第27张图片
点击左侧的 PS-PL Configuration 页面,然后在右侧展开 General 下的 Enable Clock Resets,取消勾选其
中的 FCLK_RESET0_N。
另外在当前界面中展开 AXI Non Secure Enablement 下的 GP Master AXI Interface,取消勾选其中的 M
AXI GP0 interface。如下图所示:
zynq7010之EBAZ4205之helloworld_第28张图片
2-11 配置 ZYNQ7 Processing System 完成,点击“OK”。
返回到 Vivado 界面后,在 Diagram 中可以看到 ZYNQ7 Processing System IP 模块发生了变化,如图
1.3.22 所示。 我们将其与图 1.3.11 作对比可以发现,ZYNQ7 PS 模块少了四个接口,这正是因为我们在配
置 ZYNQ7 PS 的过程中移除了与 PL 相关的接口信号。
zynq7010之EBAZ4205之helloworld_第29张图片
2-12 我们点击上图中箭头所指示的位置“Run Block Automation”,会弹出如下图所示的对话框:
zynq7010之EBAZ4205之helloworld_第30张图片
在该界面中我们可以选择自动连接 IP 模块的接口,包括导出外部端口,甚至可以自动添加模块互联过
程中所需的IP。在我们本次设计中只有一个IP模块,在左侧确认勾选processing_system7_0,然后点击“OK”。
此时 ZYNQ7 PS 模块引出了两组外部接口,分别是 DDR 和 FIXED_IO,引出的接口将会被分配到 ZYNQ
器件具体的引脚上。大家也可以通过点击 ZYNQ7 PS 模块接口处的加号“+”,来展开这两组接口,观察其中
都有哪些信号。如下图所示:
zynq7010之EBAZ4205之helloworld_第31张图片
2-12 本次实验不需要添加其它 IP,直接按快捷键 Ctrl+S 保存当前设计。接下来点击下图箭头所指示的
按钮,验证当前设计。验证完成后弹出对话框提示没有错误或者关键警告,点击“OK”,如下图所示:
zynq7010之EBAZ4205之helloworld_第32张图片
如果验证结果报出错误或者警告,大家需要重新检查自己的设计。
step3:生成顶层 HDL 模块
3-1 在 Sources 窗口中,选中 Design Sources 下的 sysetm.bd, 这就是我们刚刚完成的 Block Design 设计。
右键点击 sysetm.bd,在弹出的菜单栏中选择“Generate Output Products”,如下图所示:

zynq7010之EBAZ4205之helloworld_第33张图片
3-2 弹出“Generate Output Products”对话框,如下图所示:
zynq7010之EBAZ4205之helloworld_第34张图片
经过摸索,大家选择画有颜色的好点,图片的数字8是代表使用的cpu数量,建议大家选择最大,vavado太慢了

在“Generate”过程中会为设计生成所有需要的输出结果。比如 Vivado 工具会自动生成处理系统的 XDC
约束文件,因此我们不需要手动对 ZYNQ PS 引出的接口(DDR 和 FIXED_IO)进行管脚分配。
Generate 完成后,在弹出的对话框中点击“OK”。
在 Sources 窗口中,点击“IP Source”标签页,可以看到 Generate 过程生成的输出结果。
zynq7010之EBAZ4205之helloworld_第35张图片
zynq7010之EBAZ4205之helloworld_第36张图片
这个是创建顶层文件,相当于把arm单做fpga的ip核来使用

在弹出的对话框中确认勾选“Let Vivado manage wrapper and auto-update”,然后点击“OK”。
zynq7010之EBAZ4205之helloworld_第37张图片
这两个的选择的区别是,第一个是可以修改的,第二个是只读文件,不可以修改,为了安全,避免我们误操作,我推挤选择下面的
创建完成后,Design Sources 结构如下图所示:
zynq7010之EBAZ4205之helloworld_第38张图片
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 文件。

zynq7010之EBAZ4205之helloworld_第39张图片
step4:生成 Bitstream 文件并导出到 SDK
如果设计中使用了 PL 的资源,则需要添加引脚约束并对该设计进行综合、实现并生成 Bitstream 文件。
由于本次实验未用到 PL 部分,所以无需生成 Bitstream 文件,只需将硬件导出到 SDK 即可。
4-1 导出硬件。
在菜单栏选择 File > Export > Export hardware。
zynq7010之EBAZ4205之helloworld_第40张图片
在弹出的对话框中,因为没有生成 bitstream 文件,所以无需勾选“Include bitstream”,直接点击“OK”
按钮。
zynq7010之EBAZ4205之helloworld_第41张图片
这个bit文件是赛灵思fpga的配置文件,由于我们没有用到fpga的配置,所以不勾选了
在上图中,因为选择了“Exort to ”,Vivado 工具会在当前工程目录下新建一个文件夹,
名为“hello_world.sdk”,它是我们接下来软件开发的工作空间。 在 Export Hardware 的过程中,工具会将硬件以一个 ZIP 压缩文件的形式导出到该工作空间中,文件名 为“system_wrapper.hdf”。该文件包含了我们前面所搭建的硬件平台的配置信息,其后缀名.hdf 的含义为
“Hardware Definition File”,即硬件定义文件。
4-2 硬件导出完成后,在菜单栏中选择 File > Launch SDK,启动 SDK 开发环境。如下图所示:
zynq7010之EBAZ4205之helloworld_第42张图片
在弹出对话框中,直接点击“OK”,如下图所示:
zynq7010之EBAZ4205之helloworld_第43张图片
到这里,我们已经完成了 ZYNQ 嵌入式系统的硬件设计部分。接下来需要到 SDK 软件中进行应用程序
开发,也就是软件设计部分。
zynq7010之EBAZ4205之helloworld_第44张图片
上面的硬件电路搭配完成,软件部分就简单了,像正点,黑金都有讲,本来不想写了,为了完整性,把他们的复制上来

SDK 打开后,主页面会显示硬件描述文件 system.hdf 的内容。如图 1.4.1 所示,system.hdf 标签页显示
了整个 PS 系统的地址映射信息。
大家应该还记得,在启动 SDK 之前,我们将硬件以一个 ZIP 压缩文件(system_wrapper.hdf)的形式导 出到软件的工作空间。在 SDK 启动时,该文件会自动解压,大家可以在图 1.4.1 的左侧看到解压后的所有
文件。其中,前四个文件(ps7_init_gpl.c、ps7_init_gpl.h、ps7_init.c 和 ps7_init.h)包含了 Zynq SOC 处理系
统的初始化代码,以及 DDR、时钟、pll 和 MIO 的初始化设置信息。在初始化过程中,SDK 使用这些信息
去配置相应的模块,使得应用程序能够在 PS 上运行。
step5:在 SDK 中创建应用工程
5-1 在菜单栏选择 File > New > Application Project, 新建一个 SDK 应用工程。

zynq7010之EBAZ4205之helloworld_第45张图片
5-2 在弹出的对话框中,输入工程名“hello_world”,其它选项保持默认即可,点击“Next”。
zynq7010之EBAZ4205之helloworld_第46张图片
5-3 选择工程模版 Hello World,然后点击“Finish”。

zynq7010之EBAZ4205之helloworld_第47张图片
5-4 SDK 创建了一个 hello_world 应用工程和 hello_world_bsp 板级支持包(BSP)工程。同时工具会自
动对工程进行编译,并生成 ELF 文件“hello_world.elf”,如下图所示:
zynq7010之EBAZ4205之helloworld_第48张图片
另外工程创建完成后,SDK 主界面会打开 BSP 工程目录下的 system.mss 文件。MSS 是英文
Microprocessor Software Specification 的缩写,即微处理器软件说明。该文件包含 BSP 的操作系统信息、硬 件设计中各个外设的软件驱动等信息。 5-5 双击打开 hello_world/src 工程目录下 helloworld.c 文件,可以看到源代码如下:
zynq7010之EBAZ4205之helloworld_第49张图片

#include 
#include "platform.h"
#include "xil_printf.h"


int main()
{
    init_platform();//没啥用

    print("Hello World\n\r");

    cleanup_platform();//没啥用
    return 0;
}

可以看出和电脑上的编写hello差不多

zynq7010之EBAZ4205之helloworld_第50张图片
然后编译
6-2 下载程序。右键点击 hello_world 工程,在弹出的菜单栏中选择 Run as > 1 Launch on Hardware
(sysntem Debugger),如下图所示:
zynq7010之EBAZ4205之helloworld_第51张图片
6-3 下载完成后,应用程序会将字符串“Hello World”通过 ZYNQ PS 端的串口模块 UART01发送出去。 在 SDK Terminal 窗口可以看到上位机接收到的字符串,如下图所示:
在 SDK 软件的下方,找到 SDK Terminal 窗口。如果界面中没有找到该窗口,或者操作过程中把该
窗口给关闭了,则可以通过在菜单栏中选择 Window > Show View > Other,在 Show View 窗口中搜索添加SDK Terminal
zynq7010之EBAZ4205之helloworld_第52张图片
zynq7010之EBAZ4205之helloworld_第53张图片
zynq7010之EBAZ4205之helloworld_第54张图片
考虑到赛灵思得下载器太贵了,为大家节约成本,我们继续讲如何通过内存卡固化程序

你可能感兴趣的:(fpga,linux,zynq)