PYNQ (ZYNQ) GPIO :MIO、EMIO、AXI_GPIO 代码实现pynq EMIO 点灯

GPIO

MIO、EMIO都是ps的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
GPIO 的控制和状态寄存器基地址为:0xE000_A000,我们 SDK 下软件操作底层都是对于内存地址空间的操作。

xparameters.h
#define XPAR_PS7_GPIO_0_DEVICE_ID 0
#define XPAR_PS7_GPIO_0_BASEADDR 0xE000A000
#define XPAR_PS7_GPIO_0_HIGHADDR 0xE000AFFF

1) MIO的GPIO

是PS的I/O引脚, 是固定管脚的, 使用时不消耗PL资源
对应的BANK是BANK0,BANK1。

  • 是其他功能使用剩余之后MIO可以做为GPIO.可以用在GPIO、SPI、UART、TIMER、Ethernet、USB等功能上,每个引脚都同时具有多种功能,故叫多功能
  • 这是FIXIO有固定对应的引脚,不需要用户约束引脚。
  • 实现仅仅依靠PS部分,即使用是PL可以不配置。不需硬件配置,直接使用SDK软件进行编程。可以看作是纯 PS 的操作。
  • 共有32+22=54个,
  • 在SDK内的编号是0-53.

2) EMIO的GPIO

EMIO依然属于PS,只是连接到了PL,再从PL输出信号。
通过PL扩展,使用时需要分配管脚,使用时消耗PL管脚资源。当 MIO 不够用时, PS 可以通过驱动 EMIO 控制 PL 部分的引脚 。
对应的BANK1和BANK2,

  • 这些IO是不被复用的,并且可以接到FPGA的引脚,也可以连接外部的FPGA逻辑,是非常灵活的扩展,
  • 其实现依靠PS和PL系统完成。共有32+32=64个,
  • 在SDK内部的编号对应从54-117.

3)AXI_GPIO核

是封装好的IP核,PS通过M_AXI_GPIO接口控制PL部分实现IO,使用时消耗管脚资源和逻辑资源。

寄存器

在这里插入图片描述

1),DATA_RO 寄存器是读端口数值。
2),DATA 是数据输出寄存器。
3),DIRM,OEN分别是方向控制寄存器和输出使能寄存器。
4), MASK_DATA_LSW是每个BANK低16位的输出控制,包括掩码位和数据位。(注意和DATA功能有重叠)

CODE

PYNQ MIO没有直接的led,先测试EMIO

在这里插入图片描述
在这里插入图片描述

CONSTRAINT

##Switches

set_property -dict { PACKAGE_PIN M20   IOSTANDARD LVCMOS33 } [get_ports { GPIO_0_0_tri_io[0] }]; #IO_L7N_T1_AD2N_35 Sch=sw[0]
#set_property -dict { PACKAGE_PIN M19   IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L7P_T1_AD2P_35 Sch=sw[1]

##LEDs
set_property -dict { PACKAGE_PIN R14   IOSTANDARD LVCMOS33 } [get_ports { GPIO_0_0_tri_io[1] }]; #IO_L6N_T0_VREF_34 Sch=led[0]

SDK

导入例子
在这里插入图片描述

int main(void)
{
	int Status;
	u32 InputData;
	XGpioPs_Config *ConfigPtr;


	printf("cccc");
	//my_gpiops_wr(0x204,v);
	
	printf("GPIO Polled Mode Example Test \r\n");
//load gpio
	ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
	Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
					ConfigPtr->BaseAddr);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	//load gpio_R
		ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
		Status = XGpioPs_CfgInitialize(&Gpio_r, ConfigPtr,
						ConfigPtr->BaseAddr);
		if (Status != XST_SUCCESS) {
			return XST_FAILURE;
		}





	//in
    XGpioPs_SetDirectionPin(&Gpio_r, 54, 0);
    XGpioPs_SetOutputEnablePin(&Gpio_r,54, 0);


	//out
	XGpioPs_SetDirectionPin(&Gpio, 55, 1);
	XGpioPs_SetOutputEnablePin(&Gpio, 55, 1);//Output_Pin
	while(1)
	{
		//InputData=XGpioPs_ReadPin(&Gpio_r, 54 );
	    InputData=XGpioPs_ReadPin(&Gpio_r,  54);
		XGpioPs_WritePin(&Gpio, 55, InputData);
	}
发布了452 篇原创文章 · 获赞 271 · 访问量 73万+

猜你喜欢

转载自blog.csdn.net/qq_35608277/article/details/105022559