当前位置: 首页 > news >正文

ZYNQ笔记(四):AXI GPIO

版本:Vivado2020.2(Vitis)

任务:使用 AXI GPIO IP 核实现按键 KEY 控制 LED 亮灭(两个都在PL端)

一、介绍

        AXI GPIO (Advanced eXtensible Interface General Purpose Input/Output) 是 Xilinx 提供的一个可配置的通用输入输出 IP 核(通过 PL 资源实现的 GPIO,不同于 GPIO (E)MIO 是硬件固有的),用于在基于 AXI 总线的系统中实现 GPIO 功能。

主要特性:

  1. 双通道设计:通常提供两个独立的GPIO通道(Channel 1和Channel 2)

  2. 可配置数据宽度:每个通道的数据宽度可独立配置(1-32位)

  3. 输入/输出方向:每个位可独立配置为输入或输出

  4. 中断支持:可配置中断生成功能

二、硬件设计

        (1)配置ZYNQ 需要注意 AXI GPIO 使用了 AXI协议接口,所以 AXI接口、PL端时钟接口、复位接口都需要保留,此外的一些配置如Bank电压、UART串口配置(用于debug)、去掉未使用端口等等不再赘述。注意虽然使用了PL端按键,因为是通过AXI GPIO实现的不需要配置EMIO。

        (2)KEY 和 LED 都单独用一个 AXI GPIO IP(也可以只用一个,只不过分开方便区分),两者配置相同以 KEY 为例配置界面如图所示:

1.后面通过软件设置io的输入输出方向(不勾选All In/Outputs)

2.各只用了1个引脚,故设置1通道(不勾选Enable Dual Channel)、位宽1位(GPIO Width )

3.没有使用中断(不勾选Enable Interruput)

       (3)IP都配置好后点击上面的自动运行和连接,同时会自动补全其他的所需的IP

        (4)最后整体 bd 设计部分如图所示:设计检查、Generate Output Products、 Create HDL Wrapper、管脚约束、Gnerate Bitstream、Export Hardware(包含比特流文件)、启动Vitis

三、软件设计

        AXI GPIO 软件设计相对来说比 MIO、EMIO简单一点,因为是PL端资源实现,输出直接通过拉高引脚电平和清零实现的,不过配置细节上还是有一些区别

        此外AXI GPIO器件ID需要与硬件设计相对应,可以CTRL+左键器件ID跳转到 xparameters.h 查看器件对应情况(或者直接CTRL+左键 xparameters.h 再去翻)

#include "stdio.h"
#include "xil_printf.h"
#include "xparameters.h"
#include "xgpio.h"
#include "sleep.h"

//AXI GPIO是软核的gpio所以不用定义管脚,是通过所在通道和掩码来确定控制AXI GPIO哪一位的,通过软件进行置位输出与读取

//======================用户自定义宏======================//

#define KEY_AXI_GPIO_ID  	XPAR_GPIO_0_DEVICE_ID	//宏定义KEY AXI GPIO 器件ID
#define KEY_CHANNEL  		1						//宏定义KEY所在的axi gpio通道
#define KEY_MASK            0x01   				    //宏定义KEY所在通道掩码(用哪位就置0,这里掩码为了直观取反了,这里表示启用第0位)

#define LED_AXI_GPIO_ID  	XPAR_GPIO_1_DEVICE_ID   //宏定义LED AXI GPIO 器件ID
#define LED_CHANNEL  		1						//宏定义LED所在的axi gpio通道
#define LED_MASK            0x01   					//宏定义LED所在通道掩码(用哪位就置0,这里掩码为了直观取反了,这里表示启用第0位)

//======================实例化======================//

XGpio LED_AXI_GPIO;				//定义LED AXI GPIO驱动实例
XGpio KEY_AXI_GPIO;				//定义KEY AXI GPIO驱动实例

//======================函数声明======================//

static int  AXI_Gpio_Init();    //声明AXI GPIO初始化函数

//======================主函数======================//
int main()
{
	print("AXI GPIO Test\r\n");

	AXI_Gpio_Init();

	while(1)
	{
		if (XGpio_DiscreteRead(&KEY_AXI_GPIO, KEY_CHANNEL)) //如果按键按下(读取键值)
		{	//写1
			XGpio_DiscreteWrite(&LED_AXI_GPIO, LED_CHANNEL, 0x01);
		}
		else
		{
			//清0
			XGpio_DiscreteClear(&LED_AXI_GPIO, LED_CHANNEL, 0x01);
		}

	}
	return 0;
}

//======================AXI GPIO初始化函数======================//
int AXI_Gpio_Init()
{
	//初始化器件驱动
	XGpio_Initialize(&LED_AXI_GPIO, LED_AXI_GPIO_ID);
	XGpio_Initialize(&KEY_AXI_GPIO, KEY_AXI_GPIO_ID);
	//GPIO方向设置(不同于GPIO (E)MIO , AXI GPIO是 0输出/1输入)
	XGpio_SetDataDirection(&LED_AXI_GPIO, LED_CHANNEL, ~LED_MASK);
	XGpio_SetDataDirection(&KEY_AXI_GPIO, KEY_CHANNEL, KEY_MASK);
	return 0;
}

四、效果

相关文章:

  • Java-JDBC入门程序、预编译SQL
  • 动手学习:路径规划原理及常用算法
  • HTTP协议原理深度解析:从基础到实践
  • FreeRTOS动态任务创建
  • 线代[13]|线性代数题37道以及数学分析题3道(多图预警)
  • 【无标题】spark编程
  • HTTP:二.URI及相关术语
  • Linux 调试代码工具:gdb
  • 九屏图分析法以手机为例
  • OPEX baota 2024.02.26
  • NSGA-II 多目标优化 —— 理论、案例与交互式 GUI 实现
  • OpenCV 图像旋转
  • 笔记:头文件与静态库的使用及组织方式
  • 机器学习 从入门到精通 day_03
  • Android Studio Logcat V2 使用指南(适配 2024 年版本)
  • LangChain4j(2):Chat、流式与文生图模型功能
  • xHCI 上 USB 读写分析
  • Vue3 + TypeScript 的 Hooks 实用示例
  • SpringCloud Alibaba 之分布式全局事务 Seata 原理分析
  • GSO-YOLO:基于全局稳定性优化的建筑工地目标检测算法解析
  • 网站必须做诚信认证吗/企业seo网络推广
  • b站2023年免费入口下载官网/seo关键词推广
  • 洱源网站建设/seo关键词优化软件合作
  • 自有电脑做网站服务器/谷歌推广怎么做
  • app建设网站公司哪家好/百度网站快速排名公司
  • 网站建设优化推广哈尔滨/做网站的网络公司