http://www.blogbus.com/uyarotxb-logs/206932748.html     inout作为输出端口时三态门为选通状态,inout作为输入端口时三态门为高阻态,可通过link_data控制使能。

芯片外部引脚很多都使用inout类型的,为的是节省管腿。一般信号线用做总线等双向数据传输的时候就要用到INOUT类型了。就是一个端口同时做输入和输出。 inout在具体实现上一般用三态门来实现。三态门的第三个状态就是高阻'Z'。 当inout端口不输出时,将三态门置高阻。这样信号就不会因为两端同时输出而出错了,更详细的内容可以搜索一下三态门tri-state的资料.

  1 使用inout类型数据,可以用如下写法:

  inout data_inout;

  input data_in;

  reg data_reg;//data_inout的映象寄存器

  reg link_data;

  assign data_inout=link_data?data_reg:1’bz;//link_data控制三态门

  //对于data_reg,可以通过组合逻辑或者时序逻辑根据data_in对其赋值.通过控制link_data的高低电平,从而设置data_inout是输出数据还是处于高阻态,如果处于高阻态,则此时当作输入端口使用.link_data可以通过相关电路来控制.

  2 编写测试模块时,对于inout类型的端口,需要定义成wire类型变量,而其它输入端口都定义成reg类型,这两者是有区别的.

  当上面例子中的data_inout用作输入时,需要赋值给data_inout,其余情况可以断开.此时可以用assign语句实现:assign data_inout=link?data_in_t:1’bz;其中的link ,data_in_t是reg类型变量,在测试模块中赋值.

  另外,可以设置一个输出端口观察data_inout用作输出的情况:

  Wire data_out;

  Assign data_out_t=(!link)?data_inout:1’bz;

  else,in RTL

  inout use in top module(PAD)

  dont use inout(tri) in sub module

  也就是说,在内部模块最好不要出现inout,如果确实需要,那么用两个port实现,到顶层的时候再用三态实现。理由是:在非顶层模块用双向口的话,该双向口必然有它的上层跟它相连。既然是双向口,则上层至少有一个输入口和一个输出口联到该双向口上,则发生两个内部输出单元连接到一起的情况出现,这样在综合时往往会出错。

  ************************************************** ***

  双向端口inout设计实例:

  module dual_port (

  ....

  inout_pin,

  ....

  );

  inout inout_pin;

  wire inout_pin;

  wire input_of_inout;

  wire output_of_inout;

  wire out_en;

  assign input_of_inout = inout_pin;

  assign inout_pin = out_en ? output_of_inout : 高阻;

  endmodule

  ************************************************** *******

  对于含有inout端口的模块内部而言, inout端口可以理解成从“映像寄存器” 接收连续赋值的线。在定义一个inout端口时,同时也要定义一个寄存器作为inout端口的“ 映像寄存器”,并将inout端口和这个“ 映像寄存器” 用一个三态门连接起来。当inout端口用作输出端口时,将inout端口的“ 映像寄存器” 设置成所希望的输出值,并且将三态门选通,这时inout端口的值随“ 映像寄存器”的变化而变化;当inout端口用作输入端口时,三态门设为高阻态, 断开“ 映像寄存器” 与inout端口的连接,此时就可以像对待普通的输入端口一样对它进行操作。

  而对于含有inout端口的模块外部而言,需要指定当它作为输入端口时,其数据的来源,以及当它作为输出端口时其数据的归属。

  对于有inout( 双向) 端口的Verilog程序设计,要注意以下几点:

  ( 1 ) 对于inout端口,要定义一个与之相连的“ 映像寄存器”。当inout端口作为输出端口时, 将二者连通; 而当inout端口不作为输出端口时,要给inout端口赋高阻态来断开与“ 映像寄存器”的连接。

  ( 2 ) 在实例化含inout( 双向)端口的模块时,与inout端口相连的只能是一个wire类型的变量

  ( 3 ) 不论是模块设计还是仿真,由于inout端口兼有输人端口和输出端口的功能,所以必须分别指定当inout端口作为输入(输出)端口时,它与其它单元的连接情况和需要完成的操作。

  (4)注意在仿真时,测试模块与被测模块之间双向接口的数据方向。测试模块的一个wire变量,必须在被测模块为输出时为'Z',而在测试模块为输入(此时其输出为'Z')时有数据输出。

http://blog.chinaaet.com/zzuxzt/p/39832

http://www.doc88.com/p-9327122453904.html

