inout DAT1,
inout DAT2,
inout DAT3,
reg DAT0_out;
reg DAT1_out;
reg DAT2_out;
reg DAT3_out;
reg DAT0_in;
reg DAT1_in;
reg DAT2_in;
reg DAT3_in;
assign {DAT0,DAT1,DAT2,DAT3} = (dat_out_en) ? {DAT0_out,DAT1_out,DAT2_out,DAT3_out}:{1'bz,1'bz,1'bz,1'bz};
always @( DAT0 or DAT1 or DAT2 or DAT3)begin
if(!dat_out_en)
{DAT0_in,DAT1_in,DAT2_in,DAT3_in} <= {{DAT0,DAT1,DAT2,DAT3}};
end
FPGA中设定一个信号为三态门,在Verilog中,就是设定该信号的类型为inout。通常用在总线接口中,因为在一个总线上同时只能有一个设备端口作输出,这时其他端口必须在高阻态,同时可以输入这个输出端口的数据。所以,设备端口要挂在一个总线上,必须通过三态缓冲器。
NOTE:fpga代码设计中,记得有一条“原则”,对于三态口,尽量在顶层模块使用三态,不要在内部子模块使用三态,不然会带来一系列问题。因此最好在芯片顶层就把三态数据总线分成两根,内部就不再使用三态门了。