Zynq-7000 PS到PL端emio的使用

日期:2018-08-27 作者:OpenS_Lee
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第一次接吻。

关于OpenHW  |  OpenHW使用说明  |  FAQ  |  相关法律  |  版权声明
联系邮件: openhw@eefocus.com   联系电话: 0512-80981663-8062     Fax:0512-80981279
Powered by eefocus.com