 
- UID
- 1029342
- 性别
- 男
|

我们在使用inout端口的时候,需要注意很多问题。笔者也在这上面花了不少时间,最终,笔者成功使用双端口。例子如本站的温度传感器的程序。对于inout端口,我一开始也不会,然后百度谷歌,收到一些资料,但是呢,我觉得资料都挺让人费解的。看了好几个都不会,然后还是决定自己写,其中,老是会出错。然后,我突发奇想,在Quartus II软件中不是有个人原理图输入吗?我直接用三态门等自己建立一个模型,然后在让它输出对应的文本文件,然后再查看它是怎么写的,然后就知道如何对三态门配置。
首先我在Quartus II中建一个原理图bdf文件,然后放置端口之类的,如下图:

然后编译,编译完成之后,再回到原理图输入界面(不在原理图输入界面,create/update会变成灰色,不能使用),然后file-->create/update-->creat hdl design file for current file,然后选择verilog(如果你用VHDL,那就选择VHDL),然后可以打开查看这个文件,我的文件如下:
module inout_test(
out,
data_out,
data_in,
data_io
);
input out;
input data_out;
output data_in;
inout data_io;
assign data_in = data_io;
assign data_io = out ? data_out : 1'bz;
endmodule
然后可以看到,out为输出使能,若为1,则输出data_out数据,否则,对外部呈现高阻状态,也就是等待外部改变这个状态,此时,data_in接受的数据就是外部电路给FPGA的数据。如果还是不是很明白,看看上面的原理图,应该是一目了然了。
接下来就是对inout端口的仿真:
我写的数据就是,当dq_en=1时,也就是三态门的使能端有效,dq就作为输出端,dq就等于data_out的数据,当dq_en=0时,dq作为输入端,它的数据就是data_in的数据。
而我对data_out的数据直接赋值为高电平1,而我在testbench中写的外部给dq端的数据为0,也就是说,dq的数据在dq_en为1时,取值为data_out的数值,也就是1;在dq_en为0时,取值为data_in的数值,也就是0,也就是,dq的值和dq_en的值是相同的。以下是波形图:

testbench文件:
module inout_tb;
reg rst_n;
reg clk;
reg dq_en;
wire dq;
always #10 clk = ~clk;
assign dq = dq_en?1'bz:1'b0;
initial
begin
clk = 1;
rst_n = 0;
#120 rst_n = 1;
dq_en=1;
repeat(100)
begin
#20 dq_en=1;
#20 dq_en=0;
#20 dq_en=1;
#20 dq_en=1;
#20 dq_en=0;
end
end
inaout int(clk,rst_n,dq,dq_en);
endmodule |
|