FPGA設計——inout埠
阿新 • • 發佈:2021-10-11
最近在把zedboard的專案工程搬到效能更好的器件上,除了改zynq核和相應管教外,還需要改幾個inout埠和差分LVDS埠。本篇便對inout埠做一個小結。
FPGA設計中,大家常用的一般時input和output埠,且在vivado中預設為wire型。而inout埠,正如其名,即可以做輸入,也可以做輸出埠。其基礎是一個三態門構建,由一個控制訊號控制輸入和輸出。
用verilog描述為:
module three_state( din, ctr, dout ); input din,ctr; ouput dout;三態門表示存在高電平,低電平和高阻態三種狀態,由control訊號控制。也即inout埠(三態門)可以輸出三種狀態。當輸出為高阻態時,可認為輸出懸空,對下一級輸入沒有影響,或者說對接的下一級輸入懸空(沒有輸入)。但是值得注意的是,上句話只是表明埠output屬性是懸空的,其input屬性還存在,可作為input埠來控制inout模組內部。 但是inout是如何在control的控制下切換輸入輸出的呢?先看看下面的程式碼。assign dout = (ctr)?1'bz:din; endmodule
//程式碼選自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輸入的值。