mio

ZYNQ笔记(3):GPIO的使用(MIO、EMIO)——led灯

孤人 提交于 2020-04-24 03:33:38
一、GPIO原理 1.GPIO介绍   程序员通过软件代码可以独立和动态地对每个 GPIO 进行控制,使其作为输入、输出或中断。     (1)通过一个加载指令,软件可以读取一个 GPIO 组内所有 GPIO 的值。     (2)通过一个保存指令,将数据写到一个 GPIO 组内的一个或多个 GPIO 。     (3)在 ZYNQ-7000 SOC 内,GPIO 模块的控制寄存器和状态寄存器采用存储器映射方式,它的基地址为 0xE000_A000。     (4)每个GPIO都提供了可编程的中断。通过软件程序代码可以实现:①读原始和屏蔽中断的状态;②可选的敏感性,包括电平敏感或边沿敏感。 2.MIO与EMIO的异同   MIO(multiuse I/O):多功能IO接口,属于Zynq的PS部分,Zynq7000 系列芯片有 54 个 MIO。它们分配在 GPIO 的 Bank0 和 Bank1 上,这些引脚可以用在GPIO、SPI、UART、TIMER、Ethernet、USB等功能上,每个引脚都同时具有多种功能,故叫多功能IO接口。这些 IO 与 PS 直接相连。不需要添加引脚约束,MIO 信号对 PL部分是透明的,不可见。所以对 MIO 的操作可以看作是纯 PS 的操作。GPIO 的控制和状态寄存器基地址为:0xE000_A000,我们 SDK

ZYNQ自定义AXI总线IP应用——PWM实现呼吸灯效果

[亡魂溺海] 提交于 2020-04-22 08:42:06
一、前言    在实时性要求较高的场合中,CPU软件执行的方式显然不能满足需求,这时需要硬件逻辑实现部分功能。要想使自定义IP核被CPU访问,就必须带有总线接口。ZYNQ采用AXI BUS实现PS和PL之间的数据交互。本文以PWM为例设计了自定义AXI总线IP,来演示如何灵活运用ARM+FPGA的架构。 功能定义:在上一篇ZYNQ入门实例博文讲解的系统中添加自定义IP核,其输出驱动LED等实现呼吸灯效果。并且软件通过配置寄存器方式对其进行使能、打开/关闭配置以及选择占空比变化步长。另外,可以按键操作完成占空比变化步长的增减。 平台:米联客 MIZ702N (ZYNQ-7020) 软件:VIVADO+SDK 2017 注:自定义IP逻辑设计采用明德扬至简设计法 二、PWM IP设计   PWM无非就是通过控制周期脉冲信号的占空比,也就是改变高电平在一段固定周期内的持续时间来达到控制目的。脉冲周期需要一个计数器来定时,占空比由低变高和由高变低两种模式同样需要一个计数器来指示,因此这里使用两个嵌套的计数器cnt_cyc和cnt_mode。cnt_mode的加一条件除了要等待cnt_cyc计数完成,还要考虑占空比的变化。   我们可以使用下降沿位置表示占空比,位置越靠近周期值占空比越高。在模式0中下降沿位置按照步长增大直至大于等于周期值,模式1中下降沿位置则按照步长递减直到小于步长

ZYNQ入门实例——三种GPIO应用、中断系统及软硬件交叉触发调试

