|
雙向管腳的控制代碼 本文節(jié)選自特權(quán)同學(xué)的圖書《FPGA設(shè)計(jì)實(shí)戰(zhàn)演練(邏輯篇)》 配套例程下載鏈接:http://pan.baidu.com/s/1pJ5bCtt 對(duì)于單向的管腳,輸入信號(hào)或者輸出信號(hào),他們的控制比較簡(jiǎn)單,不需要太復(fù)雜的控制,輸入信號(hào)可以直接用在各類等式的右邊用于作為賦值的一個(gè)因子;而輸出信號(hào)則通常在等式的左邊被賦值。那么,既可以作為輸入信號(hào)又可以作為輸出信號(hào)的雙向信號(hào)又是如何進(jìn)行控制的呢?如果直接的和單向控制一樣即做輸入又做輸出,勢(shì)必會(huì)使信號(hào)的賦值發(fā)生紊亂。列舉一個(gè)簡(jiǎn)單的沖突,就是當(dāng)輸入0而輸出1時(shí)到底這個(gè)信號(hào)是什么值?而我們?nèi)绾慰刂撇拍軌虮苊膺@類我們不期望的賦值情況發(fā)生?我們可以先看看表5.1所列出的I/O驅(qū)動(dòng)真值表。(特權(quán)同學(xué),版權(quán)所有) 表5.1 I/O驅(qū)動(dòng)真值表
在這個(gè)表里,我們發(fā)現(xiàn)當(dāng)高祖態(tài)Z和0或1值同時(shí)出現(xiàn)時(shí),總能保持0或1的原狀態(tài)不變。我們?cè)谠O(shè)計(jì)雙向管腳的邏輯時(shí)正要利用這個(gè)特性,管腳在做輸入時(shí),讓輸出值取Z狀態(tài),那么讀取的輸入值就完全取決于實(shí)際的輸入管腳狀態(tài),而與輸出值無關(guān);管腳在做輸出時(shí),則只要保證與器件管腳連接的信號(hào)也是處于類似的Z狀態(tài)便可以正常輸出我們的信號(hào)值。當(dāng)然了,外部的狀態(tài)是用對(duì)應(yīng)芯片或外設(shè)的時(shí)序來保證的,我們?cè)贔PGA器件內(nèi)部不直接可控,但我們還是可以把握好FPGA內(nèi)部的輸入、輸出狀態(tài),保證不出現(xiàn)沖突情況。(特權(quán)同學(xué),版權(quán)所有) 費(fèi)了不少口舌,我想其實(shí)只要一個(gè)圖加幾段代碼,大家可能就明白其中的精髓。如圖5.9所示,link信號(hào)的高低用于控制雙向信號(hào)的值是輸出信號(hào)yout還是高阻態(tài)Z,當(dāng)link控制當(dāng)前的輸出狀態(tài)為Z時(shí),則輸入信號(hào)yin的值由管腳信號(hào)ytri來決定。(特權(quán)同學(xué),版權(quán)所有)
圖5.9 雙向信號(hào)控制 實(shí)現(xiàn)代碼如下: // Verilog例程 module bidir(ytri,…); inout ytri; … reg link; wire yin; … // link的取值控制邏輯以及其他邏輯 assign ytri = link ? yout:1'bz; assign yin = ytri; … // yin用于內(nèi)部賦值 endmodule |