地址譯碼的設計方法

地址譯碼概述

凡是掛在總線上的存儲器芯片或外設,為了區分,必須由地址譯碼電路為每個存儲芯片或外設提供一個與地址信息有關的片選信號。當CPU訪問存儲器或外設時,出現在AB總線上的地址信號可劃分為兩部分,直接與存儲器或外設連接的地址線可稱為片內地址線,其所用根數與存儲器的容量有關,容量為2 n ;其中,n為片內地址線的根數;剩餘的地址線稱為片外地址線,可作為譯碼電路的片選地址線。如圖4-6所示為常見譯碼分類方式。

地址譯碼的設計方法

圖4-6 常見譯碼分類方式

常用的存儲器地址空間分配方法有兩種:線性選擇法(簡稱線選法)和地址譯碼法(簡稱譯碼法),下面分別進行介紹。

1. 常規譯碼法

(1)線選法

線選法就是直接利用單片機片外地址線或某端口的I/O線直接與存儲器芯片或外設接口的片選引腳線連接。線選法的優點是電路簡單,不需要另外增加地址譯碼器硬件電路,體積小,成本低。缺點是可尋址的芯片數目受到限制,適用於芯片較少而且片選線充足的系統。另外,地址空間不連續,每個存儲單元的地址不唯一,這會給程序設計帶來不便,只適用於外擴芯片數目不多的單片機系統的存儲器擴展。如圖4-10所示為單片機線選法。

地址譯碼的設計方法

圖4-10 單片機線選法

注意: 若有多條片選線時,在CPU訪問存儲器期間只能有一根處於有效狀態,不允許出現多條片選線同時有效的現象。

(2)譯碼法

所謂的譯碼法就是使用地址譯碼芯片對系統的片外地址進行譯碼,以其譯碼輸出作為存儲器芯片或外部設備的片選信號。這種方法能夠有效地利用存儲器空間,適用於多芯片的存儲器擴展。譯碼法又分為完全譯碼和部分譯碼兩種。常用的譯碼器芯片有74LS138(3線-8線譯碼器)、74LS139(雙2線-4線譯碼器)和74LS154(4線-16線譯碼器)。

完全譯碼:地址譯碼器使用了全部地址線,其特點是地址與存儲單元一一對應,即存儲器的每一個存儲單元只有唯一的一個地址與之對應,不存在地址重疊現象。

部分譯碼:地址譯碼器僅使用了部分地址線,地址與存儲單元不是一一對應,而是一個存儲單元佔用了幾個地址。使用1根地址線,一個單元佔用2(2 1 )個地址;使用2根地址線,一個單元佔用4(2 2 )個地址;使用3根地址線,則佔用8(2 3 )個地址,依次類推。

思考: 要擴8片8KB的RAM 6264,如何通過74LS138把64KB空間分配給各個芯片?

由74LS138真值表可知,把G1接到+5V,

地址譯碼的設計方法

接地,P2.7、P2.6、P2.5(高3位地址線)分別接74LS138的C、B、A端,由於對高3位地址譯碼,這樣譯碼器有8個輸出Y0~Y7,分別接到8片6264的各片選端,實現8選1的片選。低13位地址(P2.4~P2.0,P0.7~P0.0)完成對選中的6264芯片中的各個存儲單元的單元選擇,這樣就把64KB存儲器空間分成8個8KB空間了。64KB地址空間分配如圖4-11所示。

地址譯碼的設計方法

圖4-11 64KB地址空間劃分成8個8KB空間

這裡採用全地址譯碼方式。因此,51單片機發出16位地址時,每次只能選中某一芯片及該芯片的一個存儲單元。

思考: 如何用74LS138把64KB空間全部劃分為4KB的塊?

4KB空間需12條地址線,而譯碼器輸入只有3條地址線(P2.6~P2.4),P2.7沒有參加譯碼,P2.7發出的0或1決定選擇64KB存儲器空間的前32KB還是後32KB。由於P2.7沒有參加譯碼,就不是全譯碼方式,前後兩個32KB空間就重疊了。那麼,這32KB空間利用74LS138譯碼器可劃分為8個4KB空間。如果把P2.7通過一個非門與74LS138譯碼器G1端連接起來,如圖4-12所示,就不會發生兩個32KB空間重疊的問題。這時,選中的是64KB空間的前32KB空間,地址範圍為0000H~7FFFH。如果去掉圖4-12中的非門,地址範圍為8000H~FFFFH。把譯碼器的輸出連到各個4KB存儲器的片選端,這樣就把32KB空間劃分為8個4KB空間。P2.3~P2.0,P0.7~P0.0實現單元選擇,P2.6~P2.4通過74LS138譯碼實現對各存儲器芯片的片選。採用譯碼器劃分的地址空間塊都是相等的,如果將地址空間塊劃分為不等的塊,可採用可編程邏輯器件FPGA對其編程來代替譯碼器進行非線性譯碼。如圖4-13所示為74LS138地址譯碼電路。

地址譯碼的設計方法

圖4-12 存儲空間被劃分成每塊4KB

地址譯碼的設計方法

圖4-13 74LS138地址譯碼電路

地址分配:

CS_LED: 0x8000~0x8FFF; LED指示燈片選地址

CS_SHUMA: 0x9000~0x9FFF; 數碼管片選地址

CS_A/D: 0xA000~0xAFFF; A/D轉換器片選地址

