最近在把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信號控制。高低電平大家都了解了,注重看看高阻態。百度解釋為:
讀完這段話,總結出以下信息:
1)高阻態對下級電路無任何影響,即高阻態不能作為輸入了。
2)高阻態是高電平還是低電平是由它后面接的東西定,那說明它能被接,也即可以作為input端口。
那理解完畢,來看看inout端口的應用吧。代碼選自ad9361 no-os HDL,為ADI工程師編寫
//代碼選自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,此時為inout端口為output屬性;
當dio_t為低電平時,dio_p為高阻態,剛才分析過了,高阻態是高電平還是低電平由后面接的東西定,dio_p可以被外界驅動,視為input端口,也即dio_o會輸出dio_p輸入的值。