本實驗的學習目標:完成本 Lab 後,你應該能夠——
化簡含 \(\land\)、\(\lor\)、\(\lnot\) 的布林表達式;
在 Logisim 上組裝並驗證對應布林表達式的電路;
只用 NAND 閘在 Logisim 上實作布林表達式;
依真值表建立最多 5 個變數的卡諾圖;
從卡諾圖產生最多 5 個變數的最簡布林表達式。
所需工具:Logisim(電路模擬)與 NAND 板(實體實作)。 NAND 板是 Bristol 自製的開源教具(Simon Hollis 與 Dan Page 設計): USB 供電,板上有 4 顆晶片、每顆含 4 個 NAND 閘(共 16 個), 另有 4 個按鈕(未按下 = 0、按下 = 1)與常數 1 腳位; 沒有常數 0 腳位——因為板上有下拉電路,未接線的輸入預設為 0。 每個 NAND 的輸出以 LED 顯示。
化簡下列布林表達式,每題答案為 \(0\)、\(1\) 或 \(A\)。
這 16 小題就是布林代數的「九九乘法表」——常數運算是 AND/OR 的定義本身, 含 \(A\) 的運算則對應四條基本定律。
常數運算(直接套用定義):
| \(0 \land 0 = 0\) | \(0 \land 1 = 0\) | \(1 \land 0 = 0\) | \(1 \land 1 = 1\) |
| \(0 \lor 0 = 0\) | \(0 \lor 1 = 1\) | \(1 \lor 0 = 1\) | \(1 \lor 1 = 1\) |
AND 是「全部為 1 才是 1」,所以四題中只有 \(1 \land 1\) 得 1; OR 是「至少一個 1 就是 1」,所以四題中只有 \(0 \lor 0\) 得 0。
含變數 \(A\) 的運算(對應四條定律):
| 表達式 | 答案 | 使用定律 | 直覺理解 |
|---|---|---|---|
| \(0 \land A\) | \(0\) | 支配律 | 有一個輸入恆為 0,AND 永遠輸出 0 |
| \(1 \land A\) | \(A\) | 同一律 | 1 不影響 AND:輸出完全由 \(A\) 決定 |
| \(A \land A\) | \(A\) | 冪等律 | 兩輸入永遠相同,輸出跟著 \(A\) |
| \(\lnot A \land A\) | \(0\) | 互補律 | \(A\) 與 \(\lnot A\) 不可能同時為 1 |
| \(0 \lor A\) | \(A\) | 同一律 | 0 不影響 OR:輸出完全由 \(A\) 決定 |
| \(1 \lor A\) | \(1\) | 支配律 | 有一個輸入恆為 1,OR 永遠輸出 1 |
| \(A \lor A\) | \(A\) | 冪等律 | 兩輸入永遠相同,輸出跟著 \(A\) |
| \(\lnot A \lor A\) | \(1\) | 互補律 | \(A\) 與 \(\lnot A\) 必有一個為 1 |
記憶技巧:注意 \(\land\) 與 \(\lor\) 的對偶性—— 把 \(\land \leftrightarrow \lor\)、\(0 \leftrightarrow 1\) 同時互換,每條定律仍然成立。 例如「\(0 \land A = 0\)(支配)」對偶成「\(1 \lor A = 1\)(支配)」; 「\(1 \land A = A\)(同一)」對偶成「\(0 \lor A = A\)(同一)」。 背一半就等於背了全部。這些定律是後面所有化簡題的基礎。
電路組裝(Circuit Assembly)
為下列六個布林表達式在 Logisim 組裝邏輯等價的電路(閘的輸入數 \(\le 2\); NOT 為單輸入),並列出真值表逐一驗證。 挑戰題:運用布林代數化簡,每個電路最少可以用幾個閘實作?
解題策略:先照原式組裝並用真值表驗證(這是題目的基本要求), 再用化簡定律求出最簡等價式——化簡式的電路就是挑戰題的答案。 下面每小題先給化簡推導,再給真值表與最簡電路。
化簡推導
(a) \(((A \land C) \lor (B \land C)) \land C\) \[\begin{array}{cl} & ((A \land C) \lor (B \land C)) \land C \\ \equiv & ((A \lor B) \land C) \land C \quad\text{【分配律:提出公因子 $C$】} \\ \equiv & (A \lor B) \land (C \land C) \quad\text{【結合律】} \\ \equiv & \boxed{(A \lor B) \land C} \quad\text{【冪等律 $C \land C \equiv C$】} \\ \end{array}\]
(b) \(\lnot(A \lor \lnot(B \land C))\) \[\begin{array}{cl} & \lnot(A \lor \lnot(B \land C)) \\ \equiv & \lnot A \land \lnot\lnot(B \land C) \quad\text{【德摩根:$\lnot(\lor) \Rightarrow \land$,各項加否定】} \\ \equiv & \boxed{\lnot A \land B \land C} \quad\text{【雙重否定】} \\ \end{array}\]
(c) \(((A \lor B) \land (A \lor \lnot B)) \lor C\) \[\begin{array}{cl} & ((A \lor B) \land (A \lor \lnot B)) \lor C \\ \equiv & (A \lor (B \land \lnot B)) \lor C \quad\text{【$\lor$ 對 $\land$ 的分配律(提出 $A$)】} \\ \equiv & (A \lor 0) \lor C \quad\text{【互補律 $B \land \lnot B \equiv 0$】} \\ \equiv & \boxed{A \lor C} \quad\text{【同一律】} \\ \end{array}\]
(d) \((A \land B) \lor \lnot(C \lor \lnot A)\) \[\begin{array}{cl} & (A \land B) \lor \lnot(C \lor \lnot A) \\ \equiv & (A \land B) \lor (\lnot C \land A) \quad\text{【德摩根+雙重否定】} \\ \equiv & \boxed{A \land (B \lor \lnot C)} \quad\text{【分配律:提出公因子 $A$】} \\ \end{array}\]
(e) \(A \lor (B \land (C \lor A))\) \[\begin{array}{cl} & A \lor (B \land (C \lor A)) \\ \equiv & A \lor (B \land C) \lor (B \land A) \quad\text{【分配律展開】} \\ \equiv & \boxed{A \lor (B \land C)} \quad\text{【吸收律 $A \lor (B \land A) \equiv A$】} \\ \end{array}\]
(f) \(\lnot(\lnot(A \land B \land C) \land C)\) \[\begin{array}{cl} & \lnot(\lnot(A \land B \land C) \land C) \\ \equiv & (A \land B \land C) \lor \lnot C \quad\text{【德摩根+雙重否定】} \\ \equiv & \lnot C \lor (C \land (A \land B)) \quad\text{【交換律+結合律】} \\ \equiv & \boxed{(A \land B) \lor \lnot C} \quad\text{【$\lnot X \lor (X \land Y) \equiv \lnot X \lor Y$】} \\ \end{array}\] 最後一步用的變形可自行驗證:當 \(C=0\) 時兩邊都是 1;當 \(C=1\) 時兩邊都等於 \(A \land B\)。
驗證用真值表
六個表達式的完整真值表(照原式或化簡式計算結果相同——這正是驗證的意義):
| \(A\) | \(B\) | \(C\) | (a) \((A{\lor}B){\land}C\) | (b) \(\lnot A{\land}B{\land}C\) | (c) \(A{\lor}C\) | (d) \(A{\land}(B{\lor}\lnot C)\) | (e) \(A{\lor}(B{\land}C)\) | (f) \((A{\land}B){\lor}\lnot C\) |
|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
| 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 |
| 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
| 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
在 Logisim 中:放好輸入腳位(方形)\(A\)、\(B\)、\(C\) 與輸出腳位(圓形), 用戳戳工具(poke tool)依次切出 8 種輸入組合,逐列核對輸出。
挑戰題:最少閘數
最簡電路圖與閘數比較(「直接實作」指按原式逐運算子換閘、不共用訊號):
| 題 | 最簡式 | 直接實作 | 最少閘數 |
|---|---|---|---|
| (a) | \((A \lor B) \land C\) | 4 | 2(OR+AND) |
| (b) | \(\lnot A \land B \land C\) | 4 | 3(NOT+2 AND) |
| (c) | \(A \lor C\) | 5 | 1(OR) |
| (d) | \(A \land (B \lor \lnot C)\) | 5 | 3(NOT+OR+AND) |
| (e) | \(A \lor (B \land C)\) | 3 | 2(AND+OR) |
| (f) | \((A \land B) \lor \lnot C\) | 5 | 3(AND+NOT+OR) |
最簡電路圖:
(o) at (0,0.6) ; (a) at (2.2,0.28) ; (o.in 1) – ++(-0.4,0) node[left]\(A\); (o.in 2) – ++(-0.4,0) node[left]\(B\); (o.out) – ++(0.2,0) |- (a.in 1); (a.in 2) – ++(-3.4,0) node[left]\(C\); (a.out) – ++(0.3,0) node[right]out; |
(a1) at (0.6,0.6) ; (n) at (a1.in 1) ; (a2) at (2.8,0.28) ; (n.in 1) – ++(-0.3,0) node[left]\(A\); (a1.in 2) – ++(-1.75,0) node[left]\(B\); (a1.out) – ++(0.2,0) |- (a2.in 1); (a2.in 2) – ++(-4.55,0) node[left]\(C\); (a2.out) – ++(0.3,0) node[right]out; |
(o) at (0,0) ; (o.in 1) – ++(-0.4,0) node[left]\(A\); (o.in 2) – ++(-0.4,0) node[left]\(C\); (o.out) – ++(0.3,0) node[right]out; |
| (a) 2 個閘 | (b) 3 個閘 | (c) 1 個閘 |
(o) at (0.6,0.28) ; (n) at (o.in 2) ; (a) at (2.8,0.6) ; (o.in 1) – ++(-1.75,0) node[left]\(B\); (n.in 1) – ++(-0.3,0) node[left]\(C\); (o.out) – ++(0.2,0) |- (a.in 2); (a.in 1) – ++(-4.55,0) node[left]\(A\); (a.out) – ++(0.3,0) node[right]out; |
(a) at (0,0) ; (o) at (2.2,0.32) ; (a.in 1) – ++(-0.4,0) node[left]\(B\); (a.in 2) – ++(-0.4,0) node[left]\(C\); (a.out) – ++(0.2,0) |- (o.in 2); (o.in 1) – ++(-3.4,0) node[left]\(A\); (o.out) – ++(0.3,0) node[right]out; |
(a) at (0,0.6) ; (n) at (-0.05,-0.6) ; (o) at (2.2,0.0) ; (a.in 1) – ++(-0.4,0) node[left]\(A\); (a.in 2) – ++(-0.4,0) node[left]\(B\); (n.in 1) – ++(-0.62,0) node[left]\(C\); (a.out) – ++(0.2,0) |- (o.in 1); (n.out) – ++(0.2,0) |- (o.in 2); (o.out) – ++(0.3,0) node[right]out; |
| (d) 3 個閘 | (e) 2 個閘 | (f) 3 個閘 |
特別注意 (c):原式看似需要 5 個閘,化簡後 \(B\) 完全消失,只剩 1 個 OR 閘—— \((A \lor B) \land (A \lor \lnot B)\) 中,\(B\) 與 \(\lnot B\) 的影響互相抵消。 這是「先化簡、後畫電路」威力的最好示範。
命題邏輯(Propositional Logic)
把下列敘述改寫成布林表達式:用命題變數(\(A\)、\(B\)、\(C\)……)代表每個 真/假條件,再用 \(\land\)、\(\lor\)、\(\lnot\) 組合。 提示:先想清楚「輸入」(各個條件)與「輸出」(最終判斷)分別是什麼。
翻譯訣竅:
「if / 若…則可」\(\Rightarrow\) 該條件是輸出為真的一種途徑(\(\lor\) 分支);
「unless / 除非」\(\Rightarrow\) 例外條件,通常翻成「\(\land\,\lnot(\text{例外})\)」;
「always / 一律」\(\Rightarrow\) 凌駕其他規則: 「一律可以」用最外層 \(\lor\)、「一律不行」用最外層 \(\land\,\lnot\)。
年終獎金
題意:員工若整年在職即符合年終獎金資格,但試用期員工除外; 績效「優秀」的員工也可獲得獎金。
定義變數:
| 變數 | 命題 |
|---|---|
| \(W\) | 該員工整年在職(worked the whole year) |
| \(P\) | 該員工在試用期(on probation) |
| \(E\) | 該員工績效為「優秀」(excellent rating) |
逐步翻譯: 「整年在職即可獲獎金」\(\Rightarrow W\); 「除非在試用期」是對這條途徑的例外 \(\Rightarrow W \land \lnot P\); 「績效優秀也可獲得」是另一條獨立途徑 \(\Rightarrow \lor\, E\)。 \[\text{獲得獎金} = \boxed{(W \land \lnot P) \lor E}\]
檢查邊界情況:試用期但績效優秀(\(P=1, E=1\))? 按此式可獲獎金——「unless」只修飾第一條規則,第二條規則(優秀)沒有試用期限制。 這是題目文字最自然的讀法。
停車收費
題意:週末停車免費;平日只有出示許可證才免費; 但貨車(lorry)一律要收費。
定義變數:
| 變數 | 命題 |
|---|---|
| \(W\) | 今天是週末(weekend) |
| \(P\) | 有出示停車許可證(permit displayed) |
| \(L\) | 車輛是貨車(lorry) |
逐步翻譯: 「週末免費」\(\Rightarrow W\); 「平日出示許可證免費」\(\Rightarrow \lnot W \land P\); 兩條途徑相 \(\lor\):\(W \lor (\lnot W \land P)\); 「貨車一律付費」是凌駕一切的否決條件 \(\Rightarrow \land\,\lnot L\)。 \[\text{免費} = (W \lor (\lnot W \land P)) \land \lnot L = \boxed{(W \lor P) \land \lnot L}\]
最後一步用了 \(X \lor (\lnot X \land Y) \equiv X \lor Y\): 「週末,或者(平日)有許可證」化簡後就是「週末或有許可證」—— 週末時有沒有許可證都免費,所以 \(\lnot W\) 這個條件是多餘的。
演唱會入場
題意:持票者可入場,但 12 歲以下兒童除外——除非有成人陪同; 表演者不需要票、一律可入場。
定義變數:
| 變數 | 命題 |
|---|---|
| \(T\) | 持有門票(has a ticket) |
| \(C\) | 是 12 歲以下兒童(child under 12) |
| \(A\) | 有成人陪同(accompanied by an adult) |
| \(P\) | 是表演者(performer) |
逐步翻譯(由內而外處理雙層例外):
基本規則:「持票可入場」\(\Rightarrow T\);
第一層例外:「12 歲以下兒童除外」——但「除非有成人陪同」 又是例外的例外。真正被擋下的是「兒童且沒有成人陪同」: \(C \land \lnot A\)。所以持票入場的完整條件是 \(T \land \lnot(C \land \lnot A)\);
「表演者一律可入場(即使沒票)」是獨立途徑 \(\Rightarrow \lor\, P\)。
\[\text{可入場} = T \land \lnot(C \land \lnot A) \lor P = \boxed{(T \land (\lnot C \lor A)) \lor P}\] (最後用德摩根把 \(\lnot(C \land \lnot A)\) 展開成 \(\lnot C \lor A\): 「不是兒童,或有成人陪同」。)
檢查:持票的 10 歲兒童、無陪同(\(T{=}1,C{=}1,A{=}0,P{=}0\)): \(\lnot C \lor A = 0\) → 不可入場 ✓; 同樣的兒童有成人陪同(\(A{=}1\)):可入場 ✓; 沒票的表演者(\(P{=}1\)):可入場 ✓。
卡諾圖(Karnaugh Maps)
為下列三張真值表各畫一張 K-map,並求出對應的最簡布林表達式; 再於 Logisim 組裝等價電路(閘輸入數 \(\le 2\))驗證。
方法回顧(Lecture 1.2):列以 \(A\) 索引、欄以 \(BC\) 索引(格雷碼順序 \(00,01,11,10\)); 把相鄰的 1 圈成 \(2^n\) 大小的方框(可繞回、可重疊、框越大越好); 每框把「值不變的變數」\(\land\) 起來,再把所有框 \(\lor\) 起來。
真值表 1
真值表輸出依序為 \(1,1,1,1,1,0,1,0\)(1 的位置:\(000\)–\(100\)、\(110\))。填入 K-map:
整個第一列(\(A=0\),4 格):框內 \(B\)、\(C\) 都有變化,只有 \(A=0\) 不變 \(\Rightarrow \lnot A\);
左右兩端欄(\(BC=00\) 與 \(BC=10\),繞回相接成 \(2\times2\),4 格): 框內 \(A\)、\(B\) 都有變化,只有 \(C=0\) 不變 \(\Rightarrow \lnot C\)。
\[\text{Out} = \boxed{\lnot A \lor \lnot C}\] 驗證:\(\lnot A \lor \lnot C = 0\) 只發生在 \(A{=}1\) 且 \(C{=}1\), 即第 \(101\)、\(111\) 列——正是表中僅有的兩個 0 ✓。 Logisim 電路:2 個 NOT + 1 個 OR(共 3 個閘)。 也可以再用德摩根寫成 \(\lnot(A \land C)\)——1 個 AND + 1 個 NOT。
真值表 2
輸出依序為 \(1,1,0,0,1,1,1,0\)(1 的位置:\(000,001,100,101,110\))。填入 K-map:
左邊 \(2\times2\) 方塊(\(BC \in \{00,01\}\)、兩列都有): 只有 \(B=0\) 不變 \(\Rightarrow \lnot B\);
第二列左右兩端(\(100\) 與 \(110\),繞回相接,2 格): \(A=1\)、\(C=0\) 不變 \(\Rightarrow A \land \lnot C\)。
\[\text{Out} = \boxed{\lnot B \lor (A \land \lnot C)}\] 驗證:\(110\):\(A \land \lnot C = 1\) ✓;\(111\):兩項皆 0 → 0 ✓; \(010,011\):兩項皆 0 → 0 ✓。 Logisim 電路:\(\lnot B\)、\(\lnot C\)、AND、OR,共 4 個閘。
真值表 3
輸出依序為 \(0,1,1,1,0,0,1,0\)(1 的位置:\(001,010,011,110\))。填入 K-map:
第一列中間兩格(\(001\)、\(011\)):\(A=0\)、\(C=1\) 不變 \(\Rightarrow \lnot A \land C\);
右端整欄(\(010\)、\(110\),即 \(BC=10\)):\(B=1\)、\(C=0\) 不變 \(\Rightarrow B \land \lnot C\)。
\[\text{Out} = \boxed{(\lnot A \land C) \lor (B \land \lnot C)}\] 這裡沒有任何 4 格的框可圈(四個 1 無法排成 \(2\times2\) 或 \(1\times4\)), 兩個 2 格框就是最佳解。 驗證:\(010\):\(B \land \lnot C = 1\) ✓;\(111\):\(\lnot A \land C = 0\)、 \(B \land \lnot C = 0\) → 0 ✓。 Logisim 電路:\(\lnot A\)、\(\lnot C\)、2 個 AND、1 個 OR,共 5 個閘。
NAND 閘(NAND Gates)
運用 NAND 講次的原理,只用 2 輸入 NAND 閘在 Logisim 實作: NOT \(A\)、\(A\) AND \(B\)、\(A\) OR \(B\)、\(A\) NOR \(B\)、\(A\) XOR \(B\) (XOR 提示:從 \((\lnot A \land B) \lor (A \land \lnot B)\) 出發)。 完成後在 NAND 板上組裝驗證。 挑戰題:每個設計最少能用幾個 NAND? (XOR 提示:改從 \((\lnot A \lor \lnot B) \land (A \lor B)\) 出發!)
核心工具是雙重否定(隨時可加一對 \(\lnot\))與德摩根定律 (把 \(\lnot(\lor)\) 換成 NAND 形式);整理完成後, 否定符號的個數 = NAND 閘的個數。
NOT/AND/OR/NOR
NOT(1 個 NAND):利用冪等律 \(A \land A \equiv A\): \[\lnot A \equiv \lnot(A \land A) = \text{NAND}(A, A)\] 把同一訊號接到 NAND 的兩隻輸入腳即可。 (NAND 板小技巧:也可以接 \(\text{NAND}(A, 1)\)——用板上的常數 1 腳位。)
AND(2 個 NAND):NAND 本身就是「AND 加否定」,再補一個 NOT 抵消: \[A \land B \equiv \lnot\lnot(A \land B) = \text{NAND}\bigl(\text{NAND}(A,B),\, \text{NAND}(A,B)\bigr)\]
OR(3 個 NAND):雙重否定+德摩根: \[A \lor B \equiv \lnot\lnot(A \lor B) \equiv \lnot(\lnot A \land \lnot B) = \text{NAND}\bigl(\text{NAND}(A,A),\, \text{NAND}(B,B)\bigr)\] (OR = 兩個輸入先各自反相,再接 NAND。)
NOR(4 個 NAND):NOR 就是 OR 再取否定, 在 3 個 NAND 的 OR 後面接一個 NOT 型 NAND: \[\lnot(A \lor B) = \text{NAND}(t, t), \qquad t = \text{NAND}\bigl(\text{NAND}(A,A),\, \text{NAND}(B,B)\bigr)\]
(g) at (0,0) ; (g.in 1) – ++(-0.5,0) coordinate (j); (j) node[left]\(A\); (j) ++(0.25,0) circle (1.5pt); (j) ++(0.25,0) |- (g.in 2); (g.out) – ++(0.35,0) node[right]\(\lnot A\); |
(g1) at (0,0) ; (g2) at (2.6,0) ; (g1.in 1) – ++(-0.4,0) node[left]\(A\); (g1.in 2) – ++(-0.4,0) node[left]\(B\); (g1.out) – ++(0.25,0) coordinate (j); (j) circle (1.5pt); (j) |- (g2.in 1); (j) |- (g2.in 2); (g2.out) – ++(0.35,0) node[right]\(A \land B\); |
| NOT:1 個 | AND:2 個 |
(n1) at (0,1.1) ; (n2) at (0,-1.1) ; (g) at (2.8,0) ; (n1.in 1) – ++(-0.5,0) coordinate (ja); (ja) node[left]\(A\); (ja) ++(0.25,0) circle (1.5pt); (ja) ++(0.25,0) |- (n1.in 2); (n2.in 1) – ++(-0.5,0) coordinate (jb); (jb) node[left]\(B\); (jb) ++(0.25,0) circle (1.5pt); (jb) ++(0.25,0) |- (n2.in 2); (n1.out) – ++(0.25,0) |- (g.in 1); (n2.out) – ++(0.25,0) |- (g.in 2); (g.out) – ++(0.35,0) node[right]\(A \lor B\); |
(n1) at (0,1.1) ; (n2) at (0,-1.1) ; (g) at (2.8,0) ; (h) at (5.4,0) ; (n1.in 1) – ++(-0.5,0) coordinate (ja); (ja) node[left]\(A\); (ja) ++(0.25,0) circle (1.5pt); (ja) ++(0.25,0) |- (n1.in 2); (n2.in 1) – ++(-0.5,0) coordinate (jb); (jb) node[left]\(B\); (jb) ++(0.25,0) circle (1.5pt); (jb) ++(0.25,0) |- (n2.in 2); (n1.out) – ++(0.25,0) |- (g.in 1); (n2.out) – ++(0.25,0) |- (g.in 2); (g.out) – ++(0.25,0) coordinate (jc); (jc) circle (1.5pt); (jc) |- (h.in 1); (jc) |- (h.in 2); (h.out) – ++(0.35,0) node[right]\(A\) NOR \(B\); |
| OR:3 個 | NOR:4 個 |
XOR(照提示:5 個 NAND)
從提示公式出發,套雙重否定與德摩根: \[\begin{array}{cl} & (\lnot A \land B) \lor (A \land \lnot B) \\ \equiv & \lnot\lnot\bigl((\lnot A \land B) \lor (A \land \lnot B)\bigr) \quad\text{【雙重否定】} \\ \equiv & \lnot\bigl(\lnot(\lnot A \land B) \land \lnot(A \land \lnot B)\bigr) \quad\text{【德摩根】} \\ \end{array}\] 數否定:\(\lnot A\)、\(\lnot B\) 各 1 個(輸入複製型 NAND), \(\lnot(\lnot A \land B)\)、\(\lnot(A \land \lnot B)\)、最外層 \(\lnot(\cdots\land\cdots)\) 各 1 個——共 5 個 NAND:
| 編號 | 接線 |
|---|---|
| NAND 1 | \(\lnot A = \text{NAND}(A, A)\) |
| NAND 2 | \(\lnot B = \text{NAND}(B, B)\) |
| NAND 3 | \(\text{NAND}(\lnot A,\, B)\) |
| NAND 4 | \(\text{NAND}(A,\, \lnot B)\) |
| NAND 5 | 輸出 \(= \text{NAND}(\text{NAND 3},\, \text{NAND 4})\) |
挑戰題:最佳化 NAND 數
XOR 可降到 4 個 NAND。關鍵是挑戰題提示的公式 \((\lnot A \lor \lnot B) \land (A \lor B)\): 由德摩根,\(\lnot A \lor \lnot B \equiv \lnot(A \land B)\)—— 第一項本身就是一個 NAND!令 \(N = \text{NAND}(A,B)\): \[\begin{array}{cl} & A \oplus B \equiv N \land (A \lor B) \\ \equiv & (N \land A) \lor (N \land B) \quad\text{【分配律】} \\ \equiv & \lnot\bigl(\lnot(N \land A) \land \lnot(N \land B)\bigr) \quad\text{【雙重否定+德摩根】} \\ = & \text{NAND}\bigl(\text{NAND}(N, A),\, \text{NAND}(N, B)\bigr) \\ \end{array}\]
(n1) at (2.2,2.0) ; (n2) at (4.6,3.0) ; (n3) at (4.6,1.0) ; (n4) at (7.0,2.0) ; (n2.in 1) – (n2.in 1 -| 0,0) node[left]\(A\); (n2.in 1 -| 0.9,0) circle (1.5pt); (n2.in 1 -| 0.9,0) |- (n1.in 1); (n3.in 2) – (n3.in 2 -| 0,0) node[left]\(B\); (n3.in 2 -| 0.9,0) circle (1.5pt); (n3.in 2 -| 0.9,0) |- (n1.in 2); (n1.out) – ++(0.25,0); (\((n1.out)+(0.25,0)\)) circle (1.5pt); (\((n1.out)+(0.25,0)\)) |- (n2.in 2); (\((n1.out)+(0.25,0)\)) |- (n3.in 1); (n2.out) – ++(0.25,0) |- (n4.in 1); (n3.out) – ++(0.25,0) |- (n4.in 2); (n4.out) – ++(0.4,0) node[right]\(A \oplus B\);
各實作的已知最少 2 輸入 NAND 數(可與你的設計對照):
| 函數 | 照講義方法 | 最少 | 說明 |
|---|---|---|---|
| NOT | 1 | 1 | 已是最少 |
| AND | 2 | 2 | 已是最少 |
| OR | 3 | 3 | 已是最少 |
| NOR | 4 | 4 | OR+NOT,已是最少 |
| XOR | 5 | 4 | 用 \(N=\text{NAND}(A,B)\) 共用的技巧 |
為什麼 4 個 NAND 的 XOR 有效?直覺:\(N = \lnot(A \land B)\) 在 「\(A\)、\(B\) 不全為 1」時為 1。\(\text{NAND}(N,A) = \lnot(A \land \lnot B)\) (把 \(N\) 展開化簡),\(\text{NAND}(N,B) = \lnot(B \land \lnot A)\), 最後一個 NAND 把兩者合成 \((A \land \lnot B) \lor (B \land \lnot A)\)——正是 XOR。
NAND 板實作提醒:上板前先在 Logisim 畫好「全 NAND」版本, 為每個閘編號(NAND 1、2、…),再決定各對應板上哪個實體閘、 按編號順序接線並逐一打勾——課程網站特別強調系統化接線可避免 「一團理不清的電線」。板上按鈕未按 = 0、按下 = 1; 未接線的輸入預設為 0(下拉電路);需要 1 就接常數 1 腳位。
五變數邏輯(5-variable Logic)
為給定的 5 變數真值表求最簡布林表達式:仿照 Lecture 1.2 結尾的做法, 先建立兩張 4 變數卡諾圖(\(BC \backslash DE\)),分別代表 \(A=0\) 與 \(A=1\); 再在 Logisim 組裝等價電路(閘輸入數 \(\le 2\))驗證全部 32 種輸入組合。 挑戰題:改建一張 5 變數卡諾圖——把兩張 4 變數圖的圈選畫上去, 你注意到什麼?(提示:需要 3 位元格雷碼來排列 \(ABC\)。)
整理真值表
原題真值表(32 列)輸出為 1 的輸入組合共 14 個:
| \(A\) | \(B\) | \(C\) | \(D\) | \(E\) | Out | \(A\) | \(B\) | \(C\) | \(D\) | \(E\) | Out |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
| 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 |
| 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 |
| 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 |
| 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
| 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 |
| 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
| 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 |
| 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
| 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |
| 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 |
| 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 |
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
兩張 4 變數卡諾圖
把 \(A=0\) 與 \(A=1\) 的 16 列各自填入一張 \(BC \backslash DE\) 卡諾圖 (列、欄皆為格雷碼順序 \(00,01,11,10\)):
| \(A = 0\) | \(A = 1\) |
\(A=0\) 圖的圈選:
右邊兩欄整塊(\(DE \in \{11,10\}\),8 格全為 1): 只有 \(D=1\) 不變 \(\Rightarrow D\);
中間兩列的 \(DE=00\) 欄(2 格):\(C=1\)、\(D=0\)、\(E=0\) 不變 \(\Rightarrow C \land \lnot D \land \lnot E\)。
(單看這張圖,這 2 格其實可以和右邊 \(DE=10\) 欄的鄰格圈成更大的 \(C \land \lnot E\) 繞回方框;但下面會看到, 選 \(C \land \lnot D \land \lnot E\) 能跟 \(A=1\) 圖疊合,整體更省。)
\(A=1\) 圖的圈選:
中間兩列的 \(DE=00\) 欄(2 格): \(\Rightarrow C \land \lnot D \land \lnot E\) —— 與 \(A=0\) 圖同位置、同形狀!
最下列 \(DE \in \{11,10\}\)(2 格):\(B=1\)、\(C=0\)、\(D=1\) 不變 \(\Rightarrow B \land \lnot C \land D\)。
疊合(overlay)兩張圖:
\(C \land \lnot D \land \lnot E\) 在兩張圖的相同位置都出現 \(\Rightarrow\) 此框跨越 \(A=0\) 與 \(A=1\),變數 \(A\) 被消去: 項為 \(C \land \lnot D \land \lnot E\);
\(D\) 大框只出現在 \(A=0\) 圖 \(\Rightarrow \lnot A \land D\);
\(B \land \lnot C \land D\) 只出現在 \(A=1\) 圖 \(\Rightarrow A \land B \land \lnot C \land D\)。
\[\text{Out} = \boxed{(C \land \lnot D \land \lnot E) \lor (\lnot A \land D) \lor (A \land B \land \lnot C \land D)}\]
覆蓋檢查:三項覆蓋的 1 互不重疊—— 第一項含 \(D=0\)(4 個:\(00100, 01100, 10100, 11100\))、 第二項 \(A=0, D=1\)(8 個)、第三項 \(A=1\)(2 個:\(11010, 11011\)), 合計 \(4+8+2 = 14\) 個,與真值表的 14 個 1 完全一致 ✓。
Logisim 電路(閘輸入 \(\le 2\)): 反相器 \(\lnot A, \lnot C, \lnot D, \lnot E\)(4 個 NOT)、 第一項 2 個 AND、第二項 1 個 AND、第三項 3 個 AND、最後 2 個 OR—— 共 12 個閘。
再省一點(進階):把第二、三項先提出公因子 \(D\): \[\text{Out} = \bigl(D \land (\lnot A \lor (B \land \lnot C))\bigr) \lor (C \land \lnot D \land \lnot E)\] (用了 \(\lnot A \lor (A \land B \land \lnot C) \equiv \lnot A \lor (B \land \lnot C)\), 即 \(\lnot X \lor (X \land Y) \equiv \lnot X \lor Y\)。) 這個因式化版本只需 4 NOT + 4 AND + 2 OR = 10 個閘, 且是下一大題 NAND 轉換的絕佳起點。
挑戰題:5 變數卡諾圖
3 位元二進位反射格雷碼:\(000, 001, 011, 010, 110, 111, 101, 100\)。 以它排列 \(ABC\)(列)、以 2 位元格雷碼排列 \(DE\)(欄),得 \(8 \times 4\) 的 5 變數 K-map (塗色即上面三個群):
| \(D\,E\) | ||||
| \(A\,B\,C\) | 00 | 01 | 11 | 10 |
| 000 | 0 | 0 | 1 | 1 |
| 001 | 1 | 0 | 1 | 1 |
| 011 | 1 | 0 | 1 | 1 |
| 010 | 0 | 0 | 1 | 1 |
| 110 | 0 | 0 | 1 | 1 |
| 111 | 1 | 0 | 0 | 0 |
| 101 | 1 | 0 | 0 | 0 |
| 100 | 0 | 0 | 0 | 0 |
| \(\lnot A \land D\)(\(4\times2\),上半部) | |
| \(C \land \lnot D \land \lnot E\)(\(DE{=}00\) 欄,鏡射相鄰) | |
| \(A \land B \land \lnot C \land D\)(第 110 列右兩格) |
觀察到什麼?這張圖的上半部(前 4 列)就是 \(A=0\) 的 4 變數圖、 下半部(後 4 列)就是 \(A=1\) 的圖(列序反射)。 兩張 4 變數圖同位置的圈選在這裡合併成一個更大的圈: 橙色的 \(C \land \lnot D \land \lnot E\) 佔了第 2、3 列與第 6、7 列—— 它們在圖上不相鄰,但在 5 變數 K-map 中, 以中線為鏡的上下對稱列只差 \(A\) 一個位元 (例如 \(001 \leftrightarrow 101\)、\(011 \leftrightarrow 111\)), 因此是合法的相鄰關係,四格合成一框、消去 \(A\)。 這正是「兩張 4 變數圖疊合」在單張圖上的樣子—— 也解釋了為什麼 5 變數以上的 K-map 較難用: 除了普通相鄰與繞回,還得檢查鏡射相鄰,人眼容易漏看。
NAND 實作(NAND Implementation)
只用 2 輸入 NAND 閘在 Logisim 重新實作上一大題的 5 變數電路。 提示:把原設計中每個閘換成它的 NAND 實作即可(不易最佳化,但符合題目要求)。 挑戰題:在 NAND 板上實作你的 5 變數 NAND 電路! (需要 \(\le 16\) 個 NAND、清楚的轉移系統, 以及「只有 4 個按鈕如何表示 5 個輸入」的辦法。)
方法一:逐閘替換(照提示)
把 12 閘 SOP 電路的每個閘換成 NAND 實作: NOT \(\to\) 1 個、AND \(\to\) 2 個、OR \(\to\) 3 個: \[4 \times 1 + 6 \times 2 + 2 \times 3 = \textbf{22 個 NAND}\] (用 10 閘因式化電路出發則是 \(4 + 8 + 6 = 18\) 個。) 這樣做正確但浪費——很多「NAND + NOT 型 NAND」對其實是雙重否定,可整對刪除。 下面用代數方法直接推出精簡版。
方法二:代數轉換(10 個 NAND)
從 10 閘因式化式子出發: \[\text{Out} = \bigl(D \land F\bigr) \lor T, \qquad F = \lnot A \lor (B \land \lnot C), \qquad T = C \land \lnot D \land \lnot E\]
轉換 \(F\)(3 個 NAND):\(F\) 的形式是 \(\lnot X \lor Y\), 而 \(\lnot X \lor Y \equiv \lnot(X \land \lnot Y) = \text{NAND}(X, \lnot Y)\): \[F = \lnot\bigl(A \land \lnot(B \land \lnot C)\bigr) = \text{NAND}\bigl(A,\ \text{NAND}(B, \lnot C)\bigr), \qquad \lnot C = \text{NAND}(C,C)\]
轉換最外層 OR(各給一個否定): \(X \lor Y = \text{NAND}(\lnot X, \lnot Y)\), 所以只需要 \(\lnot(D \land F)\)(本身就是一個 NAND!)與 \(\lnot T\)。
轉換 \(\lnot T\)(5 個 NAND): \(T = C \land (\lnot D \land \lnot E)\),先做 \(\lnot D \land \lnot E\)(3 個), 再 \(\lnot T = \text{NAND}(C, \lnot D \land \lnot E)\)。
完整接線表(10 個 NAND):
| 編號 | 接線 | 輸出訊號 | 說明 |
|---|---|---|---|
| N1 | \(\text{NAND}(C,\, C)\) | \(\lnot C\) | 反相器 |
| N2 | \(\text{NAND}(B,\, \text{N1})\) | \(\lnot(B \land \lnot C)\) | |
| N3 | \(\text{NAND}(A,\, \text{N2})\) | \(F = \lnot A \lor (B \land \lnot C)\) | 德摩根 |
| N4 | \(\text{NAND}(D,\, \text{N3})\) | \(\lnot(D \land F)\) | 最外層 OR 的左臂 |
| N5 | \(\text{NAND}(D,\, D)\) | \(\lnot D\) | 反相器 |
| N6 | \(\text{NAND}(E,\, E)\) | \(\lnot E\) | 反相器 |
| N7 | \(\text{NAND}(\text{N5},\, \text{N6})\) | \(\lnot(\lnot D \land \lnot E)\) | |
| N8 | \(\text{NAND}(\text{N7},\, \text{N7})\) | \(\lnot D \land \lnot E\) | 反相器 |
| N9 | \(\text{NAND}(C,\, \text{N8})\) | \(\lnot T\) | 最外層 OR 的右臂 |
| N10 | \(\text{NAND}(\text{N4},\, \text{N9})\) | \(\text{Out} = (D \land F) \lor T\) | 德摩根合成 OR |
(N1) at (1.6,5.6) ; (N2) at (4.2,6.1) ; (N3) at (6.8,6.6) ; (N4) at (9.4,6.1) ; (N5) at (1.6,2.6) ; (N6) at (1.6,1.0) ; (N7) at (4.2,1.8) ; (N8) at (6.4,1.8) ; (N9) at (8.6,2.4) ; (N10) at (11.8,4.2) ; (N1.in 1) – ++(-0.5,0) coordinate (jc); (jc) node[left]\(C\); (jc) ++(0.25,0) circle (1.5pt); (jc) ++(0.25,0) |- (N1.in 2); (N2.in 1) – ++(-3.0,0) node[left]\(B\); (N1.out) – ++(0.25,0) |- (N2.in 2); (N3.in 1) – ++(-5.6,0) node[left]\(A\); (N2.out) – ++(0.25,0) |- (N3.in 2); (N4.in 2) – ++(-0.6,0) node[left]\(D\); (N3.out) – ++(0.25,0) |- (N4.in 1); (N5.in 1) – ++(-0.5,0) coordinate (jd); (jd) node[left]\(D\); (jd) ++(0.25,0) circle (1.5pt); (jd) ++(0.25,0) |- (N5.in 2); (N6.in 1) – ++(-0.5,0) coordinate (je); (je) node[left]\(E\); (je) ++(0.25,0) circle (1.5pt); (je) ++(0.25,0) |- (N6.in 2); (N5.out) – ++(0.25,0) |- (N7.in 1); (N6.out) – ++(0.25,0) |- (N7.in 2); (N7.out) – ++(0.25,0) coordinate (j7); (j7) circle (1.5pt); (j7) |- (N8.in 1); (j7) |- (N8.in 2); (N9.in 1) – ++(-0.6,0) node[left]\(C\); (N8.out) – ++(0.25,0) |- (N9.in 2); (N4.out) – ++(0.3,0) |- (N10.in 1); (N9.out) – ++(0.3,0) |- (N10.in 2); (N10.out) – ++(0.4,0) node[right]Out;
(圖中 \(C\)、\(D\) 各出現兩處——在 Logisim/NAND 板上從同一輸入分支即可。)
抽查驗證(對照真值表):
\(10100\)(\(A{=}1, C{=}1\),其餘 0):N1\({}=0\),N2\({}=1\),N3\({}=0\), N4\({}=1\);N5\({}=1\),N6\({}=1\),N7\({}=0\),N8\({}=1\),N9\({}=\text{NAND}(1,1)=0\); N10\({}=\text{NAND}(1,0)=1\) ✓(表中此列為 1)。
\(11110\)(\(A,B,C,D{=}1, E{=}0\)):N1\({}=0\),N2\({}=1\),N3\({}=0\), N4\({}=\text{NAND}(1,0)=1\);N5\({}=0\),N8\({}=0\),N9\({}=1\); N10\({}=\text{NAND}(1,1)=0\) ✓(表中為 0)。
\(00010\)(僅 \(D{=}1\)):N3\({}=\text{NAND}(0,\cdot)=1\), N4\({}=\text{NAND}(1,1)=0\);N10\({}=\text{NAND}(0,\cdot)=1\) ✓。
挑戰題:搬上 NAND 板
閘數:精簡版只用 10 個 NAND,遠低於板上的 16 個上限 ✓ (逐閘替換的 22 或 18 個就放不下了——這就是題目要你先最佳化的原因)。
轉移系統:照上面的接線表逐列接線—— 每列就是「一個實體 NAND 的兩隻輸入接到哪」的說明書; 接完一列就在表上打勾。輸入 \(C\)、\(D\) 用到多次: 利用每個按鈕旁的 4 個複製腳位分支即可。 每個 NAND 的 LED 可以幫你逐級除錯: 從 N1 開始逐一核對中間訊號(表中「輸出訊號」欄)再往後接。
4 個按鈕表示 5 個輸入:板上只有 4 個按鈕,但輸入有 \(A\)–\(E\) 共 5 個。 可行做法——把其中一個變數「定值」,分兩輪測試:
第一輪(\(E=0\)):\(E\) 的兩隻腳不接線 (板上未接輸入因下拉電路預設為 0), 用 4 個按鈕跑 \(A,B,C,D\) 的 16 種組合,核對真值表的 \(E=0\) 列;
第二輪(\(E=1\)):把 \(E\) 改接到常數 1 腳位, 再跑 16 種組合,核對 \(E=1\) 列。
選 \(E\) 當定值變數最省事:\(E\) 在電路裡只進入 N6 一個閘,換線只動一條。 (更聰明的觀察:\(E=1\) 時 \(T \equiv 0\),整個下半電路輸出恆定, 可以只驗證上半 \(D \land F\) 的行為。)
總結:本 Lab 的完整工作流程—— 真值表 \(\to\)(DNF/CNF 或 K-map)\(\to\) 最簡布林式 \(\to\) AND/OR/NOT 電路(Logisim 驗證)\(\to\) 雙重否定+德摩根轉成純 NAND \(\to\) NAND 板實體驗證。每一步都有系統化的方法, 而「先化簡再實作」貫穿全部:更少的閘 = 更低的能耗、更快的電路、 更容易接對線。