【ZYNQ7000学习之旅 - 01】EMIO练习

参考

  1. xilinx ug1165
  2. pynq z-2 用户手册

背景

zynq7000 MIO有53个,在BANK0和BANK1,并且直接与PS相连;EMIO有64个,在BANK2和BANK3,与PL相连;PS可以通过EMIO连接PL端的引脚。

准备

  1. Vivado2020.1
  2. Vitis2020.1
  3. pynq z-2

功能

使用PL端口的SW0和LED1,SW0作为AXI GPIO,LED1作为EMIO;SW0的切换实现LED1的亮灭。

生成XSA文件

  1. 新建vivado工程;

  2. 创建Block Design;

  3. 添加zynq ip,做好基础设置;

  4. 添加EMIO,在MIO Configuration->I/O Peripherals->GPIO->EMIO GPIO,选择1个EMIO。
    在这里插入图片描述
    zynq会生成如下的一个gpio:
    在这里插入图片描述

  5. 添加AXI GPIO,选择通道1,1位宽,设置如下:
    在这里插入图片描述
    在这里插入图片描述

  6. 自动连线得到如下图(axi timer是后续用来做定时器中断用的,本章节忽略):
    在这里插入图片描述

  7. 接着就是添加引脚约束,生成bit流文件;

  8. 加入vitis之后,vivado好像就不生成hdf文件了,而是生成.xsa文件,点击File->Export Hardware Platform,选择:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

编写APP

  1. 在Vivado中,launch vitis:
    在这里插入图片描述
  2. 手动创建vitis工程,选择工作区
    在这里插入图片描述
    还是和以前SDK一样创建一个裸机的hello world工程,一路next。
  3. 参考了UG1165的demo,接着上代码:
#include <stdio.h>
#include "platform.h"
#include "xil_types.h"
#include "xgpio.h"
#include "xtmrctr.h"
#include "xparameters.h"
#include "xgpiops.h"
#include "xil_io.h"
#include "xil_exception.h"

#define PS_PIN_DIRECTION_OUT	0x1
#define PS_PIN_DIRECTION_IN		0x0
#define PL_PIN_DIRECTION_OUT	0x0
#define PL_PIN_DIRECTION_IN		0x1
#define PS_ENABLE_OUTPIN		0x1
#define PS_DISABLE_OUTPIN		0x0
#define CHANNEL1				0x1
#define CHANNEL2				0x2
#define LED1_ON()				XGpioPs_WritePin(&psGpioInstancePtr,iPinNumberEMIO,1)
#define LED1_OFF()				XGpioPs_WritePin(&psGpioInstancePtr,iPinNumberEMIO,0)

u32 ReadStatus = 0;
int main()
{
	XGpioPs psGpioInstancePtr;//emio
	XGpio GPIOInstance_Ptr;//mio
	XGpioPs_Config *GpioConfigPtr;
	XTmrCtr TimerInstancePtr;
	int iPinNumberEMIO = 54;//mio 有53个
	int xStatus;

	//ps gpio initialize
	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");
	XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumberEMIO, PS_PIN_DIRECTION_OUT);
	XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumberEMIO, PS_ENABLE_OUTPIN);
	//axi gpio initialize
	XGpio_Initialize(&GPIOInstance_Ptr,XPAR_AXI_GPIO_0_DEVICE_ID);
	XGpio_SetDataDirection(&GPIOInstance_Ptr, CHANNEL1, PL_PIN_DIRECTION_IN);
	if(XST_SUCCESS != xStatus)
		print("AXI GPIO INIT FAILED\n\r");
	// loop start
	while(1) {
		ReadStatus = XGpio_DiscreteRead(&GPIOInstance_Ptr, CHANNEL1);
		if (ReadStatus == 0x1) {
				LED1_ON();
		} else if(ReadStatus == 0x0) {
			LED1_OFF();
		}
	}
	return 0;
}

总结

PS通过EMIO可以控制PL端的引脚

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一匹狼呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值