三态指其输出既可以是一般二值逻辑电路的正常的高电平(逻辑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)begin
flag<=0;
sda_buf<=1;
end
elsebegin
flag<=1;
end
endmodule
`timescale1ns/1ns
`defineclock_period20
modulestate_3_tb;
regclk,rst_n;
wiresda;
initialclk=1;
always#(`clock_period/2)clk=~clk;
initialbegin
rst_n=1'b0;
#(`clock_period*5)
rst_n=1'b1;
#(`clock_period+1);
#(`clock_period*200);
$stop;
end
state_3state_3(.clk(clk),.rst_n(rst_n),.sda(sda));
endmodule
rtl:
仿真:
典型的三态门应用:
如果你的设备端口要挂在一个总线上, 必须通过三态缓冲器。 因为在一个总线上同时只能有一个端口作输出, 这时其他端口必须在高阻态, 同时可以输入这个输出端口的数据。 所以你还需要有总线控制管理, 访问到哪个端口, 那个端口的三态缓冲器才可以转入输出状态。