ZYNQ GPIO 缓冲实现方法

在Vivado中,EMIO IP(system和AXI扩展部分)引出实际上有3个管脚,分别是gpio_i,gpio_o,gpio_t,

要把它们转化为标准的GPIO,要外加缓冲器,步骤如下

在顶层模块中,会生成如下代码

IOBUF gpio_0_tri_iobuf_0
(.I(gpio_0_tri_o_0),
.IO(gpio_0_tri_io[0]),
.O(gpio_0_tri_i_0),
.T(gpio_0_tri_t_0));
IOBUF gpio_0_tri_iobuf_1
(.I(gpio_0_tri_o_1),
.IO(gpio_0_tri_io[1]),
.O(gpio_0_tri_i_1),
.T(gpio_0_tri_t_1));
IOBUF gpio_0_tri_iobuf_10
(.I(gpio_0_tri_o_10),
.IO(gpio_0_tri_io[10]),
.O(gpio_0_tri_i_10),
.T(gpio_0_tri_t_10));
IOBUF gpio_0_tri_iobuf_11
(.I(gpio_0_tri_o_11),
.IO(gpio_0_tri_io[11]),
.O(gpio_0_tri_i_11),
.T(gpio_0_tri_t_11));

有多少IO,就会有多少个缓冲器。

缓冲器内部结构如图所示

这个缓冲器其实也可以自己写得更加简洁一些,比如adi官方的例子

module ad_iobuf (

  dio_t,
  dio_i,
  dio_o,
  dio_p);

  parameter     DATA_WIDTH = 1;

  input   [(DATA_WIDTH-1):0]  dio_t;
  input   [(DATA_WIDTH-1):0]  dio_i;
  output  [(DATA_WIDTH-1):0]  dio_o;
  inout   [(DATA_WIDTH-1):0]  dio_p;

  genvar n;
  generate                         #循环例化   
  for (n = 0; n < DATA_WIDTH; n = n + 1) begin: g_iobuf
  assign dio_o[n] = dio_p[n];
  assign dio_p[n] = (dio_t[n] == 1‘b1) ? 1‘bz : dio_i[n];
  end
  endgenerate

endmodule

调用

  ad_iobuf #(
    .DATA_WIDTH(32)                    #参数输入,例化32个
  ) i_iobuf (
    .dio_t(gpio_t[31:0]),
    .dio_i(gpio_o[31:0]),
    .dio_o(gpio_i[31:0]),
    .dio_p(gpio_bd));

当然,这样一来更新稍有不便,而且需要手工增加3个线,有点复杂。

如没有特殊要求推荐第一种方法。

时间: 2024-11-03 20:47:02

ZYNQ GPIO 缓冲实现方法的相关文章

Linux中的gpio口使用方法

Linux中的IO使用方法 应该是新版本内核才有的方法.请参考:./Documentation/gpio.txt文件 提供的API:驱动需要包含 #include <linux/gpio.h> 判断一个IO是否合法:int gpio_is_valid(int number); 设置GPIO的方向,如果是输出同时设置电平:/* set as input or output, returning 0 or negative errno */int gpio_direction_input(unsi

ARM知识分享-i.MX6Q GPIO复用修改方法

平台: OKMX6Q-S2 系统: Linux 内核版本: Linux-3.0.35 i.MX6Q GPIO复用修改方法,验证平台为飞凌嵌入式OKMX6Q-S2开发板,基于ARM Corte-A9 架构,i.MX6Q四核处理器,其它平台可参考使用.本次修改将原SD卡功能占用的部分引脚释放,复用为GPIO.具体的GPIO号需要参考i.MX6 CPU手册(IMX6DQRM.pdf)的第四章,Chapter 4 External Signals and Pin Multiplexing. i.MX6

orangepi找不到GPIO的解决方法

今天心血来潮,想折腾一下Orange Pi的GPIO口,去群里问了一下,对GPIO要对/sys/gpio_sw/进行操作,不料,翻遍了也没找到这个目录,gpio的字样怎么也找不到,本来以为是系统问题,把官方系统全部试了一遍都没找到gpio_sw,经过不懈努力,再外国友人的帮助下,弄好了,吐槽下官方的QQ群,问个问题都没人理,还答非所问,真是呵呵了,因此,我决定好好学习英语,以便阅读外国文献,与外国友人交流. 解决方法:以root权限执行: modprobe gpio-sunxi 这样就gpio_

Zynq GPIO 中断

1 /* 2 * Copyright (c) 2009-2012 Xilinx, Inc. All rights reserved. 3 * 4 * Xilinx, Inc. 5 * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A 6 * COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS 7 * ONE POSSIBL

linux下操作gpio寄存器的方法

一. 在驱动中: 1. 用的时候映射端口:ioremap; #define GPIO_OFT(x) ((x) - 0x56000000) #define GPFCON (*(volatile unsigned long *)(gpio_va + GPIO_OFT(0x56000050))) gpio_va = ioremap(0x56000000, 0x100000); // 物理地址0x56000000, 映射区分配的大小0x100000字节 这样映射过后,就可以直接操作寄存器了: 配置3引脚

【Android 多媒体开发】 MediaPlayer 状态机 接口 方法 解析

作者 : 韩曙亮 转载请著名出处 :  http://blog.csdn.net/shulianghan/article/details/38487967 一. MediaPlayer 状态机 介绍 Android MediaPlayer 状态即图例 : 1. Idle (闲置) 状态 和 End (结束) 状态 MediaPlayer 对象声明周期 : 从 Idle 到 End 状态就是 MediaPlayer 整个生命周期; -- 生命周期開始 : 进入 Idle (闲置) 状态; -- 生

MySql查询优化方法总结

常用查询优化 1: max()优化: 在相应列上添加索引2: count()优化:count(*) 会算出包含null记录的数量, count(field_name)只包含不含 null的数量(这也是很多时候两种count方式结果不一致的原因), count()的时候尽量用后一种, count(null)返回0,即不会记录null记录数量3: 子查询优化=====>(改为)联接查询(如果1对多的关系,注意重复记录)4: group by优化 如果包含子查询,在子查询里面使用where条件和gro

mysql的缓冲查询和非缓冲查询

最近在开发一个PHP程序时遇到了下面的错误: PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted 错误信息显示允许的最大内存已经耗尽.遇到这样的错误起初让我很诧异,但转眼一想,也不奇怪,因为我正在开发的这个程序是要用一个foreach循环语句在一个有4万条记录的表里全表搜索具有特定特征的数据,也就是说,一次要把4万条数据取出,然后逐条检查每天数据.可想而知,4万条数据全部加载到内存中,内存不爆才怪. 毕竟编程这么

CListCtrl改变数据和插入数据避免闪烁的方法

(1)CListCtrl改变数据避免闪烁: 法一:直接设置LVS_EX_DOUBLEBUFFER扩展属性. 法二:使用双缓冲. 自定义一个类CMyListCtrl继承CListCtrl,重写OnPaint和OnEraseBkgnd方法 void CMyListCtrl::OnPaint() { //使用双缓冲的方法绘制背景   CPaintDC dc(this); // device context for painting   CRect rect; CRect headerRect; CDC