三态信号
在实际的系统中,为了减少器件的管脚,降低芯片制造成本,工业标准总线中很多信号线都采用了复用的方式:只有获得总线使用权的设备才能驱动信号,而没有获得总线使用权的设备则不能够驱动信号。为了防止总线的冲突,为获取总线使用权的设备应该将输出信号置为三态,相当于总线断开。这种输出端口便是带三态的输出端口。
人们常说的“输出三态”,并不是指信号的输出除了0和1以外还有第三种状态(数字信号只有0和1),而是指芯片内外断开,互不影响。若总线上所有驱动源均停止驱动而且无上拉电阻或者下拉电阻,则总线悬空,总线对地相当于一个电容:如果关闭总线之前的输出为高电平,则用示波器测量可以观察到电容放电的现象(总线残留电荷流入地);如果关闭总线之前的输出为低电平,则用示波器观察。总线一直处于低电平。如果总线有上拉或者下拉电阻,则可以很快的被上拉到高电平或者下拉到低电平,从而避免总线因电容缓慢放电而处于电平漂浮不定的情况。
三态端口建模
module test
(
input open_enable,
input trdy_n,
output trdy_n_xz
);
assign trdy_n_xz = open_enable?trdy_n:1'bz;
endmodule
在当前主流的FPGA结构中,除了I/O端口外,一般不支持内部三态,因此只有对应芯片管脚的端口才能定义成三态;内部三态除了将被综合工具忽略,为了保证设计的可靠性,不建议使用内部三态信号。
由于FPGA器件内部没有支持三态信号的电路,这就意味着,FPGA内部不允许对同一个信号有多个驱动源,佛则,一个驱动源输出为高电平而其他驱动源输出为低电平时将可能导致短路。
同样,为了减少引脚,许多工业总线标准中的数据总线采样了复用的方式,也就是说,输入输出在物理上是一个管脚,为了避免输出和输入的冲突,双向口采用了使能信号对输出进行控制。
双向端口建模:
module test(inner_port,out_en,outer_port);
input out_en;
inout inner_port;
inout outer_port;
assign outer_port=(out_en==1)?inner_port:1'bz;
assign inner_port=(out_en==0)?outer_port:1'bz;
endmodule
module bid
#(parameter WIDTH = 1)
(
input clk,
input sel,
input [WIDTH-1:0] din,
inout [WIDTH-1:0] dinout,
output reg [WIDTH-1:0] dout
);
reg [WIDTH-1:0] din_t;
assign dinout = (!sel)?din_t:1'bz;
always @ (posedge clk)
begin
if(!sel)
din_t <= din;
else
dout <= dinout;
end
endmodule
真0无双对三态电路的讨论http://www.cnblogs.com/oomusou/archive/2011/02/21/inout_port.html