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建模方式如下所示
testbench如下:
3. 双向信号
在芯片验证的过程中,有时候会遇到双向信号(既能作为输出,也能作为输入的信号叫双向信号)。比如,IIC总线中的SDA信号就是一个双向信号,QSPI Flash的四线操作的时候四根信号线均为双向信号。在Verilog中用关键字inout定义双向信号。
如下图所示,双向信号的本质是由一个三态门组成的,三态门可以输出高电平、低电平和高阻态三种状态,其结构大致如下图所示:
描述这个逻辑的Verilog代码如下:
当Control为1时,IO_data为输出,输出I_data_in的值
当Control为0时,IO_data为输入,把输入的信号赋值给O_data_out。