双向端口是通过控制三态门来实现的,如附件所示。当z=0时,上面输出的管子打开,此时数据可以从上面的通道输出,这样双向端口就可以作为输出口,当z=1时,上面的管子被置为高阻态,数据就不能从上面的通道输出,此时数据只可以从下面的通道由外向内输入,这样的双向端口就是输入口。
根据Veriolg HDL语法,I/O端口可以分为三类:输入端口 input,输出端口output,以及双向端口inout。input端口不能被定义成寄存器变量,只能是线网型,output端口信号可定义成寄存器变量,并在always块内可以被赋值使用;而inout型双向端口信号不能被定义成reg型变量,只能采用assign赋值语句,不能在always块内使用,这一点与VHDL中双向端口的使用方法不同。
双向端口的语法为:
inout[7:0] a;
input [7:0] b;
input z;
assign a = (z) ? b:8'bz;
eg.使用Verilog实现一个位宽为16位bit的数据选择器。当控制信号为z=1时,将输入数据从双向端口输出,当控制信号z=0时,将双向端口数据从输出端口输出。
module bidirec_data (clk,z,din,dinout,dout);
input clk,z;
input[15:0] din;
inout [15:0] dinout;
output [15:0] dout;
reg [15:0] dout, din_t;
assign dinout = (z)? din_t: 16'bz;
always @ (posedge clk) begin
if(z) din_t <= din;
else dout <= dinout;
end
endmodule