目录
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
目录
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