GPIO

前言:

ZYNQ 7000有三种GPIO:MIO,EMIO,AXI_GPIO

MIO是固定管脚的,属于PS,使用时不消耗PL资源;EMIO通过PL扩展,使用时需要分配管脚,使用时消耗PL管脚资源;AXI_GPIO是封装好的IP核,PS通过M_AXI_GPIO接口控制PL部分实现IO,使用时消耗管脚资源和逻辑资源。

使用的板子是zc702。

1.MIO方式

Zynq7000 系列芯片有 54 个 MIO(multiuse I/O), 它们分配在 GPIO 的 Bank0 和Bank1 隶属于 PS 部分, 这些 IO 与 PS 直接相连。 不需要添加引脚约束, MIO 信号对 PL部分是透明的, 不可见。 所以对 MIO 的操作可以看作是纯 PS 的操作。

ZYNQ 的三种GPIO :MIO EMIO AXI_GPIO 小节

学了zynq一段时间,一上来的时候就被zynq的GPIO唬住了,实在没搞清楚zynq的GPIO怎么回事,一会这样,一会那样,最后才慢慢发现zynq至少有3种GPIO可以调用。难怪我觉得每篇介绍GPIO的博客说的有一些不一样呢。

我们先看有哪三种GPIO:MIO、EMIO、AXI_GPIO。其中MIO和EMIO是直接挂在PS上的GPIO。而AXI_GPIO是通过AXI总线挂在PS上的GPIO上。

我们先看一下MIO和EMIO:下图EMIO和MIO的结构。其中MIO分布在BANK0,BANK1,而EMIO则分布在BANK2、BANK3。注意一下几项:

首先、MIO在zynq上的管脚是固定的,而EMIO,是通过PL部分扩展的,所以使用EMIO时候需要在约束文件中分配管脚,所以设计EMIO的程序时,

需要生成PL部分的bit文件,烧写到FPGA中。

其次、由下图可以看出MIO共占54bit,而EMIO占64bit。其中MIO占用IO号为0-53。而EMIO占用IO号为54-117。

再者、无论是EMIO还是MIO都属于PS上的IO,直接由PS操作。在调用头文件,只调用#include "xgpiops.h"即可,而在调用AXI_GPIO时,则需要#include "xgpio.h"。

ZYNQ GPIO 缓冲实现方法

在Vivado中,EMIO IP(system和AXI扩展部分)引出实际上有3个管脚,分别是gpio_i,gpio_o,gpio_t,

要把它们转化为标准的GPIO,要外加缓冲器,步骤如下

在顶层模块中,会生成如下代码
IOBUF gpio_0_tri_iobuf_0
(.I(gpio_0_tri_o_0),
.IO(gpio_0_tri_io[0]),
.O(gpio_0_tri_i_0),
.T(gpio_0_tri_t_0));
IOBUF gpio_0_tri_iobuf_1
(.I(gpio_0_tri_o_1),
.IO(gpio_0_tri_io[1]),

GPIO Product Guide笔记(Xilinx)

GPIO是通用并行IO接口的简称。他将总线信号转化为IO设备要求的信号类型,实现地址译码输出数据,锁定输入数据缓冲的功能。GPIO控制器的基本结构如图1所示。

总线接口模块实现地址译码,并将特定总线信号转化为内部总线;中断逻辑模块,根据中断控制以及中断产生条件产生中断请求信号。输入/输出控制模块将内部总线信号转化为基本的输入/输出引线,并实现输出数据锁定,输入数据暂存的功能。

Zynq中三种实现GPIO的方式

本文介绍在zynq中三种实现GPIO的方式,分别为MIO、EMIO和IP方式。

MIO和EMIO方式是使用PS部分的GPIO模块来实现GPIO功能的,支持54个MIO(可输出三态)、64个输入和128个输出(64个输出和64个输出使能)EMIO

而IP方式是在PL部分实现 GPIO功能,PS部分通过M_AXI_GP接口来控制该GPIO IP模块;另外EMIO模块虽然使用PS部分GPIO但也使用了PL部分的管脚资源。

MIO方式实现GPIO

vivado中zynq设置如下图

由图中可见要选中打开GPIO,其下自动显示可用于GPIO的MIO(当MIO作为其他功能时就不能作为GPIO使用了),其中MIO 7、MIO 8只能作为输出使用,因为它们用于VMODE管脚(参考UG585第14章:14.2.3)

软件部分如下
#include
#include "platform.h"
#include "xgpiops.h"

ZYNQ 的三种GPIO :MIO、EMIO、AXI_GPIO小节

学了zynq一段时间,一上来的时候就被zynq的GPIO唬住了,实在没搞清楚zynq的GPIO怎么回事,一会这样,一会那样,最后才慢慢发现zynq至少有3种GPIO可以调用。难怪我觉得每篇介绍GPIO的博客说的有一些不一样呢。

我们先看有哪三种GPIO:MIO、EMIO、AXI_GPIO。其中MIO和EMIO是直接挂在PS上的GPIO。而AXI_GPIO是通过AXI总线挂在PS上的GPIO上。

我们先看一下MIO和EMIO:下图EMIO和MIO的结构。其中MIO分布在BANK0,BANK1,而EMIO则分布在BANK2、BANK3。注意一下几项:

首先、MIO在zynq上的管脚是固定的,而EMIO,是通过PL部分扩展的,所以使用EMIO时候需要在约束文件中分配管脚,所以设计EMIO的程序时,需要生成PL部分的bit文件,烧写到FPGA中。

其次、由下图可以看出MIO共占54bit,而EMIO占64bit。其中MIO占用IO号为0-53。而EMIO占用IO号为54-117。

再者、无论是EMIO还是MIO都属于PS上的IO,直接由PS操作。在调用头文件,只调用#include "xgpiops.h"即可,而在调用AXI_GPIO时,则需要#include "xgpio.h"。

EDK使用实例之LCD1602

目的:在之前的LED的实例的基础之上使用GPIO点亮LCD1602液晶屏。本文将更多介绍SDK中的操作。 

问题:所有连接到 MIO 引脚的接口信号都可以利用 GPIO 块进行监听。监听操作的完成与 GPIO 的 MIO 配置无关。解决方案:

MicroBlaze的GPIO中断(思路清晰)

MicroBlaze的GPIO中断是相对比较简单的一种中断,其概念比较好理解。 1、首先要将XGpio IP中的“GPIO Supports Interrupts”选项使能,使得GPIO支持中断方式。 2、(推荐)使用XPS中断控制器IP,方便中断管理: 加入XPS_INTC Instance,使其Irq和MicroBlaze Processor的Interrupt输入相连,然后Intr断接来自GPIO等外设的中断信号,如有多个中断接入,可用“Intr = RS232_Uart_Intq&DIP_Switches_8Bit_Irq&Push_Buttons_Intq”的方式将它们共同连到Intr端口,注意这些中断的优先级从前到后依次升高,这个设置在XPS GUI窗口中可以设置。

同步内容