首页 > 其他分享 >Xilinx ZYNQ 7000+Vivado2015.2系列(四)之GPIO的三种方式:MIO、EMIO、AXI_GPIO

Xilinx ZYNQ 7000+Vivado2015.2系列(四)之GPIO的三种方式:MIO、EMIO、AXI_GPIO

时间:2024-03-27 10:55:05浏览次数:28  
标签:tri set MIO Vivado2015.2 XGpioPs GPIO ports psGpioInstancePtr

前言:

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 的操作。

20171010213751108

20171010213811038

新建Vivado工程,添加ZYNQ CPU核,双击,配置好时钟和内存类型,确认勾选MIO:

20171010214534563

如系列(三)文章所述,生成bit stream,然后Launch SDK。

在SDK中新建工程,源文件如下:

#include "xgpiops.h"
#include "sleep.h"
int main(){
    static XGpioPs psGpioInstancePtr;
    XGpioPs_Config* GpioConfigPtr;
    int iPinNumber= 8;
    u32 uPinDirection = 0x1;
	int xStatus;
	GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
	if(GpioConfigPtr == NULL)     
		return XST_FAILURE;    
	xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,GpioConfigPtr,
	GpioConfigPtr->BaseAddr);
	if(XST_SUCCESS != xStatus)
		print(" PS GPIO INIT FAILED \n\r");
		XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber,uPinDirection);
		XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber,1);
	while(1){    
		XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 1);
		usleep(500000);
		XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 0);
		usleep(500000);
		}
	return 0;
}

下载到板子上,DS12就开始闪烁了。

2.EMIO方式

EMIO 分配在 bank2 和 bank3 和 PL部分相连。EMIO 有 64 个引脚可供我们使用 。当 MIO 不够用时, PS 可以通过驱动 EMIO 控制 PL 部分的引脚 。

20171219144910023

Vivado工程里ZYNQ CPU核配置,确保EMIO勾选,这里我设置了位宽为4,后面为其分配了四个管脚:

20171010222024558

在Diagram里面将GPIO_0的引脚引出来,生成顶层文件后查看这个引脚的名字,因为我修改了名字,这里叫emio_0_tri_io

管脚约束文件:

#GPIO PMOD1
set_property PACKAGE_PIN E15 [get_ports {emio_0_tri_io[0]}]
set_property IOSTANDARD LVCMOS25 [get_ports {emio_0_tri_io[0]}]
set_property PACKAGE_PIN D15 [get_ports {emio_0_tri_io[1]}]
set_property IOSTANDARD LVCMOS25 [get_ports {emio_0_tri_io[1]}]
set_property PACKAGE_PIN W17 [get_ports {emio_0_tri_io[2]}]
set_property IOSTANDARD LVCMOS25 [get_ports {emio_0_tri_io[2]}]
set_property PACKAGE_PIN W5 [get_ports {emio_0_tri_io[3]}]
set_property IOSTANDARD LVCMOS25 [get_ports {emio_0_tri_io[3]}]

SDK部分:MIO号是0~53,EMIO从54开始

#include "xgpiops.h"
#include "sleep.h"
int main()
{
static XGpioPs psGpioInstancePtr;
XGpioPs_Config* GpioConfigPtr;
int xStatus;
GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
if(GpioConfigPtr == NULL)
return XST_FAILURE;
xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,GpioConfigPtr,
GpioConfigPtr->BaseAddr);
if(XST_SUCCESS != xStatus)
print(" PS GPIO INIT FAILED \n\r");
XGpioPs_SetDirectionPin(&psGpioInstancePtr, 54,1);
XGpioPs_SetDirectionPin(&psGpioInstancePtr, 55,1);
XGpioPs_SetDirectionPin(&psGpioInstancePtr, 56,1);
XGpioPs_SetDirectionPin(&psGpioInstancePtr, 57,1);
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 54,1);
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 55,1);
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 56,1);
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 57,1);
while(1)
{
XGpioPs_WritePin(&psGpioInstancePtr, 54, 1);
usleep(200000);
XGpioPs_WritePin(&psGpioInstancePtr, 54, 0);
usleep(200000);
XGpioPs_WritePin(&psGpioInstancePtr, 55, 1);
usleep(200000);
XGpioPs_WritePin(&psGpioInstancePtr, 55, 0);
usleep(200000);
XGpioPs_WritePin(&psGpioInstancePtr, 56, 1);
usleep(200000);
XGpioPs_WritePin(&psGpioInstancePtr, 56, 0);
usleep(200000);
XGpioPs_WritePin(&psGpioInstancePtr, 57, 1);
usleep(200000);
XGpioPs_WritePin(&psGpioInstancePtr, 57, 0);
usleep(200000);
}
return 0;
}