I2C三态门Verilog的更多相关文章

  1. Verification of WISHBONE I2C Master Core(IRUN+Simvision)

    一.前言 很久没写技术博客了,有些懈怠,生活还得继续折腾.转眼工作一年多,时间越长越发觉得自己知之甚少,当然这跟IC行业技术密集有关.用空余时间在opencores网站上下载些小的IP看看 验证下,让 ...

  2. Verilog之i2c合约

    说明:i2c乔布斯.有这么多的事情在网上参考. 时刻:2014年5一个月6周二星期 1.问题叙述性说明: 正如图.已知的时钟clk为100k,rst为复位信号.上升沿有效,基于Verilog HDL或 ...

  3. i2c状态机方法设计-verilog

    2010-09-05 21:04:00 verilog语言基础学的差不多了.接着就是看看华为的语言编写规范.状态机设计方法是fpga的重要设计方法.所以我要记上一笔. 只要会FSM方法,用fpga编写 ...

  4. 学习笔记一:I2C协议学习和Verilog实现

    ////////////////////////////////////////////////// //clk = 20 MHz ,一个周期50ns //sck = 100 kHz (scl) ,一 ...

  5. I2C控制器的Verilog建模之三(完结版)

    前言:终于到了测试篇,不过悲剧了一下.按照之前<二>里面的思路,在顶层用一个复用器驱动读写独立模块的I2C总线确实失败.虽然综合过去了,不过警告里已经说明:底层的2个原本是inout三态口 ...

  6. I2C控制器的Verilog建模之二

    前言:接着上一篇的I2C写操作,今天要实现一个I2C的读操作.虽然在ADV7181B配置内部寄存器时没有必要使用到读操作,但是为了进一步确认寄存器是否在I2C写模块下被正确配置,这一步是必不可少的. ...

  7. I2C控制器的Verilog建模之一

    前言:之前申请了ADI公司的一款ADV7181CBSTZ的视频解码芯片,正好原装DE2板子安的是同系列的ADV7181BBSTZ.虽然都是ADV7181的宗出,但是寄存器配置等等还是有些诧异,引脚也不 ...

  8. I2C Verilog的实现(二)

    1. 起始结束信号的判断 //--------------------------------------------- //start,stop condition judgement //---- ...

  9. I2C Verilog的实现(一)

    <span style="font-size:14px;">`timescale 1ns / 1ps module test( sda ); reg scl; inou ...

随机推荐

  1. (转)解决 bitmap size exceeds VM budget (Out Of Memory 内存溢出)的问题

    在做图片处理的时候最常遇到的问题估计就是Out Of Memory (内存溢出)了 网上对这种问题的解决方案很多,原来无非就是压缩图片大小 本不该重复造轮子,但实际中却遇见了问题,写出来希望后来者能引 ...

  2. 使用mysql 统计函数 结果为null时返回值改为0

    SELECT COALESCE(SUM(total),0)  FROM test_table

  3. Openerp 7 view画面编辑/创建/删除/复制功能控制

    OpenERP 7.0中,Tree或Form画面上可以添加属性create edit delete,用于控制Create.Delete.Edit.Duplicate功能是否显现.如下例:<for ...

  4. 【转】javascript中值传递,地址传递,引用传递的问题(使用js创建list对象时会用到)

    function initEditModal_SI(node) { if (node.siArray == undefined) { node.siArray = new Object(); } va ...

  5. oracle 插入表数据的4种方式

      1.往表中插入一整行数据 /*方法一*/ INSERT INTO 表名 VALUES(val1,val2,val3,...); /*方法二*/ '; 如: ,, FROM DUAL; 注意: 2. ...

  6. servlet Servlet例子

    Servlet是sun公司提供的一门用于开发动态web资源的技术.   Sun公司在其API中提供了一个servlet接口(参看J2EE API文档),用户若想使用Java程序开发一个动态web资源, ...

  7. servlet 转发和超链接转发

    超链接属于客户端跳转,request是无法取得属性的 我们知道一个jsp相当与一个servlet 例如,客户端请求A.jsp页面,在A.jsp页面调用request.getAttribute方法放入属 ...

  8. PLSQL连接ORACLE配置字符串简介 oracle网络配置 三个配置文件 listener.ora、sqlnet.ora、tnsnames.ora原理解释

    PLSQL连接ORACLE配置字符串简介 oracle网络配置 三个配置文件 listener.ora.sqlnet.ora.tnsnames.ora原理解释 oracle网络配置三个配置文件 lis ...

  9. 微软解决方案框架 - MSF的团队模型、MSF的开发模型,关于SA系统分析师信息的一篇好帖子

    msf中的开发模型 书中关于六个小组的人员的案例: MSF 组队模型 v. 3.1-http://bbs.51cto.com/thread-1171-1.html 微软解决方案框架 - MSF的团队模 ...

  10. POJ 1364 King (差分约束)

    King Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8660   Accepted: 3263 Description ...