FPGA中的INOUT接口和高阻态

除了输入输出端口,FPGA中还有另一种端口叫做inout端口。如果需要进行全双工通信,是需要两条信道的,也就是说需要使用两个FPGA管脚和外部器件连接。但是,有时候半双工通信就能满足我们的要求,理论上来说只需要一条信道就足够了,而FPGA上实现这一功能的管脚就是inout端口。管脚相连时,input对应output,因此inout只能和inout连接(否则就不是inout了)。本文将概述FPGA的inout端口。

1. 三态门

    三态门,故名思议就是这个期间具有三种状态。对于数字电路来说,三种状态是高电平、低电平和高阻态。Xilinx的《XST User Guide》上给出了三态门的Verilog HDL(以及VHDL)的描述,具体如下:

FPGA中的INOUT接口和高阻态_第1张图片

 1 // Tristate Description Using Concurrent Assignment
 2 
 3 // Combinatorial Always Block Can be Used too.
 4 
 5 module v_three_st_2 (T, I, O);
 6 
 7     input T, I;
 8 
 9     output O;
10 
11     assign O = (~T) ? I: 1’bZ;
12 
13 endmodule

   三态门意味着,输出端口除了输出高、低电平之外还可以有第三种状态,这是inout端口实现的基础。

2. 高阻和悬空

    三态门中有一个状态是高阻。高阻,即可以认为是没有输出,作为输出端口而言,对下级电路没有任何影响。悬空是针对输入端口来说的,也就是说没有接输入。这也就意味着,实际上高阻和悬空是一个状态,在HDL语言里都表示为Z。

    也就是说,一个输出端口在高阻态的时候,其状态是由于其相连的其他电路决定的,可以将其看作是输入。

3. INOUT

    从上一节内容中可以看出,当三态门的输出处于高阻状态的时候,取值由外部电路决定,也就是说,这一时刻是可以作为输入。INOUT端口的描述和示意图如下

 1 module inout_def(clk,data_inout)
 2 input clk;
 3 inout data_inout;
 4 reg data_out; 
 5 reg data_out_control; 
 6 //define data_out
 7 
 8 //define data_out_control
 9 
10 //assign data_inout 
11 assign data_inout=data_out_control?data_out:1'bz;  
12 
13 //assign data_in
14 wire data_in;
15 assign data_in=(!data_out_control)&data_inout;
16 
17 endmodule

 

FPGA中的INOUT接口和高阻态_第2张图片

4. PULLUP和PULLDOWN

    如果两个INOUT都处于高阻态,那么接收到的信号到底是什么状态呢?这实际上等效为两个INPUT端口连接,也就等效为INPUT端口悬空。    

    这应该是取决于外围的驱动,添加的上拉或者下拉电阻,一般而言,FPGA添加的是上拉电阻,也就意味着此时chipscope采集的数据是高电平.

    FPGA管脚内部可以配置弱上拉或下拉电阻来实现Z状态下的控制。分别采用PULL UP和PULL DOWN约束实现,UCF、NCF语法如下

1      NET "pad_net_name" PULLUP;
2 
3     //Configures the I/O to use a Pullup constraint.
4 
5      DEFAULT PULLUP = TRUE;
6 
7     //Configures the Pullup constraint to be used globally.

    这一部分内容有待进一步验证。

你可能感兴趣的:(FPGA中的INOUT接口和高阻态)