有条件的可以买一块xilinx zc702官方开发板,能够从中受益匪浅。
EMIO 是Exrended IO 如上图所示,当PS端的通过MIO分配物理引脚不够用的时候,EMIO也是属于PS端的,但是它连接的是PL端的内部引脚,PL端要输出到物理引脚是需要管脚约束的。所以PL端是要生成Bit 流文件的。
所谓多路复用在英文上叫Routing 或者mapping,下表所示的表示外设的多路复用情况。
例如GPIO可以复用到MIO最多有54个,也可以多路复用到EMIO 使用的是PL 端的BANK2,BANK3.有64个三态IO。
同理有些外设是不能复用到EMIO的,例如USB,QSPI。
其映射关系如上图所示,EMIO序号和实际的物理引脚的指定方式是通过FPGA的管脚约束进行的。
EMIO实际上的控制只有三个种,EMIOGPIOI(输入),EMIOGPIOO(输出),EMIOGPIOTN( DIRM[x] & OEN[x] )
上上图所示,EMIO给到PL每部的信号是一条数据线,所以只有两种状态 1或者0.
同理输入也是一条来自PL的数据线,只有1或者0.
然后GPIO的寄存器控制不了这两条数据线的值,只能控制数据是否到达GPIO的寄存器里(DATA_RO).
这里关键是看,GPIO是GPIO,他的寄存器控制的这个外设内部的逻辑。他的输入输出是被动的,无法控制的。
在PL中开启两个每部引脚。
在PL管脚约束步骤上,指定PL内部引脚连接到BANK2,BANK3的哪个物理引脚上。
MIO序号是0~53 ,EMIO从54开始
SDK中的代码如下
/*
* main.c
*
* Created on: 2022年10月22日
* Author: Administrator
*/
#include "xparameters.h"
#include "xstatus.h"
#include "xil_printf.h"
#include "xgpiops.h"
#include "sleep.h"
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
//这里使用的是黑金7020 开发板
#define PIN_LED0 (13)
#define PS_KEY_1 (50)
#define PL_LED_1 (54)
#define PL_KEY_1 (55)
XGpioPs Gpio;
int main(void)
{
int Status;
XGpioPs_Config *ConfigPtr;
ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
//PS output
XGpioPs_SetDirectionPin(&Gpio, PIN_LED0, 1);
XGpioPs_SetOutputEnablePin(&Gpio, PIN_LED0, 1);
//PL output
XGpioPs_SetDirectionPin(&Gpio, PL_LED_1, 1);
XGpioPs_SetOutputEnablePin(&Gpio, PL_LED_1, 1);
// key Direction
XGpioPs_SetDirectionPin(&Gpio, PS_KEY_1, 0);
XGpioPs_SetDirectionPin(&Gpio, PL_KEY_1, 0);
while (1)
{
if(XGpioPs_ReadPin(&Gpio,PS_KEY_1))
{
XGpioPs_WritePin(&Gpio,PIN_LED0,0x01);
}
else
{
XGpioPs_WritePin(&Gpio,PIN_LED0,0x00);
}
if(XGpioPs_ReadPin(&Gpio,PL_KEY_1))
{
XGpioPs_WritePin(&Gpio,PL_LED_1,0x01);
}
else
{
XGpioPs_WritePin(&Gpio,PL_LED_1,0x00);
}
}
}