邏輯閘是什麼?用AND、OR、NOT計算的原理
邏輯閘是接收0或1的輸入,再依固定規則輸出0或1的小電路。有「兩個都是1才輸出1」的AND、「任一個是1就輸出1」的OR、「變成相反」的NOT等種類。每一種都是把幾個到十幾個電晶體連接起來做成的。把邏輯閘組合起來,就能做加法,也能完成CPU裡複雜的計算。
這篇文章可以了解
- 邏輯閘是做什麼的電路,以及6種邏輯閘(NOT、AND、OR、NAND、NOR、XOR)的規則
- 開關的串聯、並聯和AND、OR的關係
- 用4個電晶體做出NAND閘的原理
- 只用NAND就能做出任何電路的理由,以及邏輯閘的延遲為什麼會決定時脈的快慢
先備知識:知道「電晶體是用電來切換的開關」和「電腦把電壓的高、低當成1和0」這2件事,會比較容易閱讀。
生活中的例子
微波爐要在門關好,而且按下開始鍵時,才會開始加熱。汽車只要有任何一扇門沒關,就會亮起警示燈。樓梯的電燈,不論用樓上或樓下的開關,都能打開或關掉。
這3個例子,都是「根據幾個條件,決定要不要動作」的規則。第1個是「兩個條件都成立時」,第2個是「只要有任何一個」,第3個是「2個開關的方向相同還是不同」。用0和1來計算這種規則的小電路,就是邏輯閘。
實際的微波爐和汽車,有很多是交給微控制器(小型電腦晶片)做這類判斷。而微控制器的內部,也是由邏輯閘組成的。
邏輯閘是「遵守0和1規則的電路」
在電腦的電路中,電壓高的狀態當作1,低的狀態當作0。邏輯閘從入口(輸入)接收0或1,再從出口(輸出)送出0或1。輸入的數量,有1個的,也有2個以上的。什麼輸入會得到什麼輸出,依邏輯閘的種類而定,不會改變。
邏輯閘的規則,用表格寫出來就很清楚。列出所有輸入組合與當時輸出的表,稱為真值表。輸入有2個時,組合是00、01、10、11共4種,所以表格只要4列。
另外,這裡說的「閘」,是處理0和1的電路的一個單位。電晶體的一個電極(電的出入口)也叫做「閘極」,但意思不同。
基本的3種:NOT、AND、OR
NOT:變成相反
NOT閘(反閘)只有1個輸入,輸入0就輸出1,輸入1就輸出0。因為會把輸入反過來,也稱為反相器。
| 輸入A | NOT的輸出 |
|---|---|
| 0 | 1 |
| 1 | 0 |
AND:兩個都是1時才是1
AND閘(及閘)只有在輸入兩個都是1時,才輸出1。只要有一個是0,就輸出0。這相當於微波爐「門關好」而且「按下按鍵」的判斷。
OR:任一個是1就是1
OR閘(或閘)只要輸入中任一個是1,就輸出1。只有兩個都是0時,才輸出0。這相當於汽車「只要有任何一扇門開著就警示」。
| A | B | AND | OR |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 1 |
AND和OR的輸入不一定是2個。如果是3輸入的AND,就只有3個都是1時才輸出1。
加上反相的同伴,以及XOR
把AND的輸出用NOT反過來,稱為NAND閘(反及閘)。名稱是Not AND的縮寫。同樣地,把OR反相的是NOR閘(反或閘)。NAND是「兩個都是1時才是0」,NOR是「兩個都是0時才是1」。
另一種常用的是XOR閘(互斥或閘)。它在2個輸入不同時,也就是只有其中一個是1時,輸出1。樓梯的電燈,用的就是和XOR相同的性質。切換任一個開關,2個開關的方向就會在「相同」和「不同」之間交換,電燈也跟著亮或滅。
| A | B | NAND | NOR | XOR |
|---|---|---|---|---|
| 0 | 0 | 1 | 1 | 0 |
| 0 | 1 | 1 | 0 | 1 |
| 1 | 0 | 1 | 0 | 1 |
| 1 | 1 | 0 | 0 | 0 |
NAND這一欄,就是把前面AND那一欄的0和1全部對調。NOR這一欄,也是把OR那一欄對調而成的。
用開關的串聯和並聯來想
AND和OR可以用電池、燈泡和開關的電路來想像。把2個開關接成一排,稱為串聯;分成2條路並排,稱為並聯。在下圖中,請把開關接通的狀態當作1,燈泡亮起當作1。
串聯時,電必須通過A和B兩個開關,才能到達燈泡。所以只有兩個都接通時,燈泡才會亮。這和AND的真值表相同。並聯時,電走哪一條路都可以,所以只要接通其中一個就會亮。這和OR相同。
開關電路和0與1的邏輯計算是互相對應的。在1930年代把這件事寫成論文的,是後來創立資訊理論的克勞德·夏農。他證明了電話交換機所用的繼電器(用電磁鐵帶動的開關)電路,可以用算式整理並設計出來。
用電晶體做出邏輯閘
晶片裡的邏輯閘,是用稱為MOSFET的電晶體做成的。MOSFET是用加在閘極上的電壓,讓電流的通路接通或切斷的開關。這個原理在「電晶體是什麼?」中說明。
MOSFET有動作完全相反的2種。nMOS在輸入為1時接通,pMOS在輸入為0時接通。把這2種組合起來做邏輯閘的方式稱為CMOS,現在的晶片幾乎都採用這種方式。最簡單的NOT閘,只要pMOS和nMOS各1個,共2個就能做出來。
NAND閘用4個電晶體
2輸入的NAND閘,由2個pMOS和2個nMOS,共4個電晶體組成。在讓輸出變成1的電源+端,把2個pMOS並聯。在讓輸出變成0的0 V端,把2個nMOS串聯。
A和B都是1時,串聯的2個nMOS都會接通。輸出接到0 V端,變成0。這時2個pMOS都是斷開的。
A或B其中一個是0時,串聯的nMOS有1個斷開,通往0 V端的路就沒有了。取而代之的是,輸入0的那個pMOS接通,輸出接到電源的+端,變成1。這樣就做出了「兩個都是1時才是0」的NAND規則。
不論是哪一種輸入,上下兩條路中一定有一條是斷開的。電流不會一直從電源流到0 V端,所以保持輸出時幾乎不耗電。這就是CMOS的優點。
AND比NAND更費工
在CMOS中,輸入變成1時nMOS會接通,把輸出拉向0 V端。因此,只用上下各一組pMOS和nMOS就能做出的,只有輸入變成1時輸出會變成0的邏輯閘。NOT、NAND、NOR都是這種形式。AND通常是在NAND後面接一個NOT,用4個+2個共6個電晶體做成。OR也一樣,是在NOR後面接NOT做成的。
只用NAND,就能做出任何電路
NAND閘有一個有趣的性質。只要把大量的NAND組合起來,從NOT、AND、OR開始,任何規則的電路都做得出來。具有這種性質的邏輯閘,稱為萬用邏輯閘。
首先是NOT的做法。在NAND的2個輸入都送進同一個訊號A。真值表中「0和0」那一列輸出1,「1和1」那一列輸出0。也就是會輸出和A相反的值,所以能當作NOT使用。
接著是AND。NAND是「把AND反相的東西」,所以把它的輸出再反相一次,就變回AND。反相就用剛才用NAND做的NOT。用2個NAND,就能做出AND。
OR的做法,是先把A和B分別用NOT反相,再送進NAND。A和B都是0時,反相後兩個都是1,NAND輸出0。其他情況下,反相後的輸入至少有一個是0,輸出就是1。這正是「兩個都是0時才是0」的OR規則。像這樣「搭配反相,就能讓AND和OR互換」的規則,稱為笛摩根定理。只要能做出NOT、AND、OR,任何真值表的電路都組得出來。
同樣的事,NOR閘也辦得到。1969年登陸月球的阿波羅太空船,它的導引電腦就利用了這個性質。所用的IC(積體電路)約2,800個,幾乎全是「內含2個3輸入NOR閘的IC」這一種。當時的IC還很新,是使用實績很少的零件。因為需要很高的可靠度,就統一成單純的一種,讓可靠度更容易確認。
不過,現在的晶片並不是只用NAND做的。只用NAND的話,即使是功能相同的電路,零件也會變多,而且容易變慢。實際的設計中,除了NAND、NOR、NOT,也會把常用的組合整合成一個零件,依用途分別使用。
組合邏輯閘來計算
把邏輯閘的輸出接到下一個邏輯閘的輸入,就能做出更複雜的規則。例如,二進位1位數的加法,只要並排1個XOR和1個AND就能完成。XOR算出「這一位的答案」,AND算出「往上一位的進位」。這個電路稱為半加器。
把半加器擴充成可以加任意位數的方法,在「電腦怎麼用0和1計算?」中有詳細說明。另外,在邏輯電路模擬器中,可以排列邏輯閘、切換開關,做出真值表來確認。也能載入「只用NAND做出XOR」的範例。
像加法電路這樣,輸出只由當下的輸入決定的電路,稱為組合電路。另一方面,如果把邏輯閘的輸出接回自己的輸入,也能做出記住先前狀態的電路。這種電路稱為循序電路,在CPU中用來記住計算途中的數字。兩者的差異,可以在「組合邏輯電路與循序邏輯電路的差異」的表格中比較。
邏輯閘有「延遲」
即使切換了邏輯閘的輸入,輸出也不會在那一瞬間改變。因為電晶體切換、把電存進下一個邏輯閘的輸入,都需要一點時間。從輸入改變到輸出改變為止的時間,稱為傳播延遲。
舉例來看當作零件販售的NAND閘IC「74HC00」的說明書(資料手冊)。在電源4.5 V下使用,依規定的測試條件量到的延遲,典型值是9奈秒(奈是10億分之1)。晶片裡的邏輯閘小得多,連接的對象也很近,所以延遲是皮秒(1兆分之1秒)等級。
CPU配合稱為時脈的固定間隔訊號,一步一步推進計算。在1次訊號的間隔中,訊號要依序通過好幾級邏輯閘,並且在下一次訊號之前讓答案穩定下來。因此,經過的邏輯閘最多、延遲最大的路徑,決定了時脈最快能到多少。這條路徑稱為關鍵路徑。
用數字來想一想。3 GHz的時脈,訊號的間隔約333皮秒。為了說明,假設1級的延遲是10皮秒,最多只能串接約33級。實際上,還必須扣掉配線的延遲,以及記住答案的電路所需的時間。配線延遲的原理,在「時間常數RC是什麼?」中說明。
常見的誤解
誤解:邏輯閘裡面有像用手切換那樣的小開關在動
實際上,完全沒有會動的零件。邏輯閘中的電晶體,是依前一個邏輯閘輸出的電壓,以電的方式接通或斷開。人會去切換的,只有像鍵盤這樣的入口部分。在晶片裡,邏輯閘的輸出切換下一個邏輯閘的連鎖反應,以每秒數十億次的速度發生。這是從開關的比喻,或以前用繼電器(用電磁鐵移動金屬接點的開關)做的計算機印象,容易產生的誤解。
誤解:0剛好是0 V,1剛好是1 V(或和電源相同的電壓)
實際上,0和1各自是由電壓的「範圍」決定的。74HC00在電源4.5 V下使用時,輸入在1.35 V以下讀成0,在3.15 V以上讀成1。介於兩者之間的電壓,會讀成哪一個並沒有規定。另一方面,輸出保證0時在0.1 V以下,1時在4.4 V以上(輸出電流小的時候)。例如1的輸出在4.4 V以上,所以就算雜訊讓它下降1.25 V,仍在讀成1的3.15 V以上。0的那一側同樣有1.25 V的餘裕。這個餘裕稱為雜訊邊限,配線上即使有一點雜訊也不會讀錯0和1,就是靠它。晶片內部以更低的電壓運作,但用範圍來讀的想法相同。
誤解:AND和OR是基本零件,NAND和NOR是再加上零件的複雜東西
實際上,在CMOS晶片中正好相反。2輸入的NAND和NOR用4個電晶體就能做出,AND和OR則要再加上反相用的2個,共需6個。在真值表學到的順序(AND在前、NAND在後),和在電路上容易製作的順序並不相同。
從數字來看
| 項目 | 數量 |
|---|---|
| CMOS的NOT閘 | 電晶體2個 |
| CMOS的2輸入NAND、NOR | 電晶體4個 |
| CMOS的2輸入AND、OR | 電晶體6個 |
| IC「74HC00」1個 | 2輸入NAND閘4個 |
| 阿波羅導引電腦(1960年代) | IC約2,800個(幾乎都內含2個NOR閘) |
| 英特爾4004(1971年) | 電晶體約2,300個 |
| Apple A17 Pro(2023年) | 電晶體約190億個 |
在晶片設計中,有時會用「相當於幾個2輸入NAND閘」來表示電路的大小。把A17 Pro的約190億個單純除以NAND的4個,約相當於48億個(本站的粗略計算)。不過,實際的晶片中,也有很多像記憶用電路這類和邏輯閘形狀不同的部分。這個數字只是用來估計大小的參考。
進一步學習
- 動手試試:邏輯電路模擬器(把邏輯閘連起來讓它動作)、卡諾圖與邏輯式化簡工具(用更少的邏輯閘做出相同功能)
- 用表格看差異:CMOS與TTL的差異(製作邏輯閘的2種方式)、nMOS與pMOS的差異
- 下一步的用語:多工器(選擇輸入並讓它通過的電路)、正反器(記住1位元的電路)、突波(因延遲差而瞬間出現的錯誤輸出)
- 用圖來看:NOT閘的電晶體排列,可以在圖解「CMOS反相器」中看到
- 繼續閱讀:邏輯閘的集合如何執行指令,在「CPU是什麼?」中說明