[三態門原理]VHDL中的INOUT雙向口使用

在第一次VHDL實驗中,要求實現下圖所示的非常簡單的邏輯功能:

 由於VHDL中實現邏輯功能的語言與C語言類似,稍微學習一下VHDL的語法,很容易就寫出了實現該邏輯功能的語句:

IF S="00" THEN
	A<=C;
ELSIF S="01" THEN
	C<=A;
ELSE
	C<=B;
END IF;

但是這樣的仿真結果會出現右圖所示的“不確定”信號:

從網上找到的代碼與筆者想的代碼稍有不同:

IF S="00" THEN
	C<="ZZZZZZZZ";A<=C;
ELSIF S="01" THEN
	A<="ZZZZZZZZ";C<=A;
ELSE
	C<=B;
END IF;

其多了一個給C、A賦值爲“ZZZZZZZZ”的代碼。這樣的話仿真結果是正確的,當在仿真S="00",C=“01010101”時,得到的A的結果也爲“01010101”。

(注:由於A、B、C爲8位數據總線,賦值“01010101”代表第0位到第8位分別爲'0','1','0','1','0','1','0','1',賦值“ZZZZZZZZ”代表第0到第8位全爲“Z”,其中每一位都是一個“INOUT”雙向口。請不要因爲VHDL語言的簡化而認爲這8位是同一個INOUT口,事實上它們8個是相互獨立的8個INOUT口。)

這讓我百思不得其解:在代碼中明明給C賦值爲“ZZZZZZZZ”,然後在將C的值賦給A,那A的值不應該也是“ZZZZZZZZ”?這樣的話,在仿真中C的信號爲“01010101”又有什麼意義?

出現這樣矛盾的思維是因爲筆者當時還是用看C語言的視角來看VHDL語言,要注意的是,VHDL是一門硬件編程語言,其與C語言等計算機編程語言是不同的。

 

什麼是“ZZZZZZZZ”?爲什麼要賦“ZZZZZZZZ”?

在參考文檔中,作者只簡單的說明了賦值“ZZZZZZZZ”的目的是“爲輸出端置爲高阻態,因爲雙向口在同一時刻只可執行輸入功能”,這讓我還是有點不明白,但是至少有了“高阻態”這一突破口。通過查找資料,我漸漸瞭解了其中的緣由。

雙向端口的設計也需要考慮三態的使用。因爲雙向端口在完成輸入功能時必須使原來呈輸出模式的端口呈高阻狀態否則,待輸入的外部數據會與端口處原來的電平發生線與,導致無法將外部數據正確的寫入。

要注意的是,Z在綜合中是一個不確定的值,不同的綜合器會給出不同的結果。對於關鍵詞VHDL不區分大小寫,但是高阻‘Z’需要大寫。

                                        ------摘自新浪博客《三態門電路及其VHDL實現雙向端口

 

什麼是“線與”? 

兩個輸出端(包括兩個以上)直接互連就可以實現“AND”(線與)的邏輯功能。

                                                                                           ------百度百科《線與邏輯》

當用TTL作爲輸出端時,若多個TTL以右圖所示的“線與結構連接時”,當兩個輸出端一個輸出高電平一個輸出低電平時,由於它們的輸出端連接的是同一條線(或理解位兩個輸出端之間連接),這是會出現問題的。在仿真時,線上將會出現“不確定”狀態(上面的“XXX”仿真結果);在實際電路中,由於導線的電阻很小,這樣會形成很大的電流,擊穿TTL。這樣的電路是不可取的。
        這時就出現了一個叫做“三態門”的東西。用“三態門”作爲輸出端時可以解決上面的問題。

 

什麼是“三態門”?

一般的輸出口只有“高電平”和“低電平”兩種輸出狀態,這兩種狀態下輸出口和外部導線是相連的。也就是說,無論該輸出口處於“高電平”還是“低電平”,只要外部導線(或“線與”的其他輸出口)給出了不同的輸出狀態,都會產生大電流燒燬電路。“三態門”就引入了“高電平”和“低電平”以外的第三種狀態——“高阻態當輸出口處於“高阻態”時,從外部導線看入的電阻非常大,相當於斷路。當有兩個輸出口需要以線與結構連接時,當輸出口1輸出時,將輸出口2置爲高阻態,這時外部導線相當於只連接了輸出口1,獲得的是輸出口1的數據;當輸出口2輸出時則置輸出口1爲高阻態。

(注:爲什麼兩個輸出口要接同一個外部導線?(待補充。。。))

 

INOUT雙向口的“高阻態”:

上面筆者說的是多個輸出口線與的時候需要用到三態門的高阻態,那麼爲什麼VHDL中的INOUT雙向口也需要用到三態門的高阻態呢?
        如上圖INOUT雙向口的示意圖,其結構爲IN口和OUT口接同一個外部導線(使用同一個引腳),這時也會出現與上面多輸出口線與遇到的問題相同的問題:當第0s輸出口有輸出時,其會一直保持輸出。若第1s在仿真波形中對該INOUT口給了一個信號值,讓輸入口讀入時,當第0s保持到第1s輸出口一直在輸出的值與仿真波形給的輸入值不同時,就會出現上面線與時遇到的問題。在仿真中將出現不確定狀態,在實際電路中則會燒燬。
         這個時候就需要用到三態門的高阻態了。雙向INOUT口的輸出口是帶有控制端的,當爲雙向口賦值爲“Z”時,輸出口將處於高阻態,此時相當於輸出口與外部導線斷路,只有輸入口連接,這時輸出口的值與導線給入的值不同不會引發錯誤。

總之,當INOUT口需要輸入值時,需要將其設爲高阻態,以防止之前的輸出值影響輸入。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章