Learning Objectives
- 用閘接出 2 選 1 多工器,再用 3 個組成 4 選 1
- 寫出有致能的 2 對 4 解碼器的布林式,說明致能腳的用途
- 用解碼器加 OR、或只用多工器,做出指定的真值表
- 說明一般編碼器遇到同時輸入會錯在哪裡,並改成優先編碼器
- 說明匯流排為什麼一次只能有一個來源
投影機上的訊號切換鈕
教室的投影機通常接著好幾個來源:講桌電腦、HDMI 線、無線投影。不管接了幾個,幕上一次只出現一個,按切換鈕決定是哪一個。
電腦裡這種動作多到數不完:這個運算要拿暫存器 1 還是暫存器 2 的資料?加法器的結果和記憶體讀回來的值,哪一個要存進去?負責「從幾條資料裡選一條」的電路叫多工器(multiplexer,常寫成 MUX)。
反過來的動作也一樣常見:手上有一個編號,要叫醒編號對應的那一個東西,例如記憶體的某一列。負責這件事的是解碼器(decoder)。這一課把兩者接出來,也會看到它們的用途不只是選擇:它們可以做出任何真值表。
最簡單的多工器是 2 選 1:一條選擇線 S,兩條資料 D0、D1。
| S | Y |
|---|---|
| 0 | D0 |
| 1 | D1 |
寫成布林式是 Y = S′·D0 + S·D1。讀法很直接:S 是 0 時,左邊那一項才可能是 1,右邊一定是 0;S 是 1 時相反。兩個 AND 像兩道閘門,S 只打開其中一道。
4 選 1 用 3 個 2 選 1 就夠了
要從 4 條資料選一條,選擇線要 2 條(2 位元可以表示 0~3)。不必重新推導布林式,把 2 選 1 疊起來:
- 第一層兩個 2 選 1:一個在 D0、D1 之間選,一個在 D2、D3 之間選,都看 S0
- 第二層一個 2 選 1:在第一層的兩個結果之間選,看 S1
選擇值就是 S1·2 + S0。例如 S1=1、S0=0 是 2,第一層送上來 D0 和 D2,第二層選 D2。
這個結構可以一直疊下去。N 選 1 用 N − 1 個 2 選 1,選擇線是能裝下 N 的位元數(8 選 1 要 3 條、16 選 1 要 4 條)。代價是資料要穿過好幾層:N 越大,訊號經過的閘越多,也就越慢。第 6 課會量這件事。
從這裡開始,模擬器也提供包裝好的 mux2、mux4 元件,就像真實設計裡用現成的單元。它們是行為模型,整顆算一個延遲,看不到內部,但輸入輸出和你用閘接的一樣。下面的練習兩步都做:先用閘接一個 2 選 1,再用 MUX2 把它擴充成 4 選 1。
解碼器,以及用它們做出任何函數
2 對 4 解碼器有 2 條輸入 A1、A0,4 條輸出 Y0~Y3。輸入是幾,就只有那一條輸出是 1,其他都是 0。例如 A1 A0 = 1 0 時,只有 Y2 是 1。
| A1 | A0 | Y0 | Y1 | Y2 | Y3 |
|---|---|---|---|---|---|
| 0 | 0 | 1 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 0 | 0 |
| 1 | 0 | 0 | 0 | 1 | 0 |
| 1 | 1 | 0 | 0 | 0 | 1 |
每條輸出就是一個最小項:Y2 = A1·A0′。真實的解碼器通常還有一支致能(enable,EN):EN 是 0 時全部輸出都是 0,EN 是 1 時才正常動作,所以 Y2 = EN·A1·A0′。致能讓你決定「現在要不要選」。第 10 課的記憶體就靠它:只有在寫入訊號打開時,解碼器才選中某一列,平常全部不選,資料才不會被亂改。
解碼器加一個 OR,就能做出任何函數。 每條輸出都是一個最小項,而第 1 課說過,任何真值表都能寫成「最小項相加」。真值表哪幾列是 1,就把那幾條輸出接到 OR。
多工器也可以。 把函數的輸入接到選擇線,資料腳接常數,就是把真值表存在資料腳上。而且還能省一半:3 個變數的函數,4 選 1 就夠了。把 A、B 接選擇線之後,對每一種 AB,輸出只剩下四種可能,都用 C 表達得出來:
| 這兩列的 Y(C=0、C=1) | 資料腳接 |
|---|---|
| 0、0 | 常數 0 |
| 1、1 | 常數 1 |
| 0、1 | C |
| 1、0 | C′ |
該選哪一種? 解碼器的輸出全部都算好了,要好幾個函數時可以共用同一顆,加上不同的 OR 就好。多工器一次只出一個值,但是換函數只要改資料腳,不用動其他線路。可程式邏輯元件 FPGA 的基本單元查找表(look-up table),也是用類似的多工器結構實作的。
用程式算出資料腳該接什麼
上面的對照表可以寫成很短的程式:每一種 AB 對應真值表裡連續兩列,比較這兩列就知道資料腳要接什麼。看兩個函數的結果和你接的是不是一樣。
編碼器:同時按兩個會怎樣
編碼器(encoder)和解碼器相反:一排輸入裡有一條是 1,輸出它的編號。4 對 2 編碼器很短,A1 = I3 + I2、A0 = I3 + I1。
這個式子假設一次只有一條是 1。真實世界不會這麼客氣:鍵盤可能兩個鍵一起按,電腦的中斷可能同時來兩個。如果 I2、I1 同時是 1,A1 和 A0 都變成 1,輸出 3。可是根本沒有人按 I3:答案不是其中一個,而是兩個都不對的第三個值。
優先編碼器(priority encoder)的解法是定一個順序:編號大的優先,比它小的當作沒看到。還要多一條 V(valid),分辨「按了 0 號」和「什麼都沒按」,兩者的編號都是 00。
A1 = I3 + I2(沒變)A0 = I3 + I2′·I1:I1 只有在 I2 沒按時才算數V = I3 + I2 + I1 + I0
匯流排:大家共用一組線
CPU 裡的暫存器、ALU、記憶體都要互傳資料。如果每一對都拉一組線,線的數量會隨元件數平方成長,所以實際作法是共用一組線,叫匯流排(bus)。誰要傳資料,就輪到誰把資料放上去。
選「輪到誰」有兩種作法:
- 用多工器:所有來源接進一顆多工器,輸出就是匯流排。選擇線一次只會選中一個,結構上不可能打架。缺點是所有來源都要拉線到同一顆多工器。
- 用三態緩衝器(tri-state buffer):每個來源經過一個開關才接到共用線。開關關閉時,輸出是第三種狀態「高阻抗」(high impedance,常寫成 Z),等於和線斷開。
三態的規則很嚴格:同一時間只能有一個開關打開。兩個都打開,一個推 1、一個推 0,電流會從電源直接流到地,資料變成亂碼,還可能燒壞晶片。這叫匯流排衝突(bus contention)。通常用解碼器產生這些開關訊號,因為解碼器一次只有一條輸出是 1,正好保證一次只有一個來源。
模擬器的簡化。 這個模擬器沒有高阻抗狀態,一個輸入也只能接一條線,所以這條軌道用多工器表現匯流排。第 11 課的資料路徑工具會擋下同時兩個來源的操作,並說明為什麼。
確認一下
要從 16 條資料選一條,只用 2 選 1 多工器,最少要幾個、選擇線幾條?
有致能的 2 對 4 解碼器,EN=0、A1 A0=1 1,輸出是什麼?
一個 3 輸入函數的真值表有 3 列是 1。用 3 對 8 解碼器加 OR 來做,OR 要接幾條輸入?
一般 4 對 2 編碼器(A1 = I3 + I2、A0 = I3 + I1),I2、I1 同時是 1 時,下游收到的編號會發生什麼事?
優先編碼器輸出編號 00,為什麼還需要 V?
用三態緩衝器做匯流排,兩個來源同時打開,會發生什麼事?
重點整理
- 多工器依選擇線從多條資料選一條:
Y = S′·D0 + S·D1。N 選 1 用 N − 1 個 2 選 1。 - 解碼器把編號變成一條亮起來的線,每條輸出都是一個最小項;致能腳決定「現在要不要選」。
- 解碼器加 OR 可以做出任何函數;多工器也可以,而且第三個變數可以放進資料腳,省掉一半。
- 一般編碼器遇到同時輸入會誤報第三個值;優先編碼器定下順序,並用 V 表示有沒有輸入。
- 匯流排一次只能有一個來源,可以用多工器或三態緩衝器;三態要避免同時打開造成衝突。
有了選擇資料的能力,下一課做要被選擇的東西:會算加減法的電路。