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 ...
随机推荐
- Raspberry Pi 4B 使用OpenCV访问摄像头picamera模块
目录 1.OpenCV安装 (1)安装依赖 (2)下载OpenCV源码 (3)安装pip (4)安装Python虚拟机 (5)编译OpenCV (6)验证安装 2.使用OpenCV和Python控制摄 ...
- SpringBoot配置JDBC连接MySql数据库的时候遇到了报错:HikariPool-1 - Exception during pool initialization
使用SpringBoot做JAVA开发时,JDBC连接MySql数据库的时候遇到了报错: ERROR 10392 --- [ main] com.zaxxer.hikari.pool.HikariPo ...
- python3 django项目从项目中导出依赖包
1. 在项目的根目录中使用mac终端执行命令, pip3 freeze > requirements.txt #requirements.txt只是个名字可以随便起,一般默认为requireme ...
- python之Anaconda python3.7安装
1.下载 https://www.anaconda.com/distribution/ #你会发现,使用windows下载十分慢,既然这样,为何不尝试centos(linux)安装呢?本人使用cent ...
- jack语言编译器的实现过程
目录: 1, 背景介绍
- CentOS7做ssh免密登录
(1)实验环境 两台CentOS7: youxi1 192.168.1.6 youxi2 192.168.1.7 这里我将防火墙关闭进行实验,如果防火墙开启,请将端口加入到防火墙规则中. (2).目标 ...
- JAVA 基础编程练习题32 【程序 32 左移右移】
32 [程序 32 左移右移] 题目:取一个整数 a 从右端开始的 4-7 位. 程序分析:可以这样考虑: (1)先使 a 右移 4 位. (2)设置一个低 4 位全为 1,其余全为 0 的数.可用~ ...
- nginx rewrite正则子组最多匹配到$9
nginx rewrite正则匹配()匹配子组最多匹配到$9,就是从$0到$9 当需要匹配更多子组时,可通过变量来实现 if ($uri ~ ^/forum-15/sortid-74/(.*?)(la ...
- JS_&&||
&& 且 当第一个参数为flase 就懒惰了,后面那个无视了,当第一个参数为ture,再去贪婪:|| 或 当第一个参数为flase 就贪婪了,继续找和面个了,当第一个参数为ture,就 ...
- Day04:循环结构(while、do-while、for)
Java 循环结构 - while ,do...while,for 反复执行一段相同或相似代码的格式. 顺序结构的程序语句只能被执行一次.如果您想要同样的操作执行多次,,就需要使用循环结构. Java ...