下载到板子里,PMOD1的4个led灯交替闪烁。

3.AXI_GPIO方式

VIvado工程里,ZYNQ CPU核配置:
勾选M_AXI_GPIO 接口:

20171011092104362

勾选复位信号:

20171011092349512

给PL的时钟信号:

20171011092723820

加入AXI_GPIO IP,这里设置位宽为4,后面将控制4个led灯:

20171011093057094

自动连接后如下图:

20171011093412242

管脚约束如下:

#GPIO PMOD1
set_property PACKAGE_PIN E15 [get_ports {gpio_sw_tri_o[0]}]
set_property IOSTANDARD LVCMOS25 [get_ports {gpio_sw_tri_o[0]}]
set_property PACKAGE_PIN D15 [get_ports {gpio_sw_tri_o[1]}]
set_property IOSTANDARD LVCMOS25 [get_ports {gpio_sw_tri_o[1]}]
set_property PACKAGE_PIN W17 [get_ports {gpio_sw_tri_o[2]}]
set_property IOSTANDARD LVCMOS25 [get_ports {gpio_sw_tri_o[2]}]
set_property PACKAGE_PIN W5 [get_ports {gpio_sw_tri_o[3]}]
set_property IOSTANDARD LVCMOS25 [get_ports {gpio_sw_tri_o[3]}]

SDk部分如下:

#include <stdio.h>
#include "platform.h"
#include "xparameters.h"
#include "xgpio.h"
int main() {
XGpio gpio_led;
int status;
int i,x,y;
init_platform();
status = XGpio_Initialize(&gpio_led, 0);
if(status == 0){
printf("success \r\n");
}
XGpio_SetDataDirection(&gpio_led,1,0);
while (1){
for (i = 0; i<=3; i++){
XGpio_DiscreteWrite(&gpio_led, 1, 0x01<<i);
for(x =1000; x > 0; x-- ){
for (y = 100000; y > 0; y--);
}
}
}
cleanup_platform();
return 0;
}

可以看到,与EMIO一样需要分配管脚,

但是AXI_GPIO使用的头文件是#include "xgpio.h"

而EMIO是#include "xgpiops.h"

下载完成后,PMOD1 的四个LED灯依次闪烁。

总结:

MIO和EMIO使用PS的GPIO,,MIO固定管脚,EMIO手动分配管脚;IP方式手动分配管脚,综合后需要消耗PL的逻辑资源。

标签:tri,set,MIO,Vivado2015.2,XGpioPs,GPIO,ports,psGpioInstancePtr
From: https://www.cnblogs.com/L707/p/18098450

