首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

inout 双端口三态门的使用

inout 双端口三态门的使用

我们在使用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
继承事业,薪火相传
返回列表