概述
用了這麼久計算機, 都知道計算機有一個核心部件叫 CPU, 而 CPU中有一個小部件叫做全加器. 它是用來做什麼的呢? 看名字就知道了, 做加法運算用的. 那麼如何實現一個全加器呢?
你以爲這又是一篇計算機內部原理的文章? 不, 放開那個女孩, 和我一起走進中學物理的課堂.
問題
先把問題拋出來, 我們的全加器大概就長這樣.
輸入端放進來兩個數字, 然後輸出端返回兩個數字的和.
拋開全加器不說, 首要問題是: 用什麼來標識輸入和輸出的數字呢?
輸入輸出
當然了, 輸出輸出端都是導線, 要通過電流來表示. 那就使用電的特徵咯.
方案一
簡單粗暴, 使用電壓. 數字1表示爲1V, 數字10就是10V.
但是, 這個時候如果來了一個數字是10萬呢? 整個10萬 V 的電壓, 別鬧, 那還怎麼抱在手裏愉快的玩耍, 難道你不想玩手遊了?
方案二
既然電壓太高不可取. 人體的安全電壓是36V, 也就是隻要電壓不高於36V 就可以了. 我們可以用一根導線來表示十進制的一位, 這樣就可以將電壓控制在0-9V 之間了. 嗯, 安全.
但是, 電壓是不穩定的. 但是可以規定 8.6-9.5V=9. 嗯, 這個方案確實可行, 至少咱沒有看出什麼問題來. (據說現在已經有十進制的了??) 但是彆着急, 看下一個方案.
方案三
想一下, 除了電壓, 電還有什麼特徵呢? 電流? 功率? 開閉? 就是開閉. 一個電路要麼連通, 要麼斷開, 簡單明瞭沒有歧義.
用電路的開閉如何表示數呢? 表示不了十進制, 還表示不了二進制麼..
好, 就是它了, 實現簡單方便.
輸入輸出的問題解決了, 剩下的就是全加器的構造了, 二進制的運算就不說了. 現在, 全加器應該長這樣:
爲什麼是三個輸入數字呢? c是進位. 那爲什麼是兩個輸出呢? y 是進位.
電路的邏輯運算
在開始全加器之前, 先來複習一下高中的物理知識.
還記得這個東西麼?
畫的醜了一些, 湊合看. 他可以將電場轉換爲磁場. 好, 下面的實現都是基於它的. 電磁感應. 繼電器就是基於它實現的.
邏輯電路
看下面電路:
這是一個簡單的並聯電路, 實現了邏輯或, 只要有一個電路接通, 整體就是通路. 當然了, 串聯電路就是邏輯與了. 那邏輯非如何處理呢? 這就要用到上面提到的繼電器了.
邏輯非
圖中的 J 表示繼電器.
右側電路的開關正常情況處於連通狀態, 當左側通電後, 會將右側開關吸附起來, 令其斷開. 這就實現了邏輯非. 當然, 與
或
的實現也可以通過繼電器來傳遞.
邏輯與
這就是一個通過繼電器實現的與門.
當然了, 或門也是一樣的, 只是將右側的串聯電路改成並聯電路就成了.
邏輯異或
有了與或非, 把他們三拼一拼, 異或就有了.
A xor B = (!A && B) || (A && !B)
來來來, 看圖了.
這就是一個異或了. 有沒有發現什麼? 可以將電路參與到邏輯運算中.
好啦, 足夠了. 開始着手實現全加器.
全加器
到這, 想必各位看官也知道爲什麼在全加器之前要先說邏輯電路了吧. 沒錯, 就是要把01的加法運算, 轉換成邏輯運算.
列一張真值表:
真值表在此, 請運用你們數值計算的知識, 把邏輯表達式推出來吧. 請原諒我, 下面表達式是我嫖來的, 直接把化簡後的邏輯表達式拿來了.
x = a xor b xor c
y = c && (a xor b) || (a && b)
算一算一個全加器一共用到了多少繼電器? 其中: 與(2個), 或(2個), 亦或(8個).
x 需要2個亦或, 共16個繼電器. y 需要2個與,1個亦或,1個或, 共14個繼電器. 整個全加器共需30個繼電器. 又因爲 x 和 y 的計算在同一個全加器中, a xor b
的操作, xy 可以公用同一個, 所以減少一個亦或, 共22個繼電器. 據說還能少, 嗯, 咱也不知道.
以上, 一個超級簡陋的全加器橫空出世. 將上面的邏輯表達式放到電路里, 就能返回輸入結果相加後的結果.
既然有全加器, 那是不是也有半加器? 嗯, 有. 半加器就是將兩個位相加, 產生和
和進位
, 不考慮上一個來的進位. 簡單說, 全加器有3個運算數, 半加器只有兩個.
有了全加器, 是不是還得有全減器? 偷偷告訴你, 減法運算就是補碼的加法運算.