1. 程式人生 > 其它 >FPGA設計——inout埠

FPGA設計——inout埠

最近在把zedboard的專案工程搬到效能更好的器件上,除了改zynq核和相應管教外,還需要改幾個inout埠和差分LVDS埠。本篇便對inout埠做一個小結。

FPGA設計中,大家常用的一般時input和output埠,且在vivado中預設為wire型。而inout埠,正如其名,即可以做輸入,也可以做輸出埠。其基礎是一個三態門構建,由一個控制訊號控制輸入和輸出。

用verilog描述為:

module three_state(
           din,
           ctr,
           dout        
);
input din,ctr;
ouput dout;

assign dout = (ctr)?1'bz:din; endmodule
三態門表示存在高電平,低電平和高阻態三種狀態,由control訊號控制。也即inout埠(三態門)可以輸出三種狀態。當輸出為高阻態時,可認為輸出懸空,對下一級輸入沒有影響,或者說對接的下一級輸入懸空(沒有輸入)。但是值得注意的是,上句話只是表明埠output屬性是懸空的,其input屬性還存在,可作為input埠來控制inout模組內部。 但是inout是如何在control的控制下切換輸入輸出的呢?先看看下面的程式碼。
//程式碼選自ad9361 no-os HDL,為ADI工程師編寫
module
ad_iobuf ( dio_t, dio_i, dio_o, dio_p);
parameter DATA_WIDTH = 1; input [(DATA_WIDTH-1):0] dio_t; input [(DATA_WIDTH-1):0] dio_i; output [(DATA_WIDTH-1):0] dio_o; inout [(DATA_WIDTH-1):0] dio_p; genvar n; generate for (n = 0; n < DATA_WIDTH; n = n + 1) begin: g_iobuf assign dio_o[n] = dio_p[n]; assign dio_p[n] = (dio_t[n] == 1
'b1) ? 1'bz : dio_i[n]; end endgenerate endmodule
含義
dio_t 視為control
dio_i 視為din
dio_o 視為dout
dio_p 主角,控制埠方向

各埠含義如上表所示,該段程式碼含義為如果dio_t為高電平,dio_p=輸入dio_i;也即dio_o = dio_i,此時為output屬性;

當dio_t為低電平時,dio_p為高阻態,只有輸入埠暢通,此時為input屬性;注意了,此時output已經全為高阻態了,但是!inout埠,out雖然被阻了,in還是能用呀,dio_p可以被外界驅動,當成input埠,也即dio_o繼續輸出dio_p輸入的值。