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信號控制。高低電平大家都了解了,注重看看高阻態。百度解釋為:
高阻態是一個數字電路里常見的術語,指的是電路的一種輸出狀態,既不是高電平也不是低電平,如果高阻態再輸入下一級電路的話,對下級電路無任何影響,和沒接一樣,如果用萬用表測的話有可能是高電平也有可能是低電平隨它后面接的東西定的。
讀完這段話,總結出以下信息:
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輸入的值。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM