數位邏輯與基本元件

NAND 的功能完備性(functional completeness of NAND)

/ nand /

有一個令人驚訝的事實:你不需要一整套不同的閘才能打造計算機。單單一個 NAND 閘就夠了。給工廠的只有 NAND 閘,他們就能接出 AND、OR、NOT、XOR——所有存在的邏輯函數。這個性質叫功能完備性,而 NAND(連同 NOR)是一種通用閘。這就像發現一種形狀的樂高積木,只要數量夠多,就能拼出任何模型。

證明只需三個構造。NAND(A,B) 表示 not(A AND B)。首先是 NOT:把同一個訊號送進兩個輸入——NAND(A,A) = not(A AND A) = not A。有了 NOT,就能造 AND:NAND 本來就給出「非 AND」,在它後面接一個 NOT 即可,AND(A,B) = NOT(NAND(A,B))。而 OR 來自德摩根:A OR B = not((not A) AND (not B)) = NAND(NOT A, NOT B),其中每個 NOT 本身又是一個 NAND。所以單憑 NAND 就能重建整套基本閘,再從這些閘建出真值表能指定的任何東西。

它在實務上為何重要:在 CMOS 裡,NAND 和 NOR 其實是最自然、最便宜製造的閘——普通的 AND 或 OR 是用一個 NAND 或 NOR 後面再接一個反相器來做,所以更貴而非更便宜。因此晶片設計者常以 NAND/NOR 來思考。誠實的提醒:「你只需要 NAND」講的是可能性,不是效率。真實設計會用一個包含許多尺寸的豐富閘庫,因為全部用單一種閘來建雖然永遠可行,卻會白白變得又慢又大。

用一個 NAND 造 NOT:把一個 NAND 的兩個輸入都接到輸入 X。輸出就是 not(X AND X) = not X。再用兩個 NAND 造 AND:第一個 NAND 給出 not(A AND B),第二個(當作 NOT 用)把它反相回 A AND B。兩塊通用積木,一個真正的 AND 閘。

任何邏輯,都能用同一種閘的複本拼出來——原理上可行,這正是 NAND 被稱為通用閘的原因。

通用性不等於最佳性。沒錯,單用 NAND 能建出任何東西,但全部由 NAND 構成的電路通常比用完整閘庫的電路更大更慢——「能做」不等於「該做」。

又稱
universal gate通用閘NAND 通用性