《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​
  95kVyaJuybju 2023年11月13日 16 0

GPIO之EMIO按键控制LED实验​

PS和外部设备之间的通信主要是通过复用的输入/输出(Multiplexed Input/Output,MIO)实现除此之外,PS以通过扩展MIO(Extended MIO,EMIO)来实现外部设备的连接EMIO使用了PL的I/O资源PS需要扩展超过78个引脚的时候可以用EMIO,也可用它来连接PL中实现IP模块。

本章我们将学习GPIO中EMIO接口信号的使用。本章包括以下几个部分:

  1. 简介
  2. 实验任务
  3. 硬件设计
  4. 软件设计
  5. 下载验证


简介

MPSOC GPIO接口信号被分成六组,分别是从BANK0到BANK5。其中BANK0, BANK1和BANK2共计78个信号通过MIO连接到MPSOC器件的引脚上,这些引脚属于PS端;而BANK3,BANK4和BANK5中共计96个信号则通过EMIO连接到了MPSOC器件的PL端。如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_串口


3.1.1 GPIO框图

在大情况下,PS端经由EMIO出的接口直接连接到PL端的器件引脚上,通过IO管脚约束来指定所连接PL引脚的位置。通过这种方式,EMIO可以为PS端实现额外的96个输入引脚或96个带有输出使能的输出引脚。EMIO有一种使用方式,就是用于连接PL内实现功能模块(IP核此时PL端IP作PS端的一个外部设备。

实验任务

本章的实验任务是使用MPSOC开发板上的两个PS端按键控制PL端LED亮灭,两个PL端按键去控制PS端LED的灭。

硬件设计

根据实验任务我们可以画出本次实验的系统框图,如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_#define_02


3.3.1 系统框图

与《GPIO之MIO控制LED实验》中的系统框图相比3.3.1中的PS端多了EMIO模块。除此之外,因为EMIO使用PL端IO资源,所以图增加了PL部分。PL端与按键和LED相连的引脚直接通过EMIO连接PS端

step1:创建Vivado工程

次实验可以在前一个实验的基础上进行。

1-1 我们打开《GPIO之MIO控制LED实验》中的Vivado工程“gpio_mio”,打开后在菜单栏中选择File > Project > Save As,如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_引脚_03


3.3.2 选择另存为

1-2 在弹出的对话框输入新的工程名,在Project name输入工程名“gpio_emio”,工程位置保持默认即可,如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_串口_04


3.3.3 工程另存为

点击“OK”按钮,原先的Vivado工程会关闭,并打开一个新的工程“gpio_emio”。

此时如果我们打开工程所在的路径,即F:\ZYNQ\Embedded_System\gpio_emio,可以看到如下图所示的文件目录:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_串口_05


3.3.4 gpio_emio工程目录

此时我们就在gpio_mio工程的基础上得到了一个新的工程gpio_emio,这样就省去了重新搭建硬件的过程。

下来我们将在《GPIO之MIO控制LED实验》中硬件设计的基础上搭建本次实验的硬件平台。

step2:使用IP Integrator创建Processing System

2-1在Flow Navigator中,点击IP INTEGRATOR下的Open Block Design,如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_串口_06


3.3.5 打开Block Design

2-2 在Diagram窗口中,双击打开Zynq UltraScale+ MPSoC重定义窗口。

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_#define_07


3.3.6 重定义Zynq UltraScale+ MPSoC

2-3 在下图所示的配置界面中,点击左侧的I/O Configuration。然后在右侧展开GPIO一栏,勾选GPIO EMIO,并设置位宽为4。该设置通过EMIO扩展一个4位GPIO接口信号,此信号将用于连接PL端引脚。注意这里GPIO0和GPIO1已经勾选。

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_串口_08


3.3.7 勾选GPIO EMIO

完成配置后,点击右下的“OK”按钮。然后在Diagram窗口中可以看到Zynq UltraScale+ MPSoC多了一个GPIO_0端口,如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_引脚_09


3.3.8 通过EMIO引出GPIO接口

光标移动到上图中箭头指示位置,会发光标变成了铅笔的样式点击选中该端口,然后点击鼠标右键,在弹出的列表中选择“Make External”。下图所

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_引脚_10


3.3.9 Make External

以看到Zynq UltraScale+ MPSoC引出了一个名为GPIO_0_0接口如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_#define_11


3.3.10 引出GPIO接口

中该接口,在左侧External Interface Properties栏中将该接口的名称修改为GPIO_EMIO。如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_串口_12


3.3.11 修改接口名称

2-4本次实验不需要添加其它的IP,按Ctrl+S快捷键保存设计。

step3:生成顶层HDL

3-1 Sources窗口中展开Design Sources,然后右键点击design_1_wrapper下的design_1.bd,在弹出的菜单中选择Generate Output Products,如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_串口_13


3.3.12选择Generate Output Products

3-2 在弹出的对话框中选择Generate”,然后等待Generate完成后点击“OK”。

3-3 创建顶层HDL Wrapper

在之前的实验中我们创建顶层模块时选择了“Let Vivado manage wrapper and auto-update”选项,所以此处无需再创建顶层HDL Wrapper,Vivado会自动更新顶层HDL Wrapper。

step4:生成Bitstream文件并导出Hardware

4-1在左侧Flow Navigator导航栏中找到RTL ANALYSIS,点击选项中的Open Elaborated Design”。下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_串口_14


3.3.13 打开详细设计

弹出的对话框中点击“OK”如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_串口_15


3.3.14 Elaborate Design 对话

在ELABORATED DESIGN界面下方找I/O Ports窗口。如果没有找到I/O Ports一栏则通过在菜单栏中点击Layout然后在下列表中选择I/O Planning们将在I/O Ports窗口中对PL部分接口进行管脚分配。PS端管脚约束文件,在3.3.12中选择“Generate Output Products”之后Vivado具会自动创建

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_引脚_16


3.3.15 I/O ports窗口

本次实验中,我们通过EMIO扩展了四GPIO的接口信号,即上图中的GPIO_EMIO_tri_io[0],GPIO_EMIO_tri_io[1],GPIO_EMIO_tri_io[2],GPIO_EMIO_tri_io[3]。这里,我们将GPIO_EMIO_tri_io[0]接到PL_KEY1引脚,GPIO_EMIO_tri_io[1]接到PL_KEY2引脚,GPIO_EMIO_tri_io[2]接到PL_LED1引脚,GPIO_EMIO_tri_io[3]接到PL_LED2引脚。

查看原理图可知,这四个引脚的管脚约束分别是,PL_KEY1为AD11,PL_KEY2为AD10,PL_LED1为AE10,PL_LED2为AF10,且都在BANK44上,该BANK电压为3.3V。接下来在软件中进行管脚分配I/O Std对应的电平需要修改。下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_串口_17


3.3.16 管脚分配

4-2设置完成按快捷Ctrl+S保存管脚约束,在弹出的对话框输入文件“pin”最后点击“OK”,如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_#define_18


3.3.17 保存约束

4-3左侧Flow Navigator导航栏中找到PROGRAM AND DEBUG点击选项中的“Generate Bitstream”,然后在连续弹出的对话框中依次点击“YES“OK”。此时,Vivado工具开始对设计进行综合、实现、并生成Bitstream文件。

4-4 生成Bitstream完成后,弹出的对话框中选择“Open Implemented Design”图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_引脚_19


3.3.18 打开实现后的设计

点击“OK”,如果弹出对话框提示关闭Elaborated Design,则点击YES”。

在IMPLEMENTED界面我们以查看设计PL资源的使用情况。在左侧Flow Navigator导航栏中找到IMPLEMENTATION点击选项中的Report Utilization”,然后在弹出的对话框中点击OK”。如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_引脚_20


3.3.19 报告资源使用情况

在界面下方的Utilization标签页中,选择左侧的Summary然后在右侧会以表格和柱种方式显示当前PL资源的使用情况。在我们本次实验中,消耗了PL端4个LUT和4IO资源,这个IO就是PS通过EMIO扩展GPIO接口信号时所使用的PL引脚下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_#define_21


3.3.20 资源使用总结报告

4-5导出硬件。

菜单栏中选择 File > Export > Export hardware。

在弹出的对话框中,勾选“Include bitstream”,然后点击“OK”按钮。如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_串口_22


3.3.21 勾选“Include bitstream”

此处需要注意,如果我们的设计使用了PL的资源,比如使用PL的引脚,或者在PL内实现了部分功能模块,那么我们需要生成Bitstream文件,并在导出硬件的时候包含该文件

4-6 新建vitis文件夹,将生成的xsa文件移到里面。

4-7 硬件导出完成后,在菜单栏选择Tools > Launch Vitis,启动Vitis开发环境。在弹出的对话框中,将路径指定到新建的vitis文件夹下,点击Launch启动Vitis。

到这里我们的硬件设计部分已经结束,接下来的软件设计部分需要在Vitis软件中进行。

软件设计

在硬件设计的最后,我们打开了Vitis开发环境,下面我们开始第五步——创建应用工程。

step5:在Vitis中创建应用工程

5-1在菜单栏依次点击“File->New->Application Project新建一个Vitis应用工程。在弹出的对话框中,输入工程名gpio_emio其他默认,点击Next”,如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_引脚_23


3.4.1创建工程

5-2 点击“Create a new platform hardware(XSA),软件提供了一些板卡的硬件平台以供选择,但对于我们自己的硬件平台需要手动添加,点击“+”添加。

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_#define_24


3.4.2 添加硬件平台

选择vitis文件夹下的“design_1_wrapper.xsa”,如下图所示。


 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_引脚_25


3.4.3 选择硬件平台文件

成功添加我们自己的硬件平台后,点击next,如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_串口_26


3.4.4 硬件平台添加完成

5-3弹出的页面中保持默认设置,点击next。

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_#define_27


3.4.5 保持默认设置

5-4选择工程模版“Empty Application”,本章将自行创建工程文件,故选择空模板,然后点击“Finish”按钮,如下图所示

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_引脚_28


3.4.6 选择工程模板

5-5新建源文件。首先我们在gpio_emio/src目录上右键,选择New-> File,如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_引脚_29


3.4.7 新建源文件

在弹出的对话框中File name一栏输入文件名“main.c”,然后点击“Finish”。

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_引脚_30


3.4.8 输入文件名

5-6 输入源代码。我们在新建的main.c文件中输入以下代码:

1 #include "stdio.h"​
2 #include "xparameters.h"​
3 #include "xgpiops.h"​
4 ​
5 #define GPIOPS_ID XPAR_XGPIOPS_0_DEVICE_ID //PS端 GPIO器件 ID​
6 ​
7 #define MIO_LED1 38 //PS_LED1 连接到 MIO38​
8 #define MIO_LED2 39 //PS_LED2 连接到 MIO39​
9 #define MIO_KEY1 40 //PS_KEY1 连接到 MIO40​
10 #define MIO_KEY2 41 //PS_LEY2 连接到 MIO41​
11 #define EMIO_KEY1 78 //PL_KEY1 连接到 EMIO0​
12 #define EMIO_KEY2 79 //PL_KEY2 连接到 EMIO1​
13 #define EMIO_LED1 80 //PL_LED1 连接到 EMIO2​
14 #define EMIO_LED2 81 //PL_LED2 连接到 EMIO3​
15 ​
16 int main()​
17 {​
18 printf("EMIO TEST!\n");​
19 ​
20 XGpioPs gpiops_inst; //PS端 GPIO 驱动实例​
21 XGpioPs_Config *gpiops_cfg_ptr; //PS端 GPIO 配置信息​
22 ​
23 //根据器件ID查找配置信息​
24 gpiops_cfg_ptr = XGpioPs_LookupConfig(GPIOPS_ID);​
25 //初始化器件驱动​
26 XGpioPs_CfgInitialize(&gpiops_inst,gpiops_cfg_ptr,gpiops_cfg_ptr->BaseAddr);​
27 ​
28 //设置LED为输出​
29 XGpioPs_SetDirectionPin(&gpiops_inst, MIO_LED1, 1);​
30 XGpioPs_SetDirectionPin(&gpiops_inst, MIO_LED2, 1);​
31 XGpioPs_SetDirectionPin(&gpiops_inst, EMIO_LED1, 1);​
32 XGpioPs_SetDirectionPin(&gpiops_inst, EMIO_LED2, 1);​
33 //使能LED输出​
34 XGpioPs_SetOutputEnablePin(&gpiops_inst, MIO_LED1, 1);​
35 XGpioPs_SetOutputEnablePin(&gpiops_inst, MIO_LED2, 1);​
36 XGpioPs_SetOutputEnablePin(&gpiops_inst, EMIO_LED1, 1);​
37 XGpioPs_SetOutputEnablePin(&gpiops_inst, EMIO_LED2, 1);​
38 ​
39 //设置KEY为输入​
40 XGpioPs_SetDirectionPin(&gpiops_inst, MIO_KEY1, 0);​
41 XGpioPs_SetDirectionPin(&gpiops_inst, MIO_KEY2, 0);​
42 XGpioPs_SetDirectionPin(&gpiops_inst, EMIO_KEY1, 0);​
43 XGpioPs_SetDirectionPin(&gpiops_inst, EMIO_KEY2, 0);​
44 ​
45 //读取按键状态,控制LED亮灭​
46 while(1){​
47 XGpioPs_WritePin(&gpiops_inst, MIO_LED1,​
48 ~XGpioPs_ReadPin(&gpiops_inst, EMIO_KEY1));​
49 ​
50 XGpioPs_WritePin(&gpiops_inst, MIO_LED2,​
51 ~XGpioPs_ReadPin(&gpiops_inst, EMIO_KEY2));​
52 ​
53 XGpioPs_WritePin(&gpiops_inst, EMIO_LED1,​
54 ~XGpioPs_ReadPin(&gpiops_inst, MIO_KEY1));​
55 ​
56 XGpioPs_WritePin(&gpiops_inst, EMIO_LED2,​
57 ~XGpioPs_ReadPin(&gpiops_inst, MIO_KEY2));​
58 ​
59 }​
60 ​
61 return 0;​
62 }

在代码的第7至10行,我们指定了PS端输出LED和输入KEY的MIO编号,这些编号可以从MPSOC开发板的原理图中查到。在代码的11至14行指定了PL端LED和按键KEY的EMIO编号,那么这些编号是怎么来的呢?

本章的简介部分们提到过,MPSOC的GPIO分成了6组,其中通过EMIO扩展GPIO接口位于BANK3至BANK5中,3.1.1。在本次实验中们通过EMIO扩展了4个GPIO信号BANK3的EMIO0,EMIO1,EMIO2,EMIO3,由于GPIO的BANK0,BANK1,BANK2分别26个信号,即MIO共有78个信号,所以BANK3的EMIO0是第79个信号,编号78(从0开始编号

按住Ctrl键,然后点击代码开头处所引用的头文件“xgpiops.h”以打开文件

在xgpiops.h文件162行给出了MPSOC器件GPIO最大的引脚数目,共174个,于6个Bank中。下面的注释中则分别列出了各Bank的引脚编号范围,样可以看到Bank3的第一个引脚编号78。

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_#define_31


3.4.9 GPIO引脚编号

程序的第46至59行,我们在一死循环中不断读取按键的状态,然后将读到的值取反后分别写入对应的LED中从而实现按键控制LED的功能。从上面的程序大家也可以看出,通过EMIO扩展GPIO接口的使用方法和MIO没有任何区别。如果大家GPIO的使用不熟悉的话,请参考《GPIO之MIO控制LED实验

5-7 编译工程。保存main.c文件,右键点击应用工程gpio_emio,在弹出的菜单中选择Build Project,如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_引脚_32


3.4.10 编译工程

工程编译结束后,在Binaries下成功生成gpio_emio.elf文件。

至此,硬件和软件设计部分均已完成。

下载验证

完成了硬件设计和软件设计后,我们就可以进行板级验证了,也就是设计流程的最后一步。在进行板级验证之前,我们先将开发板上的JTAG与电脑连接,然后使用USB连接线将USB UART(PS_PORT)接口与电脑连接,然后连接开发板的电源,给开发板上电。

step6:板级验证

6-1 打开串口助手或具有串口功能的软件。串口助手是上位机中用于辅助串口调试的小工具,可以选择安装使用开发板随附资料中“6_软件资料/1_软件/ XCOM V2.0”的文件夹中提供的串口助手,也可从网上下载或选择自己常用的串口调试工具。这里我们使用Vitis软件自带的串口终端。

按照《Hello World》实验中的步骤,打开Vitis中的Terminal窗口,如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_串口_33


3.5.1 打开Vitis串口终端

我们进入该窗口后,点击上图箭头所指的图标,在弹出的窗口中对串口进行设置,选择串口“Serial Terminal”,COM口依据自己的电脑设置,波特率为115200,数据位为8位,停止位为1位,如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_#define_34


3.5.2 设置UART

点击“OK”,串口终端成功连接,如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_#define_35


3.5.3口连接成功

6-2 下载程序。右键选择gpio_emio工程,在弹出的菜单中选择Run as-> Launch on Hardware,如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_#define_36


3.5.4 下载程序

这里需要注意一下,通过Run As->Launch on Hardware下载可以将bit文件和elf文件一块下载,不需要分别下载。

软件程序下载完成后,在下方的Terminal中可以看到应用程序打印的信息EMIO TEST!”,如下图所示:

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_引脚_37


3.5.5 串口终端中打印的信息

们按下开发板上PS端的用户按键PS_KEY1和PS_KEY2,可以看到对应的两个PL端LED灯PL_LED1和PL_LED2分别点亮。

然后再按下两个PL端的用户按键PL_KEY1和PL_KEY2,可以看到对应的PS端LED灯PS_LED1和PS_LED2分别点亮。说明们通过EMIO扩展GPIO接口按键控制LED灯实验验证成功。实验结果如下图所示

 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第三章 GPIO之EMIO按键控制LED实验​_串口_38


3.5.6 下载验证


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  QtpjMRSUUfXb   2023年12月08日   35   0   0 引脚#include看门狗
  UYSNSBVoGd8R   2023年12月08日   10   0   0 引脚#include#define
95kVyaJuybju