zoukankan      html  css  js  c++  java
  • I2C三态门Verilog

    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

  • 相关阅读:
    Python正则表达式指南(转)
    二进制文件与文本文件的区分(转)
    Linux上的下载软件uGet
    Ubuntu 12.04安装Google Chrome(转)
    单元测试中的黑盒测试的重要性(转)
    尾递归(转)
    chrome使用技巧(转)
    LRU算法的Python实现
    MySQL单列索引和组合索引的区别介绍(转)
    Python性能优化(转)
  • 原文地址:https://www.cnblogs.com/chengqi521/p/6513312.html
Copyright © 2011-2022 走看看