对于ZYNQ的工程设计,大体分为两部分,分别是硬件逻辑系统的设计和CPU软件程序的设计。
硬件逻辑系统设计: 搭建一个满足用户需求的硬件环境,该环境通过vivado实现。
CPU软件程序设计:用户通过用户程序控制CPU工作,使整个系统达到预定的效果,该部分通过SDK实现。
设计硬件逻辑系统环节我们需要进行的操作很多,例如添加 IP 核、 导出引脚、端口连接等。对于需要使用到第三方 IP 核的设计,还需要先在设置中将第三方 IP 核添加进 IP 存储库,然后才能添加并配置该核。
hdf 文件为硬件资源描述文件,可以通过生成比特流或生成模块设计产生。对于涉及到 PL 端的设计,导出 hdf 文件时需要包含比特流(PL 配置文件),因此通常使用生成比特流的方式产生 hdf 文件;对于纯 PS 端的设计,导出时不需要比特流,因此两种方式皆可。
GPIO general purpose I/O, 通用输入输出。是ZYNQ的外设之一。
mio 多功能IO接口,属于Zynq的PS部分. emio 扩展MIO,依然属于Zynq的PS部分,只是连接到了PL上,再从PL的引脚连到芯片外面实现数据输入输出。
GPIO包括MIO和EMIO,
MIO 在芯片外部有 54 个引脚,这些引脚可以用于 GPIO、SPI、UART、USB 等功能上,每个引脚都同时具有多种功能。因为 MIO是 PS 部分的引脚且其操作对于 PL 端不可见,所以对 MIO 的操作可以视为纯 PS端的操作。EMIO 与 MIO 的不同在于,EMIO 连接到了 PL,再从 PL 输出信号,而 MIO 直接从 PS 端输出。
MIO 直连到PS,EMIO 则是 PS 扩展到 PL,从 PL 接出的 I/O。EMIO 依然属于 PS,只是连接到了 PL,再从 PL 输出信号。所以 MIO 不需要管脚约束,而 EMIO 需要管脚约束。
当 GPIO 用作输出时,一般用于控制一些简单的外设,如 LED 和蜂鸣器。也可以用于观测一些简单外设的状态,如按键,此时 GPIO 用作输入。GPIO 可以通过 MIO 连接到 PS 端的引脚,也可以通过 EMIO 连接到 PL。
其中 Bank0和 Bank1 是通过 MIO 直接与 Zynq 管脚相连的部分,而 Bank2 和 Bank3 则通过EMIO 连接到了 ZYNQ 器件的 PL 端。
LED
按下PS端的按键S2,PL端的小灯亮起,松开按键,小灯熄灭。 按下PL端的按键S1,PS端小灯亮起,松开PL端的按键的小灯熄灭。
ZNYQ7010:
XC7Z010 对应为“xc7z010clg400-1”, 在 Search 中输入 “xc7z010clg400-1”搜索即可。
I/O pin count: I/O数目400个。
LUT:17600
Flip Flop: 35200
block ram: 60
本次设计我们通过 PS 与 PL 侧的按键控制另一侧的 led 灯,每个按键和 led灯都需要一个 GPIO信号。在前面的原理部分我们有讲过,GPIO连接到 PS部分使用的是 MIO 接口,连接到 PL 部分使用的则是 EMIO 接口,所以本次设计我们需要使能这两个外设接口。PS 端的引脚是固定的,我们不需要分配,
PL 端的按键和 led 灯都需要一个 EMIO 信号,因此我们将 EMIO 的位宽设置为 2。设置完成后检查电平状态,将 Bank1 的电平设置为 1.8V。
1 create block design
2 GPIO配置
3 DDR配置
DDR 全名为双速率同步动态随机存储器,也就是我们常说的内存。基于 PS 端的应用,大部分都需要基于片外存储外设 DDR 上运行。 因此在使用时,我们需要配置 DDR 型号。
4 导出引脚
接下来我们需要将 IP 核的引脚导出,点击上方的蓝色小字“Run Block Automation”,让系统自动帮我们导出引脚。
手动导出GPIO-0引脚
右键点击,Make External
端口连接
验证设计 validate design
生成封装
点击 sources 资源栏下我们创建的 system 模块设计,单击右键,在展开的功能中选择“Generate Output Products...”生成输出。
在合成选项栏直接选择“Out Of context per IP”即可,下方的“Number of jobs”选项选择最大值。该值会影响生成输出时的速度,该值越大,生成输出的速度就越快,最大值与电脑配置有关,设置完成后点击“Generate”开始生成。
点击 sources 资源栏下我们创建的 system 模块设计,单击右键,
在展开的功能中选择“Create HDL Wrapper...”创建 HDL 封装
生成输出后,生成HDL封装。
表明封装已经完成。
管脚约束
对于使用过 PL 端的设计,在完成封装后,我们需要对涉及到的管脚进行分配和约束。点击左侧导航栏的“Open Elaborated Design”进行约束和分配。 Open Elaborated Design:生成和约束解析的管脚。
在管脚约束界面中,我们需要做的是对使用到的 PL 端的管脚进行分配并对管脚电平进行约束,本次设计所涉及到的为 PL 端的按键和 PL 端的 LED 灯。
本次设计所涉及到的为 PL 端的按键和 PL 端的 LED 灯。Pin Name 代表 ACZ701 开发板中的引脚名,Signial Name为本次设计的信号名,Pin NO为对应引脚号。按照管脚分配表完成管脚分配后我们还需对管脚电平约束,将管脚电平设置为 3.3V 即可,即设置为 LVCMO33*。
保存
生成bit流
完成了管脚约束后即可开始比特流的生成,比特流中包含着对 PL 端的配置信息,其中就包括对引脚的分配以及电平的约束,因此生成比特流需要在进行管脚分配和约束之后。当然如果设计并未使用到 PL 部分资源,可以直接跳过该环节。
点击“Generate Bitstream”开始生成比特流。
导出硬件
到了 PL 端的资源使用,因此需要勾选比特流:
ACZ701开发板启动时,PS 总是优先启动,随后 PS 开始配置 PL。前面生成比特流时我们说过,比特流中包含有 PL 端的配置信息,因此对于涉及到了PL 端资源的设计,导出硬件描述文件时我们需要包含比特流,否则开发板在启动时不会正确对 PL端进行配置。
对于纯 PS 端的设计,由于并未使用到 PL端资源,所以导出时无论是否包含比特流都不会造成影响。
启动SDK
硬件导出完成后 vivado 部分的设计已经完成,接下来打开 SDK 开始 CPU软件程序设计。点击 File,在展开的功能栏中选择“Launch SDK”。
创建SDK工程
导入库文件
SDK 中库文件的导入较为简单,将需要导入的库文件夹复制后直接拷贝粘贴到新建 SDK 工程下即可。
此时,软件有两个报错,其中一个提示我们 key_ctrl_led.elf文件生成失败,该文件为连接文件,参与程序的连接与执行,由软件编译后生成;另一个则是报错工程没有main 函数。这是正常现象,因为此时我们还未添加头文件路径和用户代码。
添加头文件
导入了库到工程中,每个库包含着对应的头文件。对于SDK,这些头文件是无效的。需要将头文件路径添加到工程中。
添加用户代码
主程序:
#include "xparameters.h" //设备信息相关的头文件
#include "PS_GPIO.h"
//MIOn对应的GPIO编号为n
#define PS_LED 7 //MIO_LED为MIO7,对应的GPIO编号为7
#define PS_KEY 47 //MIO_KEY为MIO47,对应的GPIO编号为47
//EMIOn对应的GPIO编号为54+n,因为MIO总数为54,EMIO是从54开始算的
#define PL_LED (54 + 0) //EMIO_LED为EMIO0,对应的GPIO编号为54+0=54
#define PL_KEY (54 + 1) //EMIO_KEY为EMIO1,对应的GPIO编号为54+1=55
/*
* 使用PS_GPIO实现了按键控制LED功能:
* PS端按键按下→PL端的灯亮起,松开熄灭
* PL端按键按下→PS端的灯亮起,松开熄灭
*/
int main(void)
{
u8 State; //存放按键(MIO47)的电平状态,0为低电平,1为高电平
PS_GPIO_Init(); //初始化PS端MIO和EMIO
GPIO_SetMode(PS_LED, OUTPUT, 0);//设置PS_LED(MIO7)为输出并且初始为低电平
GPIO_SetMode(PL_LED, OUTPUT, 0);//设置PL_LED(EMIO0)为输出并且初始为低电平
GPIO_SetMode(PS_KEY, INPUT, 0); //设置PS_KEY(MIO47)方向为输入
GPIO_SetMode(PL_KEY, INPUT, 0); //设置PL_KEY(EMIO1)方向为输入
while(1)
{
State = GPIO_GetPort(PS_KEY); //读取PS_KEY的电平值并存储到State变量里
GPIO_SetPort(PL_LED,!State); //将State变量的值取非赋予PL_LED来输出
State = GPIO_GetPort(PL_KEY); //读取PL_KEY的电平值并存储到State变量里
GPIO_SetPort(PS_LED,!State); //将State变量的值取非赋予PS_LED来输出
}
return 0;
}
可以 Ctrl+s 对代码进行保存,软件会自动编译,随即报错便会消失。
确认工程编译成功后即完成了 CPU 软件设计环节,接下来便可以开始进行板级验证了。
板机验证
本次设计对开发板的供电要求不高,因此可以仅使用调试接口供电。
下载验证
接下来我们要新建一个任务,将烧录文件下载到开发板中
下载完成后 ACZ702 开发板上 PL侧的下载指示灯便会亮起,该灯仅代表 PL 部分配置完成,在纯 PS 的设计中该指示灯是不会 亮起的。