Learning Objectives
- 認得六種基本邏輯閘的符號與真值表
- 把一個布林式接成電路,用真值表確認接對了
- 只用 NAND 做出 NOT、AND、OR,說明它為什麼叫通用閘
- 說明晶片為什麼常用 NAND 而不是 AND
布林式怎麼變成真的東西
上一課的 Y = A AND B 是紙上的數學。把它做成實體,只需要一種元件:開關。電晶體就是用電壓控制的開關,兩個開關串聯,兩個都導通電流才過得去,這就是 AND。
晶片設計師不會每次都從電晶體想起,而是用包裝好的單元,叫做邏輯閘(logic gate):
| 符號名稱 | 布林式 | 輸出是 1 的時候 |
|---|---|---|
| NOT | Y = A′ | A 是 0 |
| AND | Y = A·B | 兩個都是 1 |
| OR | Y = A + B | 至少一個是 1 |
| NAND | Y = (A·B)′ | 不是兩個都 1 |
| NOR | Y = (A + B)′ | 兩個都是 0 |
| XOR | Y = A ⊕ B | 兩個不一樣 |
符號上的小圓圈代表「反相」,所以 NAND 的符號就是 AND 加一個圓圈。
這條軌道的模擬器。 電路圖不是畫好看的:每條線的值都是模擬器算出來的,綠色是 1、灰色是 0、紅色是未知(x)。輸入腳沒接線時值就是未知,真實晶片的空接腳也一樣不可靠,所以模擬器不會幫你當成 0。模擬是簡化的:每個閘的延遲都是整數個單位,沒有電壓、電流與散熱。
從布林式接出電路
接電路的順序和算式的順序一樣:括號裡的先算。例如 Y = (A·B) + C′:
- A、B 接到一個 AND
- C 接到一個 NOT
- 兩個結果接到一個 OR,輸出接到燈
接線的方式:按一個元件的輸出腳(右邊),再按另一個元件的輸入腳(左邊)。手機上比較難點的話,用下方的選單一樣可以接;電路圖太寬時可以左右滑動。一個輸出可以接到很多地方,但一個輸入只能接一條線:兩條線同時推同一個點,真實電路會短路,模擬器也不允許。
只要一種閘就夠了
做晶片時,閘的種類越少,製程與設計工具越單純。令人意外的是,只要 NAND 一種就能做出任何邏輯。這種閘叫通用閘(universal gate)。
NOT 最簡單:把 NAND 的兩個輸入接在一起,(A·A)′ = A′。
有了 NOT,AND 就是 NAND 後面再反相一次:((A·B)′)′ = A·B。
OR 用上一課的笛摩根定律:A + B = (A′·B′)′,也就是把兩個輸入各自反相,再接一個 NAND。
NOR 也是通用閘,道理相同。
為什麼真實晶片愛用 NAND?在常見的 CMOS 製程裡,NAND 只要 4 顆電晶體;AND 要在 NAND 後面再接一個反相器,共 6 顆。所以 AND 其實比 NAND「多做一步」,又慢又佔面積,雖然它讀起來比較直覺。
用程式驗證笛摩根定律
窮舉所有輸入是驗證小電路最可靠的方法。下面用 Python 定義 nand,再用它組出 NOT、AND、OR,和 Python 內建的運算比對。
確認一下
NAND 的兩個輸入都接到 A,輸出是什麼?
一個 AND 閘的 A 接到開關,B 沒有接線。把 A 設成 0,輸出是?
下面哪一個式子和 (A + B)′ 相同?
為什麼不能把兩個輸出接到同一個輸入?
用 NAND 做 OR 要 3 個閘,直接用 OR 閘只要 1 個。晶片設計工具為什麼還常常用 NAND 組?
重點整理
- 邏輯閘是電晶體開關的包裝,每種閘對應一個布林運算。
- 接電路的順序和算式相同;一個輸出可以分給很多輸入,一個輸入只能接一條線。
- 沒接線的輸入是未知的,不要假設它是 0。
- NAND 是通用閘,NOT、AND、OR 都能用它做出來。CMOS 裡 NAND 也比 AND 便宜。
閘的數量直接影響成本與速度。下一課學一個化簡的方法:同樣的功能,用更少的閘。