三态指其输出既可以是一般二值逻辑电路的正常的高电平(逻辑1)或低电平(逻辑0),又可以保持特有的高阻抗状态(Hi-Z)。处于高阻抗状态时,输出电阻很大,相当于开路,没有任何逻辑控制功能。高阻态的意义在于实际电路中不可能断开电路。三态电路的输出逻辑状态的控制,是通过一个输入引脚 实现的
在之前的实验中,我们所接触到的 IO 都是单纯的输入( input) 或者输出(output)类型,而我们的一些总线协议如 IIC 等,要求信号为三态类型,也就是我们所说的输入输出( inout) 类型。接下来,我们就来看一下这类信号的具体用法,输入输出类型,顾名思义就是既可以作为输入,也可以作为输出
我们可以通过如下代码学习这类信号的赋值驱动方式
代码:
modulestate_3(clk,rst_n,sda);inputclk,rst_n;inoutsda;regflag;//三态门开关regsda_buf;//待发送数据寄存器assignsda=(flag==1)?sda_buf:1'bz;always@(posedgeclkornegedgerst_n)if(!rst_n)beginflag<=0;sda_buf<=1;endelsebeginflag<=1;endendmodule`timescale1ns/1ns`defineclock_period20modulestate_3_tb;regclk,rst_n;wiresda;initialclk=1;always#(`clock_period/2)clk=~clk;initialbeginrst_n=1'b0;#(`clock_period*5)rst_n=1'b1;#(`clock_period+1);#(`clock_period*200);$stop;endstate_3state_3(.clk(clk),.rst_n(rst_n),.sda(sda));endmodule
rtl:
仿真:
典型的三态门应用:
如果你的设备端口要挂在一个总线上, 必须通过三态缓冲器。 因为在一个总线上同时只能有一个端口作输出, 这时其他端口必须在高阻态, 同时可以输入这个输出端口的数据。 所以你还需要有总线控制管理, 访问到哪个端口, 那个端口的三态缓冲器才可以转入输出状态。