Zynq-7000 PS到PL端emio的使用

作者:OpensLee,FPGA开源工作室

1 背景知识
上一节《Zynq-7000 ARM端MIO的使用》讲解了PS端MIO的使用,本节讲解ARM处理器通过emio(Extendable Multiuse I/O)控制PL端接口。如下图所示,ZYNQ-7000的GPIO分为两种(MIO,EMIO)。EMIO分布在Bank2和BANK3,共有64个引脚可以使用。

如下图所示,当我们的MIO不够使用时我们可以使用EMIO,因为EMIO连接到FPGA端,所以管脚需要约束。

本节将实现MIO端和EMIO端LED一个接着一个亮灭的实验。

2 LED灯实验
对于工程的创建在此不再赘述。可参考《Zynq-7000 ARM端helloworld实验》

1) ZYNQ7 Processing System GPIO的设置

点击MIO Configuration>>选中GPIO MIO和GPIO EMIO Width设置为4(PL端挂了4个LED)如下图所示。其他配置根据自己的开发板设置。


2) 生成processing_system7_0

3) launch SDK

(1)首先选中system右键选中Generate Output Products...

(2)选中system右键选中Create HDL Wrapper...

(3)建立约束文件XDC

set_property PACKAGE_PIN M14 [get_ports {emio_0_tri_io[0]}]

set_property IOSTANDARD LVCMOS33 [get_ports {emio_0_tri_io[0]}]

set_property PACKAGE_PIN M15 [get_ports {emio_0_tri_io[1]}]

set_property IOSTANDARD LVCMOS33 [get_ports {emio_0_tri_io[1]}]

set_property PACKAGE_PIN K16 [get_ports {emio_0_tri_io[2]}]

set_property IOSTANDARD LVCMOS33 [get_ports {emio_0_tri_io[2]}]

set_property PACKAGE_PIN J16 [get_ports {emio_0_tri_io[3]}]

set_property IOSTANDARD LVCMOS33 [get_ports {emio_0_tri_io[3]}]

(4)生成bitstream。

(5)导出硬件 选择菜单File->Export->Export Hardware...。这里包括bitstream

(6)Launch SDK 选择菜单File->Launch SDK,启动SDK环境。

4)SDK编程

(1) 新建APP

点击FILE>>Application Project>>Project name>>Next,如下图

选着空工程Empty Application>>Finish,如下图

(2)编写代码main.c

#include "xgpiops.h"

#include "sleep.h"

int main()

{

static XGpioPs psGpioInstancePtr;

XGpioPs_Config* GpioConfigPtr;

int xStatus;

//-- EMIO的初始化

GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);

if(GpioConfigPtr == NULL)

return XST_FAILURE;

xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,GpioConfigPtr, GpioConfigPtr->BaseAddr);

if(XST_SUCCESS != xStatus)

print(" PS GPIO INIT FAILED \n\r");

//--EMIO的输入输出操作

XGpioPs_SetDirectionPin(&psGpioInstancePtr, 0,1); //1--output 0--input

XGpioPs_SetDirectionPin(&psGpioInstancePtr, 13,1);

XGpioPs_SetDirectionPin(&psGpioInstancePtr, 54,1);

XGpioPs_SetDirectionPin(&psGpioInstancePtr, 55,1);

XGpioPs_SetDirectionPin(&psGpioInstancePtr, 56,1);

XGpioPs_SetDirectionPin(&psGpioInstancePtr, 57,1);

//使能EMIO输出

XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 0,1);

XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 13,1);

XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 54,1);

XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 55,1);

XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 56,1);

XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 57,1);

while(1)

{

XGpioPs_WritePin(&psGpioInstancePtr, 0, 1);//MIO的第0位输出1

usleep(200000);//延时

XGpioPs_WritePin(&psGpioInstancePtr, 0, 0);//MIO的第0位输出0

usleep(200000);//延时

XGpioPs_WritePin(&psGpioInstancePtr, 13, 1);//MIO的第13位输出1

usleep(200000);//延时

XGpioPs_WritePin(&psGpioInstancePtr, 13, 0);//MIO的第13位输出0

usleep(200000);//延时

XGpioPs_WritePin(&psGpioInstancePtr, 54, 1);//EMIO的第0位输出1

usleep(200000);//延时

XGpioPs_WritePin(&psGpioInstancePtr, 54, 0);//EMIO的第0位输出0

usleep(200000);//延时

XGpioPs_WritePin(&psGpioInstancePtr, 55, 1);//EMIO的第1位输出1

usleep(200000);//延时

XGpioPs_WritePin(&psGpioInstancePtr, 55, 0);//EMIO的第1位输出0

usleep(200000);//延时

XGpioPs_WritePin(&psGpioInstancePtr, 56, 1);//EMIO的第2位输出1

usleep(200000);//延时

XGpioPs_WritePin(&psGpioInstancePtr, 56, 0);//EMIO的第2位输出0

usleep(200000);//延时

XGpioPs_WritePin(&psGpioInstancePtr, 57, 1);//EMIO的第3位输出1

usleep(200000);//延时

XGpioPs_WritePin(&psGpioInstancePtr, 57, 0);//EMIO的第3位输出0

usleep(200000);//延时

}

return 0;

}

(3)下载实现

连接好硬件后,右键选择EMIO_test工程,再选择Run as->Run Configurations...。双击xilinx C/C++ application (System Debugger) >>勾选Reset entire system和Program FPGA>>Apply>>Run如下图所示。

(4)实验结果

视频欣赏:

总结:

MIO共54个pin,所以EMIO的排序从54开始,我们使用了4个PL端led引脚,所以是54-57。这也是PS与PL第一次接吻。

文章来源:FPGA开源工作室

最新文章

最新文章