相关文章

  • Xilinx ZYNQ 7000+Vivado2015.2系列(三)之HelloWorld实验(最小系统)(纯PS)
    前言:使用的板子是zc702。用Vivado的IP核搭建最小系统,包括ARM核(CPUxc7z020),DDR3(4×256M),一个UART串口(MiniUSB转串口),纯PS,通过串口打印出HelloWorld,工程虽小,五脏俱全,算是一种朝圣。配置要和板子对应,大家注意修改。操作步骤:硬件部分1.新建Vivado工程选择芯片型号xc7z020clg484_1......
  • Xilinx ZYNQ 7000+Vivado2015.2系列(二)之奇数分频和逻辑分析仪(ILA)的使用
    前言:偶数分频容易得到:N倍偶数分频,可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。以此循环下去。奇数分频如何得到呢?第一部分 奇数分频奇数分频方法:N倍奇数分频,首先进行上升沿触发进行......
  • Xilinx ZYNQ 7000+Vivado2015.2系列(一)之流水灯(纯PL)
    原文链接:https://blog.csdn.net/u014485485/article/details/78056980前言:学习Xilinx的ZYNQ7000系列,用的板子是zc702(注意不是zedboard),SOC型号是xc7z020。虽然设计思路一样,但不同的套件引脚和io标准是有区别的,zc702评估板的的外观图如下,可以对照下自己的板子:作为入门体验,本设......
  • F28004X系列学习总结(3)——GPIO模块
    首先学习的模块就是GPIO,学习完后我们可以做到简单的点灯程序。I/O口配置步骤1、计划自己准备使用的设备引脚2、启动上拉电阻使能(使用GPxPOD寄存器)3、选择输入资格(使用GPxQSELN寄存器,同步、设置采样窗口)4、选择I/O口的方向(使用GPxDIR寄存器)5、选择低功耗模式唤醒源6、选......
  • 在linux中无需修改内核驱动就能操作GPIO口的示例
    一、首先编写一个脚本文件init.sh#!/bin/bashecho2>/sys/class/gpio/exportsleep1echo3>/sys/class/gpio/exportsleep1echoout>/sys/class/gpio/gpio3/directionecho1>/sys/class/gpio/gpio3/value这段代码是在Linux系统中使用shell脚本语言编写的。让......
  • gpio子系统分析
    参考博客:https://blog.csdn.net/yangguoyu8023/article/details/121892008https://blog.csdn.net/yangguoyu8023/category_11576708.html gpiolib相关数据结构:数据结构主要定义在include/linux/gpio/driver.h和/drivers/gpio/gpiolib.h中/***structgpio_chip-a......
  • gpio子系统与pinctrl子系统通用API
    此篇不涉及gpio子系统和pinctrl原理解释,只列举相关操作函数: 通用的GPIO操作:1.gpio_request(unsignedgpio,constchar*label):向内核申请指定gpio,所申请的IO口会被内核记录参数:gpio:申请IO口编号,label:申请者的名字,随便。返回:int值,成功:0;失败:负数注:在使用gpio口之前,应先用g......
  • dremio AsyncStreamConf 简单说明
    AsyncStreamConf主要是关于异步以及cache配置属性的参数配置,dremio存储扩展不少都实现了此接口参考实现使用的地方整体使用 存储插件基本都会使用到,包含了一些reader,同时还有文件系统的包装处理 ceCacheFileSystemWrapper的使用 这个是dremioce包中的一个CacheF......
  • CH57x,CH58x,CH59x芯片_SPI借助GPIO中断完成中断传输
    受其他项目的启发,如果IO充裕,且在SPI主机与SPI从机均可以自行编程的情况下,可以尝试在4线SPI的基础上增加两根GPIO线,通过IO中断的形式通知对方进行收数据;非SPI中断形式,以两颗CH582通讯为例,1、主机程序:voidmain(){SetSysClock(CLK_SOURCE_PLL_60MHz);GPIOA_ModeCfg......
  • dremio 官方对于软件版ha 以及扩展部署的参考方案
    关于dremio实际大规模部署的记录,内容来自官方文档dremio组件架构参考图此图包含了dremio的ha以及扩展,包含了主备Coordinator(故障转移的)提高查询性能的Coordinator,以及进行实际查询的执行器此部署中依赖lb,共享存储(nfs类的),zk(协调选举的),分布式存储(当然也可以使用共享存储,但......