除了輸入輸出端口,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