一、GPIO简介

在ZYNQ中,PS端的引脚资源ZYNQ PS 中的外设可以通过 MIO( 54pin,Multiuse I/O,多用输入/输出)模块连接到 PS 端的引脚上,也可以通过 EMIO 连接到 PL 端。

zynq7000 SOC 结构见下图:

PS 所有的外设都可以通过 MIO 访问,这些外设也是与 MIO 进行连接,每个 MIO 虽然可以独立控制,以及独立驱动单个引脚的外设,但对于 QSPI、 USB、以太网等这些外设,其于 MIO 的连接有着特殊的要求,而MIO 一但选定,引脚位置就已经确定下来了,不需要添加引脚约束。
MIO引脚表:

GPIO 是英文“ general purpose I/O”的缩写,即通用的输入/输出。它是PS端的一个外设,用于观测和控制引脚,共分为4个bank,其中前两个bank与MIO相连(由于MIO只有54个pin,故bank0为32位,bank1为22位),后两个bank与EMIO相连(均为32位),对PL进行数据交互。GPIO结构如下:

PS端是通过AXI总线与APB总线对GPIO进行控制:

需要控制GPIO通道,来决定数据是输入还是输出,见下图:

各引脚的定义:

DATA_RO用来反映GPIO连接器件引脚的状态;

DATA为32位,需要在一个周期进行写设置,当GPIO被设置为输出时,寄存器可以控制输出的数值;

MASK_DATA_LSW(16bit)屏蔽DATA低16位,MASK_DATA_MSW(16bit)屏蔽DATA高16位;

DIRM:控制引脚作为输入还是输出(1,使能输出驱动;0,关闭输出驱动)。

OEN: output  enable,当IO被配置成输出时,该寄存器用于打开(1)和关闭(0)输出寄存器使能。(当DIRM与OEN同时为1时,引脚为输出)

DIRM与OEN同时为1时,GPIO设置为输出状态。

MASK使用例子:

MASK

DATA:1010_0101_1010_0101_XXXX_XXXX_XXXX_XXXX

目的:将标记位置的0101变为1010

使用MASK:

MASK_DATA_MSW:1111_0000_1111_1111(1屏蔽,0不屏蔽可修改)

data:1111_1010_xxxx_xxxx(直接修改DATA,被屏蔽位不会被修改)

不使用MASK:

驱动LED(0灭1亮)

(1)将DATA的数值读出来(read);

(2)改变需要更改的值(modify);

(3)修改后的数值写到DATA中(write);

二、预期目标

驱动GPIO,通过MIO控制PS端显示灯的亮灭。

三、实验流程

step:1创建new project

step2:使用 IP Integrator 创建 Processing System
在IP  INTEGRATOR中创建block design,选择zynq7000,并创建,设置引脚为GPIO,并去除其他引脚。

外置led引脚设置:

step3:生成顶层 HDL

               

此时已经创建好顶层的HDL文件。

step4:生成bitstearm ,导入SDK软件中,若为使用PL端,则不用生成比特流。

可以打开SDK软件包,进行调试。

step5:软件设计

创建一个新应用工程,点击next,选择empty application,ok。

在模板中找到,GpioPolledExample, GpioOutputExample,GpioInputExample等例程,调用其中函数,引入相应的哭文件,并将引脚改为与LED对应的引脚输出。

//MIO控制LED亮灭
#include "xparameters.h" //器件参数信息
#include "xstatus.h" //包含 XST_FAILURE 和 XST_SUCCESS 的宏定义
#include "stdio.h" //包含 print()函数
#include "xgpiops.h" //包含 PS GPIO 的函数声明
#include "sleep.h" //包含 sleep()函数//宏定义 GPIO_DEVICE_ID,三个LED灯引脚
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID//连接到 MIO 的 LED
#define MIOLED0 7 //连接到 MIO7
#define MIOLED1 8 //连接到 MIO8
#define MIOLED2 0 //连接到 MIO0
XGpioPs Gpio; // GPIO 设备的驱动程序实例int main()
{
int Status;
XGpioPs_Config *ConfigPtr;//配置寄存器地址
print("MIO Test! \n\r");
ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);//寻找GPIO的器件地址
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);//将配置寄存器初始化if (Status != XST_SUCCESS){
return XST_FAILURE;
}
//设置指定引脚的方向: 0 输入, 1 输出(控制DIRM,OEN)
XGpioPs_SetDirectionPin(&Gpio, MIOLED0, 1);
XGpioPs_SetDirectionPin(&Gpio, MIOLED1, 1);
XGpioPs_SetDirectionPin(&Gpio, MIOLED2, 1);
//使能指定引脚输出: 0 禁止输出使能, 1 使能输出
XGpioPs_SetOutputEnablePin(&Gpio, MIOLED0, 1);
XGpioPs_SetOutputEnablePin(&Gpio, MIOLED1, 1);
XGpioPs_SetOutputEnablePin(&Gpio, MIOLED2, 1);while (1) {
XGpioPs_WritePin(&Gpio, MIOLED0, 0x0); //向指定引脚写入数据: 0 或 1
XGpioPs_WritePin(&Gpio, MIOLED1, 0x0);
XGpioPs_WritePin(&Gpio, MIOLED2, 0x0);
sleep(1); //延时 1 秒
XGpioPs_WritePin(&Gpio, MIOLED0, 0x1);
XGpioPs_WritePin(&Gpio, MIOLED1, 0x1);
XGpioPs_WritePin(&Gpio, MIOLED2, 0x1);
sleep(1);
}
return XST_SUCCESS;
}

最后编译工程

step6:下载验证

连接电源线和JTAG线

可在此处观察串口通信。

完成程序下载,并可以看到达到预期效果。

FPGA学习日记(九)ZYNQ的GPIO—MIO接口控制相关推荐

  1. ZYNQ PS GPIO MIO 基础知识

    CLG400------XC7Z010 500 501 502 属于ps端bank 502 部分的引脚 专门用于连接ddr 500 501 部分引脚 用于连接MIO 500 + 501 的引脚个数为5 ...

  2. FPGA学习日记(八)SDRAM的读写测试

    目的:对SDRAM进行读写测试,使用FIFO对SDRAM进行封装. SDRAM功能框图: SDRAM原理图: 初始化状态机: 工作状态机: 代码如下: SDRAM顶层模块:连接外部芯片与测试灯,并通过 ...

  3. FPGA学习日记(七)HDMI图像数据传输

    一.实现目标 将像素数据通过HDMI传输,在显示器上显示. 二.数据流传输 HDMI常采用TMDS传输(上升沿复位)方式: (1)通过三个通道分别可传入8位的rgb视频信号,2位的控制信号,4位的音频 ...

  4. FPGA学习日记(18)--数码管动态显示

    数据生成模块 module data_gen #(parameter CNT_MAX = 23'd4999_999 ,parameter DATA_MAX = 20'd999_999 ) ( inpu ...

  5. Activity学习日记(九)

    目录 Handler的基本使用方法示例 listview基本使用 简单聊天程序客户端(java)[服务器可以找epoll服务器日志] SendBd_有序广播和无需广播_获取电池电量 serviceTe ...

  6. FPGA 学习笔记:Verilog 实现LED流水灯控制

    前言 在初步了解 Xilinx Vivado 的使用后,开启了FPGA Hello World 程序:LED 流水灯控制 在嵌入式MCU中,流水灯需要延时来实现,FPGA的延时,使用外部晶振来实现 目 ...

  7. ZYNQ PS端MIO的使用——FPGA Vitis篇

    文章目录 1. 前言 2. MIO介绍 3. Vivado工程编写 4. Vitis工程编写 5. 实验小结 A. 附录 B. 工程源码下载 1. 前言 本实验介绍如何使用ZYNQ芯片PS端的MIO. ...

  8. GPU(CUDA)学习日记(九)------ CUDA存储器模型

    GPU(CUDA)学习日记(九)------ CUDA存储器模型 标签: cuda存储bindingcache编程api 2012-09-27 10:53 1677人阅读 评论(1) 收藏 举报 分类 ...

  9. ZYNQ之FPGA学习----Vivado软件使用

    1 Vivado软件使用 Vivado Design Suite 是 Xilinx 公司的综合性 FPGA 开发软件,可以完成从设计输入到硬件配置的完整FPGA 设计流程.Vivado学习使用版本为V ...

最新文章

  1. kubernetes 1.8 高可用安装(一)
  2. 360 开源企业级 Kubernetes 多集群管理平台 Wayne
  3. linux下面navicat调整字体
  4. 如何免费注册Coursera课程
  5. 前端学习(642):字面量
  6. java interface 实例_Java - Interface 接口的实现方式实例
  7. 怎么实现两周联动加减速_行车记录仪种类繁多不知道怎么选?学会这几招,简单又有效...
  8. Java虚拟机笔记(五):JVM中对象的分代
  9. Visual Studio Code 1.44 发布
  10. 水表模型更新--170323
  11. Vue含表情评论回复组件
  12. 伪装文件病毒分析-流氓软件
  13. 算法的时间复杂度到底怎么算?
  14. python3flask教程_Python3 Flask bootstrap教程(1)
  15. Linux驱动学习9(同步/异步与阻塞/非阻塞的区别 )
  16. Newman基本使用
  17. Python程序设计基础第二版董付国版课后习题答案
  18. 笔记本固态硬盘选型(总线、接口、协议、SATA、PCIe、AHCI、NVMe、M.2、NGFF)
  19. 【ARM】在NUC977上搭建基于boa的嵌入式web服务器
  20. 用MATLAB进行余弦信号频谱分析

热门文章

  1. 免费计算机管理软件,电脑行业管理软件免费版
  2. Opencv4tegra和opencv
  3. C语言零基础项目:迷宫游戏!详细思路+源码分享
  4. 股票分析中的 KDJ指标
  5. 棋牌游戏用户流失预测——Xgboost调参
  6. java游戏服务器发_网络游戏服务器架构(转)
  7. 领跑人工智能赛道 暴风TV发布AI 2.0升级助手战略
  8. 平面设计中色彩运用的基础技巧是什么
  9. linux的Make使用的重定向
  10. 记录一下AD画简单PCB的大致流程