作者: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开源工作室