牧云@^-^@ 提交于 2020-04-22 02:47:08
一、前言    Xlinx的ZYNQ系列SOC集成了APU、各种专用外设资源和传统的FPGA逻辑,为ARM+FPGA的应用提供助力,降低功耗和硬件设计难度的同时极大提高两者间传输的带宽。之前在研究生课题中使用过ZYNQ搭建环路系统对算法进行板级验证,但并没有深入使用和理解这个异构平台,今天算是对入门的总结。一款SOC的入门必然是GPIO的使用,而中断则是MCU能保证实时性的必杀武器。硬件调试难度高一直是FPGA的痛点,集成ARM的FPGA更是如此,cross-trigger调试有效地解决了这一问题,所以它也作为入门ZYNQ的必要技能。 二、硬件系统搭建    ZYNQ的三种GPIO分别是MIO、EMIO和AXI-GPIO。PS部分直接连接到芯片引脚的IO叫MIO,经过FPGA再连接到引脚的是EMIO。EMIO可以通过硬件约束指定不同的端口号和电压标准,提高了ARM IO的灵活性。而AXI-GPIO相当于是对ARM IO的补充,通过调用AXI-GPIO IP核与外部通信。以下通过一个实例来说明三种IO的使用方式。 系统功能:使用一个MIO使连接其上的LED闪烁,使用8个EMIO同样与LED连接构成流水灯效果,另外再调用一个5bit位宽的AXI-GPIO IP核以终端模式响应电路板上5个按键。 平台:米联客 MIZ702N (ZYNQ-7020)   配置ZYNQ IP

zynq 7Z010的启动模式配置

為{幸葍}努か 提交于 2020-04-12 15:11:07
1: http://bbs.myir-tech.com/thread-8078-1-1.html 启动模式 ZYNQ 7000启动模式由MIO[5-2]来决定,选择JTAG启动时,MIO[5-3]必须都是0,而MIO2,决定了JTAG 的Cacade和 Independent模式 我们先说明如何启用JTAG,关于JTAG 的Cascade mode和Independent mode的区别,见: http://bbs.myir-tech.com/thread-8077-1-1.html 如何启用/使能JTAG端口 1) 要使能JTAG端口,最简单的就是,选择JTAG boot,也就是将MIO[5-3]拉低,然后重新上电即可进入JTAG引导模式,此时JTAG端口已经启用/使能。需要注意,当改变了启动模式之后,必须重新上电才能将启动模式改变生效。这是因为,ZYNQ 7000只有在 上电复位时刻才去 sample采集boot mode pin,也就是MIO[5-3] 2) 如果不是JTAG启动模式,那么JTAG端口是否使能取决于ZYNQ当前的安全模式。如果ZYNQ是安全启动,ZYNQ芯片会禁止JTAG端口,你是不可能通过JTAG端口进行下载和调试;如果ZYNQ非安全启动,则JTAG端口是使能的;那么,我们要使能JTAG端口,就要求ZYNQ是非安全启动模式。要ZYNQ是非安全启动模式

AXI接口的MIG测试【MIZ7035学习】

强颜欢笑 提交于 2019-12-30 10:58:43
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1.前言 刚买了米联客的MIZ7035开发板,这几天休假也不出去,就在家拿回来测一些东西。 主要目的是学习: PL端的DDR3接口 GTX用作PCIE接口 SFP接口 HDMI接口 SD卡和eMMC共存情况下的PetaLinux 主要就是这些了。过程主要是自己根据原理图、文档在Vivado上直接新建工程来进行测试,米联客的资料作为辅助,需要时进行查看。 这次先来测试MIG做出的DDR3控制器,看看效果怎么样。 2.新建Vivado工程 新建工程,点击Next 选择FPGA型号 点击Next,Finish 新建BD,点击OK 3.AXI接口的MIG IP 点击Add IP,添加MIG IP 双击MIG IP的GUI, 弹出窗口Xilinx Memory Interface Generator, 点击Next 默认新建设计,1个控制器,AXI4接口 点击Next 选择DDR3 SDRAM 默认设置800MHz时钟,然后修改Memory Part为MT41K256M16XX-125,Data Width选择32位,其他设置默认 AXI的Data Width选择64位和PS的HP接口对应或者32位和GP接口对应,地址线读写仲裁选择ROUND_ROBIN,其他默认 因为刚才选了800MHz和4:1

Why would the first write to Mio's TcpStream after accepting give an “operation would block” error?

