欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-23 21:32:04
...

GPIO

MIO、EMIO都是ps的
PYNQ (ZYNQ) GPIO :MIO、EMIO、AXI_GPIO 代码实现pynq EMIO 点灯
PYNQ (ZYNQ) GPIO :MIO、EMIO、AXI_GPIO 代码实现pynq EMIO 点灯
PYNQ (ZYNQ) GPIO :MIO、EMIO、AXI_GPIO 代码实现pynq EMIO 点灯
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,使用时消耗管脚资源和逻辑资源。

寄存器

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

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

CODE

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

PYNQ (ZYNQ) GPIO :MIO、EMIO、AXI_GPIO 代码实现pynq EMIO 点灯
PYNQ (ZYNQ) GPIO :MIO、EMIO、AXI_GPIO 代码实现pynq 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

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

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);
	}
相关标签: PYNQ