版本: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 功能。
主要特性:
-
双通道设计:通常提供两个独立的GPIO通道(Channel 1和Channel 2)
-
可配置数据宽度:每个通道的数据宽度可独立配置(1-32位)
-
输入/输出方向:每个位可独立配置为输入或输出
-
中断支持:可配置中断生成功能
二、硬件设计
(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 void 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)) //如果按键按下(读取键值,不过这里整个通道都读了){ //写1XGpio_DiscreteWrite(&LED_AXI_GPIO, LED_CHANNEL, 0x01);}else{//清0XGpio_DiscreteClear(&LED_AXI_GPIO, LED_CHANNEL, 0x01);}}return 0;
}//======================AXI GPIO初始化函数======================//
void 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);
}
四、效果
上板串口打印"AXI GPIO Test"debug信息,之后按下按键时LED点亮,松开熄灭