简介
ZYNQ GPIO 接口信号被分成四组,分别是从 BANK0 到 BANK3。其中 BANK0 和 BANK1 中共计 54
个信号通过 MIO 连接到 ZYNQ 器件的引脚上,这些引脚属于 PS 端;而 BANK2 和 BANK3 中共计 64 个信号则通过 EMIO 连接到了 ZYNQ 器件的 PL 端。如下图所示:
在大多数情况下,PS 端经由 EMIO 引出的接口会直接连接到 PL 端的器件引脚上,通过 IO 管脚约束来
指定所连接 PL 引脚的位置。通过这种方式,EMIO 可以为 PS 端实现额外的 64 个输入引脚或 64 个带有输出使能的输出引脚。EMIO 还有一种使用方式,就是用于连接 PL 内实现的功能模块(IP 核),此时 PL 端的 IP 作为 PS 端的一个外部设备。
BD设计
这里用到了PL端的资源,所以需要对PL端的引脚进行绑定。
软件设计
/*
* uartns550 9600
* uartlite Configurable only in HW design
* ps7_uart 115200 (configured by bootrom/bsp)
*/
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include <xparameters.h>
#include "xgpiops.h"
#include <xil_types.h>
#include <time.h>
#include "sleep.h"
#define LED1 54
#define LED2 55
#define LED3 56
#define LED4 57
#define GPIO_ID XPAR_XGPIOPS_0_DEVICE_ID
#define input 0
#define output 1
XGpioPs Inst_gpio;
int main()
{
u32 data = 0x0;
init_platform();
XGpioPs_Config *xps_config;
int status;
print("Hello World\n\r");
xps_config = XGpioPs_LookupConfig(GPIO_ID);
status = XGpioPs_CfgInitialize(&Inst_gpio,xps_config,
xps_config->BaseAddr);
if(status!=XST_SUCCESS){
print("failed\n");
return XST_FAILURE;
}
XGpioPs_SetDirectionPin(&Inst_gpio, LED1, output);
XGpioPs_SetDirectionPin(&Inst_gpio, LED2, output);
XGpioPs_SetDirectionPin(&Inst_gpio, LED3, output);
XGpioPs_SetDirectionPin(&Inst_gpio, LED4, output);
XGpioPs_SetOutputEnablePin(&Inst_gpio, LED1, 0x1);
XGpioPs_SetOutputEnablePin(&Inst_gpio, LED2, 0x1);
XGpioPs_SetOutputEnablePin(&Inst_gpio, LED3, 0x1);
XGpioPs_SetOutputEnablePin(&Inst_gpio, LED4, 0x1);
XGpioPs_WritePin(&Inst_gpio, LED1, data);
XGpioPs_WritePin(&Inst_gpio, LED2, data);
XGpioPs_WritePin(&Inst_gpio, LED3, data);
XGpioPs_WritePin(&Inst_gpio, LED4, data);
while(1){
usleep(200000);
XGpioPs_WritePin(&Inst_gpio, LED1,data );
XGpioPs_WritePin(&Inst_gpio, LED2, data);
XGpioPs_WritePin(&Inst_gpio, LED3, data);
XGpioPs_WritePin(&Inst_gpio, LED4, data);
usleep(200000);
XGpioPs_WritePin(&Inst_gpio, LED1, ~data);
XGpioPs_WritePin(&Inst_gpio, LED2, ~data);
XGpioPs_WritePin(&Inst_gpio, LED3, ~data);
XGpioPs_WritePin(&Inst_gpio, LED4, ~data);
}
cleanup_platform();
return 0;
}
这里实现了利用EMIO控制PL端的LED。