Verilog中的三态门与双向信号详解

电子说

1.2w人已加入

描述

1.前言

在数字电路中,逻辑输出有两个正常态:低电平状态(对应逻辑0)和高电平状态(对应逻辑1)。此外,电路还有不属于0和1状态的高阻态,高阻态常用字母 Z 表示。

高阻态可做开路理解。可以把它看作输出(输入)电阻非常大,它的极限状态可以认为悬空(开路)。也就是说理论上高阻态不是悬空,它是对地或对电源电阻极大的状态。而实际应用上与引脚的悬空几乎是一样的。或者可以理解为输出与电路是断开的。高阻抗状态将器件与电路的其余部分电路隔离。高阻态时引脚对地电阻无穷,此时读引脚电平就可以读到真实的电平值。高阻态的重要作用就是I/O口在用作输入(input)时读入外部电平。

一般门与其它电路的连接,无非是两种状态,0或者1,在比较复杂的系统中,为了能在一条传输线上传送不同的信号,研制了相应的逻辑器件称为三态门。三态门是一种控制开关。

三态门主要是用于总线的连接,因为总线只允许同时只有一个器件使用。通常在数据总线上接有多个器件,每个器件通过OE/CE之类的信号选通。如果器件没有选通的话它就处于高阻态,相当于没有接在总线上,不影响其它器件的工作。三态逻辑门允许许多设备连接到相同的数据线上,例如数据和地址总线。然而,任何时候只有一个设备“连接”,所有其他设备都处于高阻抗状态,因此电气断开。

双向信号本质上是由一个三态门组成,具体细节参见后面的描述。

2. 三态门

2.1示意图、真值表

Verilog中有四个元件模型来表示三态门电路,分别是bufif1,bufif0,notif1,notif0。三态门的示意图、真值表分别如下图所示:

逻辑器件

逻辑器件

逻辑器件

2.2 三态门结构

三态门电路的输出结构和普通门电路的输出结构有很大的不同,因为它在电路中增加了一个输出控制端。

2.2.1 单向三态门

单向三态门的结构示意图如下:

逻辑器件

由上图看出,在单向三态门中,当E为高电平时,B与A相连,数据流向是A-->B;而当E为低电平时,B的输出为高阻态,相当于B侧电路与A侧电路之间的连线断开,此时可以从外部向B驱动信号,实现相反方向的数据流向(B-->A)。

2.2.1 双向三态门

当信号线存在双向IO时,可以有两个三态门来控制,一个控制输出,一个控制输入,双向三态门的结构示意图如下:

逻辑器件

当E1=1,E2=0时,双向三态门的电路传输方向是 A -> B;
当E1=0,E2=1时,双向三态门的电路传输方向是 B -> A;

2.3 三态门建模

三态门的RTL建模方式如下所示

 

//Tristate Buffer
module tristate_buffer(input_x, enable, output_x);
input input_x;
input enable;
output output_x;


assign output_x = enable? input_x : 'bz;


endmodule

 

testbench如下:

 

module tb();   
reg r_in_x;   
reg w_enable;  
wire w_output_x;


initial begin $display("----------------------
Tri-State Buffer
----------------------
"); 
$monitor("input_x = %b, enable = %b, output_x = %b", r_in_x, w_enable, w_output_x); 
// Generation of stimulus
r_in_x = 0; w_enable= 0;       
# 10  r_in_x = 0;# 10  r_in_x = 1; 
# 10  w_enable = 1; 
# 10  r_in_x = 1; 
# 10  r_in_x = 0; 
end


// Tri-state buffer instantiation
tristate_buffer u_tristate_buffer( 
  .input_x (r_in_x), 
  .enable  (w_enable),  
  .output_x (w_output_x));
endmodule
 

 

仿真结果

逻辑器件

3. 双向信号

在芯片验证的过程中,有时候会遇到双向信号(既能作为输出,也能作为输入的信号叫双向信号)。比如,IIC总线中的SDA信号就是一个双向信号,QSPI Flash的四线操作的时候四根信号线均为双向信号。在Verilog中用关键字inout定义双向信号。

如下图所示,双向信号的本质是由一个三态门组成的,三态门可以输出高电平、低电平和高阻态三种状态,其结构大致如下图所示:

逻辑器件

描述这个逻辑的Verilog代码如下:

 

module inout_top
(
input       I_data_in        ,
inout       IO_data          ,
output     O_data_out     ,
input       Control
);


assign IO_data = Control ? I_data_in : 1‘bz ;
assign O_data_out = IO_data ;


endmodule    

 


当Control为1时,IO_data为输出,输出I_data_in的值

当Control为0时,IO_data为输入,把输入的信号赋值给O_data_out。

  审核编辑:汤梓红

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分