admin管理员组

文章数量:1531665

目录

1、Descriptions

1、Usage

1.1、PL 配置

1.2、PS 代码


 

1、Descriptions

在前面一篇里面写了《Zynq-PS-SDK 之 MIO 使用》,MIO 可以理解为 PS 端(ARM 端)的硬连线到外部,Zynq 也提供了一种方式,从 PS 端连到 PL 端的 IO,称之为 EMIO(External 的意思);

GPIO Bank 和前面的一些概念这里不再重复,直接参考《Zynq-PS-SDK 之 MIO 使用》;这里看到 EMIO 有 32b X 2 也就是 64 根信号;他是 PS 通向 PL 的64条 IO 通路;

 

1、Usage

1.1、PL 配置

那怎么用这些 EMIO 呢,举个最简单的例,我的硬件原理图上,PL 端连接了 4 个 LED:

他们都位于 PL 的 IO Bank 上(M14、M15、K16、J16):

注意,这里是 PL,也就是 FPGA 的管脚,不是 PS 端的硬连线;

我们期望使用 PS 端的软件来控制这些 PL 的 IO 信号,进入 Vivado 的配置:

双击这个 ZYNQ PS:

勾选上 GPIO EMIO

配置 EMIO 的宽度,这里我们用了 4 个信号,所以配置为 4:

接下来就看到 Block Design 变成了如下情况:

这个 GPIO_0 是由于配置了 EMIO 多出来的;接着,我们将其配置出来

然后就变成了这样:

将其改名为 emio:

点击 Ctrl+S 保存下来;

重新生成 PS 的 IP:

查看顶层的 PS 文件:

可以看到,新增了这个叫做 [3:0]emio_tri_io 的信号,这个就是我们刚刚定义的信号;

既然这个是 PL 端的,那么就要进行管脚约束,新建立 XDC 文件:

根据之前原理图中PL连接 LED 的管脚定义(M14、M15、K16、J16),我们写入 XDC 约束并保存:

set_property IOSTANDARD LVCMOS33 [get_ports {emio_tri_io[*]}]
# PL LED define
set_property PACKAGE_PIN M14 [get_ports {emio_tri_io[0]}]
set_property PACKAGE_PIN M15 [get_ports {emio_tri_io[1]}]
set_property PACKAGE_PIN K16 [get_ports {emio_tri_io[2]}]
set_property PACKAGE_PIN J16 [get_ports {emio_tri_io[3]}]

最后综合、实现、生成 bitstream:

生成完 Bitstream 后,点击 [File]->[Export]->[Export Hardware] 导出硬件;

由于有 bitstream,所以这里要勾上 include bitstream

 

 

1.2、PS 代码

点击 [File]->[Launch SDK] 打开 SDK 新建一个 hello world 工程,配置 IO:

XGpioPs Gpio;
#define STEPH_MIO_0			0
#define STEPH_MIO_1			13

#define STEPH_EMIO_0		54
#define STEPH_EMIO_1		55
#define STEPH_EMIO_2		56
#define STEPH_EMIO_3		57

#define MIO_OUTPUT			1
#define MIO_INPUT			0

#define MIO_OUTPUT_EN		1
#define MIO_OUTPUT_DIS		0

uint32_t Steph_LEDInit(void)
{
	XGpioPs_Config *ConfigPtr = NULL;
	int Status = XST_SUCCESS;

	ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
	if(!ConfigPtr)
	{
		xil_printf("XGpioPs_LookupConfig Error.\r\n");
		return XST_FAILURE;
	}

	Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
						ConfigPtr->BaseAddr);

	if (Status != XST_SUCCESS) {
		xil_printf("XGpioPs_CfgInitialize Error.\r\n");
		return XST_FAILURE;
	}

	// For MIO
	XGpioPs_SetDirectionPin(&Gpio, STEPH_MIO_0, MIO_OUTPUT);
	XGpioPs_SetDirectionPin(&Gpio, STEPH_MIO_1, MIO_OUTPUT);

	XGpioPs_SetOutputEnablePin(&Gpio, STEPH_MIO_0, MIO_OUTPUT_EN);
	XGpioPs_SetOutputEnablePin(&Gpio, STEPH_MIO_1, MIO_OUTPUT_EN);
	xil_printf("Steph_LED MIO Initialize Finished...\r\n");

	// For EMIO
	XGpioPs_SetDirectionPin(&Gpio, STEPH_EMIO_0, MIO_OUTPUT);
	XGpioPs_SetDirectionPin(&Gpio, STEPH_EMIO_1, MIO_OUTPUT);
	XGpioPs_SetDirectionPin(&Gpio, STEPH_EMIO_2, MIO_OUTPUT);
	XGpioPs_SetDirectionPin(&Gpio, STEPH_EMIO_3, MIO_OUTPUT);

	XGpioPs_SetOutputEnablePin(&Gpio, STEPH_EMIO_0, MIO_OUTPUT_EN);
	XGpioPs_SetOutputEnablePin(&Gpio, STEPH_EMIO_1, MIO_OUTPUT_EN);
	XGpioPs_SetOutputEnablePin(&Gpio, STEPH_EMIO_2, MIO_OUTPUT_EN);
	XGpioPs_SetOutputEnablePin(&Gpio, STEPH_EMIO_3, MIO_OUTPUT_EN);

	return Status;
}


void LED_OFF(uint32_t pin)
{
	XGpioPs_WritePin(&Gpio, pin, 0x1);
}

void LED_ON(uint32_t pin)
{
	XGpioPs_WritePin(&Gpio, pin, 0x0);
}

MIO 的标号是 0~53,一共 54 个;

EMIO 的编号从 54 开始;

由于需要支下载 Bitstream,所以在 DEBUG 的时候需要配置一下:

配置一下:

完毕!

相关代码和工程在 gitee 持续更新:

https://gitee/stephenzhou-tech/Zynq7020_PS

本文标签: psZynqEMIOSDK