close

晶片外部引腳很多都使用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實現,到頂層的時候再用三態實現。
理由是:在非頂層模組用雙向口的話,該雙向口必然有它的上層跟它相連。
既然是雙向口,則上層至少有一個輸入口和一個輸出口聯到該雙向口上,則發生兩個內部輸出單元連接到一起的情況出現,這樣在綜合時往往會出錯。

 

全站熱搜
創作者介紹
創作者 Auster 的頭像
Auster

Auster 隨手亂彈

Auster 發表在 痞客邦 留言(0) 人氣()