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