CS_D/A: 0xB000~0xBFFF; D/A轉換器片選地址

CS_LCD: 0xC000~0xCFFF; 液晶片選地址

CS_KEY_RD: 0xD000~0xDFFF; 讀鍵盤片選地址

CS_KEY_WR: 0xE000~0xEFFF; 寫鍵盤片選地址

首先看LED指示燈的地址控制端CS_LED為什麼是0x8000~0x8FFF,74LS138首先要工作,必須將片選輸入

地址譯碼的設計方法

端置為有效,根據硬件連接,

地址譯碼的設計方法

已經接地,這時只需要將E3置為高電平即可隨時啟動該74LS138芯片,又由於把單片機的最高位地址線A15接在了E3上,所以,所有外設的片選地址都必須讓A15位置為高電平1,這樣,74LS138片選輸出就完全取決於C(A14)、B(A13)、A(A12)這3個控制端,顯然要讓LED指示燈的地址控制端CS_LED有效,也就是讓74LS138的Y0輸出端有效(為0),只需要C(A14)=0、B(A13)=0、A(A12)=0即可,也就是說只要讓單片機地址總線的高4位為1000,而其他12根低地址線可以任意取0和1,所以到此便推算出了LED指示燈的片選地址是0x8000~0x8FFF。同理,數碼管、A/D轉換器、D/A轉換器、液晶、鍵盤也是如此。但是在這裡,有些讀者不難發現一點,鍵盤的片選信號為什麼有兩個,一個“讀鍵盤地址”,一個“寫鍵盤地址”,關於這一點,本書會在鍵盤設計部分詳細說明。 注意: 地址的分配是隨具體硬件連接的不同而變化的。只要硬件連接固定了,外設地址也就固定了。

(3)地址譯碼關係圖

在設計地址譯碼器電路時,如果採用地址譯碼關係圖,將會帶來很大的方便。如圖4-14所示即為一地址譯碼關係圖。

地址譯碼的設計方法

圖4-14 地址譯碼關係圖示例

從圖4-14中可以看出以下幾點:

① 屬完全譯碼還是部分譯碼。

② 片內譯碼線和片外譯碼線各有多少根。

③ 所佔用的全部地址範圍為多少。

在上面的關係圖中,有1個“·”(A15不接),表示為部分譯碼,每個單元佔用兩個地址。片內譯碼線有11根(A10~A0),片外譯碼線有4根。其所佔用的地址範圍如下:當A15為0時,所佔用地址為0010000000000000~0010011111111111,即2000H~27FFH。當A15為1時,所佔用地址為1010000000000000~1010011111111111,即A000H~A7FFH。共佔用了兩組地址,這兩組地址在使用中同樣有效。

2. 簡化譯碼法

從上面設計的各個外部設備模塊中不難發現,每一個模塊的74LS374或者74LS574的CLK端都用到了一個或門或者或非門作為選通邏輯,這樣,如果外部設備很多,勢必要用很多類似的邏輯門電路,那麼是否可以節省一下呢?大家仔細研究一下不難發現,每個邏輯都是放在74LS138地址譯碼的後面,不妨換個思維考慮,如果將一個合適的邏輯門放在74LS138前面,是否可以實現“總體邏輯”呢。如圖4-15所示,74LS138的兩個地電平控制端

地址譯碼的設計方法

直接接地,而其高電平控制端E3是由單片機的

地址譯碼的設計方法

地址譯碼的設計方法

兩個信號“與非”後得到的,當單片機不讀寫任何外部設備時,兩個信號均為高電平,與非門輸出低電平,74LS138不工作,輸出高阻,由於其外部加了上拉電阻,故7個外部設備片選信號均為高電平,程序一旦讀寫外部設備,兩個信號其中必有一個要變為有效(即低電平),導致與非門輸出高電平,74LS138開始工作,其輸出也就是8個片選信號必有其一被選中(變為低電平),當兩個信號變高的一瞬間(其實在一次讀寫過程中只有其一有效,所以這裡只是針對其中一個而言),與非門輸出又變為低,再次導致74LS138停止工作,輸出高阻,而剛才的片選信號由於有外部上拉電路的作用,迅速從被選中狀態(低電平)上跳到高電平,這樣便完成了後續外部設備74LS374 CLK端所需要的上升沿信號,也就將數據輸出到外部設備或者讀入外部設備的數據。

地址譯碼的設計方法

圖4-15 74LS138譯碼前加讀寫邏輯

3. 高級譯碼法

一般的單片機系統設計中,譯碼電路基本上都是採用類似74LS138的譯碼芯片,但是還有另一種功能非常強大的常用通用邏輯芯片,那就是可編程邏輯器件GAL。有經驗的工程師可能都非常喜歡用這種芯片,如GAL16V8、GAL20V8這兩種最常用的芯片,因為通過對這種器件編程,完全可以取代一般單片機設計中用到的所有譯碼邏輯芯片,編程方便,可以在不改變硬件連接的情況下對外圍設備重新進行地址分配,大大節省了開發時間,同時也降低了電路板的佔用面積,提高了系統的穩定性。但是另一方面,該芯片價格稍貴,大概8~10元/片,大大高於74LS138芯片,所以還是要在設計時權衡速度和成本,以做出最優化設計。如圖4-16所示是利用GAL20V8B設計的譯碼電路。

地址譯碼的設計方法

圖4-16 GAL20V8B實現小規模全功能譯碼


分享到:


相關文章: