天天看點

《邏輯與計算機設計基礎(原書第5版)》——3.5 譯碼

在數字計算機中,大量的離散資訊都用二進制碼表示。一種n位二進制碼可以表示多達2n個不同的編碼資訊。譯碼就是将一個n位的輸入碼轉換成一個m位的輸出碼,并且有n≤m≤2n,以保證每一個有效的輸入碼都産生唯一的輸出碼。譯碼通過譯碼器(decoder)來完成,譯碼器是一個組合電路,在它的輸入端加載一個n位的二進制碼,它就會在輸出端産生一個m位的二進制碼。譯碼器輸入的某些組合可能沒有,故在輸出端也就得不到對應的m位碼。在所有定義的特殊函數中,譯碼是最重要的,因為這個函數以及相應的功能子產品普遍存在于其他函數和功能子產品中。

在這一節,實作譯碼功能的功能子產品稱為n輸入m輸出譯碼器,簡單表示為n-m譯碼器,其中m≤2n。使用譯碼器的目的是要從n個輸入變量中産生不超過2n個的最小項。假設n=1,m=2,我們就可以得到1-2譯碼函數,其輸入為A,輸出為D0和D1,真值表如圖3-12a所示。如果A=0,則D0=1,D1=0;如果A=1,則D0=0,D1=1。通過真值表可知,D0=A,D1=A。具體的電路如圖3-12b所示。

第二個譯碼函數n=2且m=4,其真值表如圖3-13a所示,它更好地說明了譯碼器的一般特性。這個表将二變量的最小項作為輸出,每一行有一個輸出值為1,其餘為0。當A1和A0上的兩個輸入值是數字i的二進制碼時,輸出Di等于1。進而,此電路可以獲得由兩個變量組成的4個最小項,每個輸出一個。在圖3-13b給出的邏輯原理圖中,每個最小項通過一個二輸入與門來實作,這些與門和兩個1-2譯碼器相連,每個譯碼器的輸出都驅動與門的輸入。

《邏輯與計算機設計基礎(原書第5版)》——3.5 譯碼

對于規模較大的譯碼器,可以考慮用輸入個數更多的與門來一個一個地實作每一個最小項。但糟糕的是,譯碼器越大,這種方法的門輸入成本越高。在這一節,我們介紹使用分級思想和一組與門來建構任意n輸入2n輸出譯碼器的設計過程。這樣得到的譯碼器與通過簡單增加每個與門的輸入個數而得到的譯碼器相比,門輸入成本相等或更少。

為了構造一個3-8譯碼器(n=3),我們可以采用一個2-4譯碼器和一個1-2譯碼器,同時将它們連接配接到8個二輸入與門來形成最小項。采用分層設計,2-4譯碼器可以由2個1-2譯碼器連接配接到4個二輸入與門組成,正如我們在圖3-13中看到的那樣。最終得到的電路如圖3-14所示。

《邏輯與計算機設計基礎(原書第5版)》——3.5 譯碼

一般步驟如下:

1)使k=n。

2)如果k是偶數,則将k除以2得到k/2,并使用2k個與門,這些門被兩個譯碼器驅動,每個譯碼器有2k/2個輸出。如果k是奇數,計算出(k+1)/2和(k-1)/2,并使用2k個與門,這些與門被兩個譯碼器驅動,其中一個譯碼器有2(k+1)/2個輸出,另一個譯碼器有2(k-1)/2個輸出。

3)對于由步驟2)得到的每一個譯碼器,使用由步驟2)得到的k,重複步驟2),直到k=1。如果k=1,則使用一個1-2譯碼器。

例3-6 6-64譯碼器

對于一個6-64譯碼器(k=n=6),在第一次執行完第2)步後,64個二輸入與門被兩個輸出個數為23=8的譯碼器驅動(即兩個3-8譯碼器)。在第二次執行完第2)步後,k=3。因為k是奇數,則(k+1)/2=2和(k-1)/2=1,8個二輸入與門被一個輸出個數為22=4的譯碼器和一個輸出個數為21=2的譯碼器驅動(即一個2-4譯碼器和一個1-2譯碼器)。最後,在第三次執行完第2)步後,k=2,4個二輸入與門被兩個輸出個數為2的譯碼器驅動(即兩個1-2譯碼器)。因為所有的譯碼器都已被展開,這時可以執行第3)步,算法到此結束。最終的電路結構如圖3-15所示,該電路結構的門輸入成本為6+2(2×4)+2(2×8)+2×64=182。如果對于每一個最小項使用一個與門,則門輸入成本為6+(6×64)=390,是以本方法使門輸入成本得以明顯減少。

可能會出現這樣的情況:有多個譯碼器,而且這些譯碼器有相同的輸入變量,這時需要使用另一種擴充方法。在這種情況下,我們并不孤立地實作每一個譯碼器,而是通過共享來實作幾個譯碼器。例如,假設3個譯碼器da、db和dc是下列輸入變量的函數:

da(A, B, C, D)

db(A, B, C, D)

dc(A, B, C, D)

在da和db之間可以用一個3-8譯碼器來實作A、B和C的共享;在da和dc之間可以用一個2-4譯碼器來實作C和D的共享;在db和dc之間可以用一個2-4譯碼器來實作C和E的共享。如果我們全部實作了這些共享,那麼這三個不同的譯碼器會同時含有變量C,電路就會出現備援。為了在共享譯碼器的大小為2時隻使用C一次,我們可以考慮如下不同方案:

1)da和db共享(A,B),da和dc共享(C,D)。

2)da和db共享(A,B),db和dc共享(C,E)。

3)da和db共享(A,B,C)。

因為第1)種方案和第2)種方案的開銷明顯相同,是以我們比較第1)種方案和第3)種方案的開銷。對于第1)種方案,函數da、db、dc可減少兩個2-4譯碼器(反相器除外)或者16個門輸入。對于第3)種方案,函數da和db可減少一個3-8譯碼器(反相器除外)或者24個門輸入。是以,我們應該采用第3)種方案。将這個過程形式化,并用算法來表示超過了我們目前的學習範疇,這裡隻是對此方法進行舉例說明。

3.5.1 譯碼器和使能結合

帶使能的n-m譯碼函數,可以通過在譯碼器的輸出端連接配接m個使能電路來實作。這樣,m個相同的使能信号EN與使能電路的使能控制連接配接。當n=2、m=4時,帶使能的2-4譯碼器及其真值表如圖3-16所示。當EN=0時,譯碼器的所有輸出都為0;當EN=1時,譯碼器的一個輸出為1,其他輸出都為0,這個為1的輸出由(A1,A0)的值來決定。如果這個譯碼器控制一組燈光的照明,則當EN=0時,所有燈都是熄滅的;而當EN=1時,隻有一盞燈是亮的,其他燈都是熄滅的。對于規模大的譯碼器(n≥4),将使能電路放置在譯碼器的輸入端以及它們的反相端,而不是放在每個譯碼器的輸出端,可以減少門輸入成本。

《邏輯與計算機設計基礎(原書第5版)》——3.5 譯碼

3.7節将介紹采用多路複用器來選擇資料。與“選擇”相反的操作稱為配置設定(distribu-tion),它可以将來自一條輸入線上的資訊傳送到2n條輸出線中的任意一條。執行這種配置設定任務的電路稱為多路配置設定器(demultiplexer),它由n條選擇線的組合控制将輸入信号傳送到特定的輸出端。圖3-16所示的帶使能的2-4譯碼器是一個1-4多路配置設定器的一種實作方式,其中輸入EN提供資料,其他輸入為選擇變量。雖然兩個電路有不用的應用,但它們的邏輯圖卻完全一樣。正因為這樣,一個帶使能輸入的譯碼器又可以稱為譯碼器/多路配置設定器。輸入資料EN與所有4個輸出之間都有一條通路,但是輸入資訊由兩條選擇線A1和A0控制,隻能到達輸出中的一個。例如,如果(A1,A0)=10,則加載到輸入EN的資料被傳送到輸出D2,而其他輸出仍然是非活動的邏輯0。如果譯碼器控制4盞燈,(A1,A0)=10且EN在1和0之間做周期性變化,則由D2控制的那盞燈會不斷閃爍,其他燈熄滅。

接下來的幾個例子說明了使用VHDL和Verilog語言描述譯碼器的行為,以此作為在第2章首次介紹的每一種語言結構和資料流模組化方式的補充。

例3-7 2-4譯碼器的VHDL模型

圖3-17給出了圖3-16中2-4譯碼器電路的VHDL結構描述。該模型使用了基本邏輯門的lcdf_vhdl庫,如第2章所述,該庫可從本書的配套網站上下載下傳。

圖3-18給出了圖3-16的2-4譯碼器電路的VHDL資料流描述。注意,這裡的資料流描述要比圖3-17的結構描述更簡單,而且經常是這樣。庫、調用與實體聲明與圖3-16中的那些是完全相同的,是以不再重複說明。

《邏輯與計算機設計基礎(原書第5版)》——3.5 譯碼

例3-8 2-4譯碼器的Verilog模型

圖3-19給出了圖3-16中2-4譯碼器電路的Verilog結構描述。圖3-20給出了這個2-4譯碼器電路的Verilog資料流描述。這個資料流描述使用了緊跟布爾表達式之後的指派語句。

《邏輯與計算機設計基礎(原書第5版)》——3.5 譯碼
《邏輯與計算機設計基礎(原書第5版)》——3.5 譯碼
《邏輯與計算機設計基礎(原書第5版)》——3.5 譯碼

3.5.2 基于譯碼器的組合電路

一個n輸入變量的譯碼器可以産生2n個最小項。因為任何布爾函數都可以由最小項之和表示,是以可以使用一個譯碼器來産生這些最小項,并由一個額外的或門組合它們來實作最小項之和。按照這種辦法,任何n輸入m輸出的組合電路都可以用1個n―2n譯碼器和m個或門實作。

通過譯碼器和或門來實作組合電路的前提是,用最小項之和的形式來表示布爾函數,這可以從真值表或者每個函數的卡諾圖中獲得。輸入變量所有的最小項都可以通過設計或選擇一個合适的譯碼器來産生,再根據每個函數最小項的清單選擇相應的最小項作為或門的輸入。下面的例子示範了這一過程。

例3-9 用譯碼器和或門實作1位二進制加法器

在第1章,我們讨論了二進制加法。加法運算中某一位的和輸出S與進位輸出位C,由該位兩個相加的數X和Y以及來自右邊(低位)的進位輸入Z來産生,如表3-4所示。

《邏輯與計算機設計基礎(原書第5版)》——3.5 譯碼

從真值表中,我們可以得到該組合電路函數的最小項之和的形式:

S(X, Y, Z)=m(1, 2, 4, 7)

C(X, Y, Z)=m(3, 5, 6, 7)

因為有3個輸入和8個最小項,是以我們需要一個3-8譯碼器。實作過程如圖3-21所示,譯碼器産生輸入X、Y和Z的所有8個最小項,産生輸出S的或門形成最小項1、2、4和7的邏輯和,産生輸出C的或門則形成了最小項3、5、6和7的邏輯和。最小項0沒有用到。 ■

《邏輯與計算機設計基礎(原書第5版)》——3.5 譯碼

一個有許多最小項的函數需要一個多輸入的或門。一個有k個最小項的函數可以用另外的2n-k個最小項之和的非來表示。如果函數F最小項的個數超過了F最小項的個數,則函數F的取反形式F可以用更少的最小項表示。在這種情況下,使用或非門比使用或門有優勢。或非門的或運算部分可以得到函數F的最小項的邏輯和,或非門的輸出泡泡則将該邏輯和取反,給出正常的輸出F。

譯碼器方法可以用來實作任何組合電路。然而,這種實作方法必須和其他可能的方法相比較以便确定最佳的解決方案。譯碼器方法也許是最好的解決方法,特别是當組合電路有許多輸出,而且這些輸出都是基于相同的輸入,以及每個輸出函數可以用少量的最小項來表示的時候。