血红的双手。 提交于 2019-12-25 01:36:00
问题 With this code: poll.poll(&mut poll_events, Some(Duration::from_secs(0))); for event in poll_events.iter() { match event.token() { LISTENER_TOKEN => { let (mut stream, addr) = unwrap_or_continue!( listener.accept(), "Failed to accept incoming connection" ); unwrap_or_continue!( stream.write("Hello, world!\n".as_bytes()), &format!("Failed to write to {}", addr) ); } _ => unreachable!() } } where unwrap_or_continue! just does continue on an error while reporting it, I get this error: Failed to

Xilinx Zynq-7000 SoC高性能处理器的下载器接口、LED指示灯

一世执手 提交于 2019-12-24 16:08:43
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> TLZ7x-EasyEVM 是广州创龙基于 Xilinx Zynq-7000 SoC 设计的高速数据采集处理开发板, 采用核心板+底板的设计方式,尺寸为160mm * 108mm,它主要帮助开发者快速评估 核心板 的性能。 核心板采用12 层 板沉金无铅设计工艺,尺寸为62mm * 38mm ,引出 PL 端 和PS端 全部可用资源信号引脚 , 降低 了开发难度和周期,以便开发者进行快捷的二次开发使用。 底板 采用4层无铅沉金电路板设计,为了方便用户学习开发参考使用, 下 面引出了各种常见的 硬件说明 。 下载器 接口 开发板的 CON2 是下载器 JTAG 接口,共 14 p in ,2.0mm间距,PS端和PL端均可使用其来下载程序镜像, 各引脚定义如下图 所示: LED指示灯 开发 底板设有1个电源指示灯LED5和 4个 可编程 指示灯 (LED1、LED2、LED3、LED4) , 其中LED1 是PS 端控制 , LED2、LED3、LED4 是PL端 控制,各 引脚定义 如下图 所示 : 核心板共设有5个L ED 灯:1个电源指示灯(LED4)、1个DONE灯(LED5)、3 个 可编程 指示灯 (LED1、LED2、LED3)。 详细说明如下: LED1 :管脚号为 F/C5/PS_MIO14

Detecting client hangup in MIO

断了今生、忘了曾经 提交于 2019-12-10 15:31:21
问题 When using MIO (0.3.5) how do I detect the termination of a connection? I tried the following: extern crate mio; use mio::{EventLoop,Token,ReadHint}; use std::io::Read; fn main(){ let listener = mio::tcp::TcpListener::bind("localhost:1234").unwrap(); let (stream,_) : (mio::tcp::TcpStream, _) = listener.accept().unwrap(); let mut event_loop = EventLoop::new().unwrap(); event_loop.register(&stream,Token(0)).unwrap(); println!("run..."); event_loop.run(&mut H{stream:stream}).unwrap(); } struct H

What's the fastest idiomatic way to mutate multiple struct fields at the same time?

倖福魔咒の 提交于 2019-12-06 01:47:18
问题 Many libraries allow you to define a type which implements a given trait to be used as a callback handler. This requires you to lump all of the data you'll need to handle the event together in a single data type, which complicates borrows. For instance, mio allows you to implement Handler and provide your struct when you run the EventLoop. Consider an example with these trivialized data types: struct A { pub b: Option<B> }; struct B; struct MyHandlerType { pub map: BTreeMap<Token, A>, pub

What's the fastest idiomatic way to mutate multiple struct fields at the same time?

落爺英雄遲暮 提交于 2019-12-04 05:53:33
Many libraries allow you to define a type which implements a given trait to be used as a callback handler. This requires you to lump all of the data you'll need to handle the event together in a single data type, which complicates borrows. For instance, mio allows you to implement Handler and provide your struct when you run the EventLoop . Consider an example with these trivialized data types: struct A { pub b: Option<B> }; struct B; struct MyHandlerType { pub map: BTreeMap<Token, A>, pub pool: Pool<B> } Your handler has a map from Token to items of type A . Each item of type A may or may not