|
勇敢的芯伴你玩轉Altera FPGA連載38::Verilog代碼風格之雙向管腳的控制代碼 特權同學,版權所有 配套例程和更多資料下載鏈接: http://pan.baidu.com/s/1i5LMUUD
對于單向的管腳,輸入信號或者輸出信號,他們的控制比較簡單,不需要太復雜的控制,輸入信號可以直接用在各類等式的右邊用于作為賦值的一個因子;而輸出信號則通常在等式的左邊被賦值。那么,既可以作為輸入信號又可以作為輸出信號的雙向信號又是如何進行控制的呢?如果直接的和單向控制一樣即做輸入又做輸出,勢必會使信號的賦值發生紊亂。列舉一個簡單的沖突,就是當輸入0而輸出1時到底這個信號是什么值?而我們如何控制才能夠避免這類我們不期望的賦值情況發生?我們可以先看看表5.1所列出的I/O驅動真值表。 表5.1 I/O驅動真值表
在這個表里,我們發現當高祖態Z和0或1值同時出現時,總能保持0或1的原狀態不變。我們在設計雙向管腳的邏輯時正要利用這個特性,管腳在做輸入時,讓輸出值取Z狀態,那么讀取的輸入值就完全取決于實際的輸入管腳狀態,而與輸出值無關;管腳在做輸出時,則只要保證與器件管腳連接的信號也是處于類似的Z狀態便可以正常輸出我們的信號值。當然了,外部的狀態是用對應芯片或外設的時序來保證的,我們在FPGA器件內部不直接可控,但我們還是可以把握好FPGA內部的輸入、輸出狀態,保證不出現沖突情況。 費了不少口舌,我想其實只要一個圖加幾段代碼,大家可能就明白其中的精髓。如圖5.9所示,link信號的高低用于控制雙向信號的值是輸出信號yout還是高阻態Z,當link控制當前的輸出狀態為Z時,則輸入信號yin的值由管腳信號ytri來決定。
圖5.9 雙向信號控制 實現代碼如下: // Verilog例程 module bidir(ytri,…); inout ytri; … reg link; wire yin; … // link的取值控制邏輯以及其他邏輯 assign ytri = link ?yout:1'bz; assign yin = ytri; … // yin用于內部賦值 endmodule |