除了输入输出端口,FPGA中还有另外一种端口叫作inout端口。若是须要进行全双工通讯,是须要两条信道的,也就是说须要使用两个FPGA管脚和外部器件链接。可是,有时候半双工通讯就能知足咱们的要求,理论上来讲只须要一条信道就足够了,而FPGA上实现这一功能的管脚就是inout端口。管脚相连时,input对应output,所以inout只能和inout链接(不然就不是inout了)。本文将概述FPGA的inout端口。ide
三态门,故名思议就是这个期间具备三种状态。对于数字电路来讲,三种状态是高电平、低电平和高阻态。Xilinx的《XST User Guide》上给出了三态门的Verilog HDL(以及VHDL)的描述,具体以下:ui
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端口实现的基础。spa
三态门中有一个状态是高阻。高阻,便可以认为是没有输出,做为输出端口而言,对下级电路没有任何影响。悬空是针对输入端口来讲的,也就是说没有接输入。这也就意味着,实际上高阻和悬空是一个状态,在HDL语言里都表示为Z。code
也就是说,一个输出端口在高阻态的时候,其状态是因为其相连的其余电路决定的,能够将其看做是输入。blog
从上一节内容中能够看出,当三态门的输出处于高阻状态的时候,取值由外部电路决定,也就是说,这一时刻是能够做为输入。INOUT端口的描述和示意图以下three
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
若是两个INOUT都处于高阻态,那么接收到的信号究竟是什么状态呢?这实际上等效为两个INPUT端口链接,也就等效为INPUT端口悬空。 ip
这应该是取决于外围的驱动,添加的上拉或者下拉电阻,通常而言,FPGA添加的是上拉电阻,也就意味着此时chipscope采集的数据是高电平.get
FPGA管脚内部能够配置弱上拉或下拉电阻来实现Z状态下的控制。分别采用PULL UP和PULL DOWN约束实现,UCF、NCF语法以下input
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.
这一部份内容有待进一步验证。it