MIO、EMIO、AXI_GPIO
1 MIO
从ZYNQ的PS部分连接到FPGA的外部管脚,引脚位置固定所以不需要添加引脚约束,仅使用MIO可不下载bit文件。
xparameters.h
#define XPAR_PS7_GPIO_0_DEVICE_ID 0
#define XPAR_PS7_GPIO_0_BASEADDR 0xE000A000
#define XPAR_PS7_GPIO_0_HIGHADDR 0xE000AFFF
GPxCON寄存器为控制寄存器,它的每一位对应一个引脚,其某位设为0,相应的引脚为输出引脚,为1时为输入引脚。
GPxDAT为数据寄存器,当引脚设为输入时,读此寄存器可以知道相应的引脚的电平状态为高还是低,当引脚设为输出时,写此寄存器可令此引脚输出为高电平或者低电平。
Bank0有32个MIO引脚,Bank1有22个MIO引脚,54个引脚直接通过MIO连接到PS上,不需硬件配置,直接使用SDK软件进行编程。
2 EMIO
从ZYNQ的PS连接到PL,需要经过PL的用户逻辑才能达到FPGA管脚。由于使用了PL,需要下载bit文件。
#include "xgpiops.h"
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID//xparameters.h
XGpioPs_Config *ConfigPtr; //结构体 共有两个参数,一个参数是id 一个是器件的及地址
XGpioPs Gpio; /* The driver instance for GPIO Device. */
#define EMIO_LED 54 //0~53对应MIO,54对应EMIO0
#define EMIO_KEY 55 //0~53对应MIO,55对应EMIO1
/* Initialize the GPIO driver. */
//根据器件的id 然后查找器件的配置信息
ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
//初始化gpio 驱动
XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);
//设置方向输出(0是输入 1 是输出)
XGpioPs_SetDirectionPin(&Gpio, EMIO_LED, 1);
XGpioPs_SetDirectionPin(&Gpio, EMIO_KEY, 0);
//0 是关闭输出使能 1 是打开输出使能
XGpioPs_SetOutputEnablePin(&Gpio, EMIO_LED, 1);
XGpioPs_SetOutputEnablePin(&Gpio, EMIO_KEY, 1);
//写数据到GPIO的输出的引脚
XGpioPs_WritePin(&Gpio, MIO0_LED, 1);
//读取按键的状态
key_value = XGpioPs_ReadPin(&Gpio,EMIO_KEY);
3 AXI_GPIO
ZYNQ的PS通过AXI总线产生GPIO
4 总结
1.对MIO或EMIO gpio进行操作,都属于PS,引用xgpiops.h文件,对AXI_gpio引用xgpio.h
2.PL输出信号绑定引脚。
3.参考自己板子的电路图