http://www.blogbus.com/uyarotxb-logs/206932748.html inout作為輸出端口時三態門為選通狀態,inout作為輸入端口時三態門為高阻態,可通過link_data控制使能。
芯片外部引腳很多都使用inout類型的,為的是節省管腿。一般信號線用做總線等雙向數據傳輸的時候就要用到INOUT類型了。就是一個端口同時做輸入和輸出。 inout在具體實現上一般用三態門來實現。三態門的第三個狀態就是高阻'Z'。 當inout端口不輸出時,將三態門置高阻。這樣信號就不會因為兩端同時輸出而出錯了,更詳細的內容可以搜索一下三態門tri-state的資料.
1 使用inout類型數據,可以用如下寫法:
inout data_inout;
input data_in;
reg data_reg;//data_inout的映象寄存器
reg link_data;
assign data_inout=link_data?data_reg:1’bz;//link_data控制三態門
//對於data_reg,可以通過組合邏輯或者時序邏輯根據data_in對其賦值.通過控制link_data的高低電平,從而設置data_inout是輸出數據還是處於高阻態,如果處於高阻態,則此時當作輸入端口使用.link_data可以通過相關電路來控制.
2 編寫測試模塊時,對於inout類型的端口,需要定義成wire類型變量,而其它輸入端口都定義成reg類型,這兩者是有區別的.
當上面例子中的data_inout用作輸入時,需要賦值給data_inout,其余情況可以斷開.此時可以用assign語句實現:assign data_inout=link?data_in_t:1’bz;其中的link ,data_in_t是reg類型變量,在測試模塊中賦值.
另外,可以設置一個輸出端口觀察data_inout用作輸出的情況:
Wire data_out;
Assign data_out_t=(!link)?data_inout:1’bz;
else,in RTL
inout use in top module(PAD)
dont use inout(tri) in sub module
也就是說,在內部模塊最好不要出現inout,如果確實需要,那么用兩個port實現,到頂層的時候再用三態實現。理由是:在非頂層模塊用雙向口的話,該雙向口必然有它的上層跟它相連。既然是雙向口,則上層至少有一個輸入口和一個輸出口聯到該雙向口上,則發生兩個內部輸出單元連接到一起的情況出現,這樣在綜合時往往會出錯。
************************************************** ***
雙向端口inout設計實例:
module dual_port (
....
inout_pin,
....
);
inout inout_pin;
wire inout_pin;
wire input_of_inout;
wire output_of_inout;
wire out_en;
assign input_of_inout = inout_pin;
assign inout_pin = out_en ? output_of_inout : 高阻;
endmodule
************************************************** *******
對於含有inout端口的模塊內部而言, inout端口可以理解成從“映像寄存器” 接收連續賦值的線。在定義一個inout端口時,同時也要定義一個寄存器作為inout端口的“ 映像寄存器”,並將inout端口和這個“ 映像寄存器” 用一個三態門連接起來。當inout端口用作輸出端口時,將inout端口的“ 映像寄存器” 設置成所希望的輸出值,並且將三態門選通,這時inout端口的值隨“ 映像寄存器”的變化而變化;當inout端口用作輸入端口時,三態門設為高阻態, 斷開“ 映像寄存器” 與inout端口的連接,此時就可以像對待普通的輸入端口一樣對它進行操作。
而對於含有inout端口的模塊外部而言,需要指定當它作為輸入端口時,其數據的來源,以及當它作為輸出端口時其數據的歸屬。
對於有inout( 雙向) 端口的Verilog程序設計,要注意以下幾點:
( 1 ) 對於inout端口,要定義一個與之相連的“ 映像寄存器”。當inout端口作為輸出端口時, 將二者連通; 而當inout端口不作為輸出端口時,要給inout端口賦高阻態來斷開與“ 映像寄存器”的連接。
( 2 ) 在實例化含inout( 雙向)端口的模塊時,與inout端口相連的只能是一個wire類型的變量
( 3 ) 不論是模塊設計還是仿真,由於inout端口兼有輸人端口和輸出端口的功能,所以必須分別指定當inout端口作為輸入(輸出)端口時,它與其它單元的連接情況和需要完成的操作。
(4)注意在仿真時,測試模塊與被測模塊之間雙向接口的數據方向。測試模塊的一個wire變量,必須在被測模塊為輸出時為'Z',而在測試模塊為輸入(此時其輸出為'Z')時有數據輸出。
http://blog.chinaaet.com/zzuxzt/p/39832
http://www.doc88.com/p-9327122453904.html