S02_CH03_EMIO实验Enter a post title
S02_CH03_EMIO实验
3.1 EMIO 和MIO的对比介绍
上次讲到MIO的使用,初步熟悉了EDK的使用,这次就来说说EMIO的使用。如你所见zynq的GPIO,分为两种,MIO(multiuse I/O)和EMIO(extendable multiuse I/O)
MIO分配在bank0和bank1直接与PS部分相连,EMIO分配在bank2和bank3和PL部分相连。除了bank1是22-bit之外,其他的bank都是32-bit。所以MIO有53个引脚可供我们使用,而EMIO有64个引脚可供我们使用。
使用EMIO的好处就是,当MIO不够用时,PS可以通过驱动EMIO控制PL部分的引脚,接下来就来详细介绍下EMIO的使用。
EMIO的使用和MIO的使用其实是非常相似的。区别在于,EMIO的使用相当于,是一个PS + PL的结合使用的例子。所以,EMIO需要分配引脚,以及编译综合生成bit文件。
3.2 电路分析与实验现象
本节我们将使用Miz系列开发的LED,通过SDK操作EMIO来控制LED灯的流水操作。
3.3 创建VIVADO工程
Step1:新建一个名为为Miz_sys的工程,芯片类型根据自身情况设置。
Step2:创建一个BD文件,并命名为system。
Step3:添加 ZYNQ7 Processing System,根据自己的硬件类型配置好输入时钟频率与内存型号。
Step4:在MIO Configuration选项卡,再看到I/O Peripherals 中的GPIO一栏,勾选上其中的EMIO一栏,并选择4位引脚输出(最多可以选择64位,但是这个使用只需要4位足够了。)
Step5:单击OK,仔细观察发现的zynq核心多出一组引脚名为GPIO_0,这个正是我们刚刚设置的一组EMIO,我们右击该引脚,选择make external把GPIO_0引脚引出(或者单击该引脚处,按快捷键Ctrl +t,也可以将引脚引出)。效果如下图所示:
Step6:单击GPIO_0,将其修改为EMIO_0,如下图所示:
Step7:接着,将如下两引脚连接起来,其实就是给M_AXI_GP0_ACLK提供一个时钟。
Step8:右键单击Block文件,文件选择Generate the Output Products。
Step9:单击Block文件,选择Create a HDL wrapper,根据Block文件内容产生一个HDL 的顶层文件,并选择让vivado自动完成。
3.4 创建约束文件
根据自身的硬件,对芯片的引脚进行分配,首先打开我们提供的原理图文件,此处以Miz702开发板为例,Miz702的LED部分原理图如下所示:
此处我们选择LD1-LD4分配给EMIO。
Step1:选中Project manager,然后右单击Constraints,选择Add Sources。
Step2:输入文件名,完成创建,将以下约束文件加入约束文件当中。
set_property PACKAGE_PIN T22 [get_ports {emio_0_tri_io[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {emio_0_tri_io[0]}] set_property PACKAGE_PIN T21 [get_ports {emio_0_tri_io[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {emio_0_tri_io[1]}] set_property PACKAGE_PIN U22 [get_ports {emio_0_tri_io[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {emio_0_tri_io[2]}] set_property PACKAGE_PIN U21 [get_ports {emio_0_tri_io[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {emio_0_tri_io[3]}] |
其他型号的用户,可同理查阅原理图或根据型号打开我们提供的源程序的约束文件对系统引脚进行分配。
3.5 产生bit文件并导入到SDK中
Step1:生成bit文件。
Step2:导出到硬件。
Step3:打开SDK,单击File-New-Application project。
Step4:输入工程名字,此处命名为MIO_Test,单击Next。
Step5:选择Empty Application,创建一个空的工程,单击Finish完成创建。
Step6:单击工程名字右边的三角形按钮,然后右单击src,选择New-source file。
Step7:输入一个文件名,此处命名为main.c,单击Finish按钮完成C文件的添加。
Step8:在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, 54,1); XGpioPs_SetDirectionPin(&psGpioInstancePtr, 55,1); XGpioPs_SetDirectionPin(&psGpioInstancePtr, 56,1); XGpioPs_SetDirectionPin(&psGpioInstancePtr, 57,1); //使能EMIO输出 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, 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; } |
Step9:右击工程,选择Debug as ->Debug configuration。
Step10:选中system Debugger,双击创建一个系统调试。
Step11:设置系统调试。
Step12:单击窗口上的运行按钮,运行程序,可看到LED的流水操作。
3.6 程序分析
本章程序与第二章MIO基本上是一模一样的,如果还有不懂得地方请返回去查看第二章程序的分析,这里不再重复的讲解。这里需要注意的是本章程序中为什么要定义成54开头呢?答案如下图所示:
因为MIO和EMIO是同一编号的MIO共54个,从0~53。而从54开始就开始是EMIO了的范围了。之前我们应出了4个引脚emio_0_tri_io[0]~emio_0_tri_io[3],他们其实就依次对应54~57这几个序号,同时也对应了我们开发板上的4个LED(这是引脚约束的结果)。
3.7 本章小结
通过本章的学习,我们掌握了在MIO不够使用的情况下,通过PL部分扩展EMIO增加IO的使用量。并且通过一个简单的例子演示了如何添加EMIO IP 并且启动SDK 通过JTAG下载调试的方法。
S02_CH03_EMIO实验Enter a post title的更多相关文章
- S02_CH05_UBOOT实验Enter a post title
S02_CH05_UBOOT实验 5.1什么是固化 我们前几章的程序都是通过JTAG先下载bit流文件,再下载elf文件,之后点击Run As来运行的程序.JTAG的方法是通过TCL脚本来初始化PS, ...
- S02_CH04_User_IP实验Enter a post title
S02_CH04_User_IP实验 4.1 创建IP 在之前的教程中,我们通过MIO与EMIO来控制LED,所使用的也是官方的IP,实际当中,官方提供的IP不可能涵盖到方方面面,用户需要自己编写硬件 ...
- S02_CH02_MIO实验Enter a post title
S02_CH02_MIO实验 2.1 GPIO简介 Zynq7000系列芯片有54个MIO(multiuse I/O),它们分配在 GPIO 的Bank0 和Bank1隶属于PS部分,这些IO与PS直 ...
- 【第一季】CH05_FPGA设计Verilog基础(二)Enter a post title
[第一季]CH05_FPGA设计Verilog基础(二) 5.1状态机设计 状态机是许多数字系统的核心部件,是一类重要的时序逻辑电路.通常包括三个部分:一是下一个状态的逻辑电路,二是存储状态机当前状态 ...
- 【第一季】CH04_FPGA设计Verilog基础(一)Enter a post title
[第一季]CH04_FPGA设计Verilog基础(一) 4.1 Verilog HDL 代码规范 u 项目构架设计 项目的构架用于团队的沟通,以及项目设计的全局把控 u 接口时序设计规范 模块和模块 ...
- ctrl+enter提交留言
<!DOCTYPE html><html lang="zh-CN"><head> <meta charset="UTF-8&qu ...
- swoole实验版聊天室
“swoole实验版聊天室”是依据一堂swoole培训课内容改编的,结合了bootstrap前端框架.redis数据库.jquery框架等实现基本功能,只是体现了swoole的应用,并不是为了专门写个 ...
- Oracle第一步
Oracle 启动数据库 Startup [NOMOUNT|MOUNT|OPEN|FORCE] [restrict] [pfile=filename] 启动实例,加载数据库,启动数据库 oRACLE关 ...
- Using Nuget in Visual Studio 2005 & 2008
NuGet is a Visual Studio extension that makes it easy to install and update third-party libraries an ...
随机推荐
- java试题复盘——11月13日
上: 10. AccessViolationException异常触发后,下列程序的输出结果为( A ) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 AccessViol ...
- MySQL监控利器-PMM
本篇文章来简要介绍一下MySQL监控利器-PMM的部署过程. 环境: 主机名 IP 功能 系统 数据库版本 pmmclient 192.168.91.34 PMM-client RHEL7.4 p ...
- root of context hierarchy
Spring Boot项目,运行不明中断.日志如下: 2018-11-03 11:03:43.358 INFO [Thread-2][AbstractApplicationContext.java:9 ...
- js去掉字符串中的所有空格
1.使用js去掉字符串中的所有空格 1.1.定义一个去空格函数方法 function Trim(str,is_global){ var result; result = str.replace(/(^ ...
- 7 AOP
AOP:Aspect Oriented Programming 面向切面编程.AOP是对面向对象编程的一种补充,在运行时动态地将代码切入到类的指定方法.指定位置的编程思想.将不同的方法的同一位置抽象成 ...
- ArcGIS超级工具SPTOOLS-影像的批量裁剪和批量合并
1.1 影像批量裁剪 操作视频: https://weibo.com/tv/v/Hw25XqOL4?fid=1034:4376345233306897 影像批量裁剪:一个影像(可以多波段,也可以单波 ...
- LeetCode 搜索旋转排序数组
假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值, ...
- MySQL中information_schema数据库是干啥的
大家在安装或使用MYSQL时,会发现除了自己安装的数据库以外,还有一个 information_schema数据库.information_schema数据库是做什么用的呢,使用WordPress博客 ...
- app微信支付的集成步骤
1.引用地址 //微信支付 compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+' 2.注册 private IWXAPI api ...
- 依靠MySQL(frm、MYD、MYI)数据文件恢复
该方法并不是适用于所有MySQL数据库 此次恢复是朋友那边的数据查不了了,请求我支援,出于各种心理原因,我答应试试,于是就有了这篇文章和这次经历,废话不多说.... 物理条件:宿机是Ubuntu16. ...