天天看點

重學計算機組成原理(十二)- 加法器1 異或門和半加器2 全加器(Full Adder)3 總結延伸4 補充閱讀

重學計算機組成原理(十二)- 加法器1 異或門和半加器2 全加器(Full Adder)3 總結延伸4 補充閱讀

下面這些門電路的辨別,你需要非常熟悉,後續的電路都是由這些門電路組合起來的。

重學計算機組成原理(十二)- 加法器1 異或門和半加器2 全加器(Full Adder)3 總結延伸4 補充閱讀

這些基本的門電路,是我們計算機硬體端的最基本的“積木”

包含十億級别半導體的現代CPU,都是由這樣一個一個的門電路組合而成的。

重學計算機組成原理(十二)- 加法器1 異或門和半加器2 全加器(Full Adder)3 總結延伸4 補充閱讀

1 異或門和半加器

基礎門電路

  • 輸入都是兩個單獨的bit
  • 輸出是一個單獨的bit

2個8 位(bit)數的與/或/非邏輯運算

連續擺放8個開關,代表一個8位數

這樣的兩組開關,從左到右,上下單個的位開關之間,都統一用“與門”或者“或門”連起來,就是兩個8位數的AND或者OR的運算了

最簡單的8位的無符号整數的加法

“無符号”表示不需要使用補碼來表示負數

無論高位是“0”還是“1”,這個整數都是一個正數

表示一個8位數的整數,簡單地用8個bit,也就是8個電路開關

那2個8位整數的加法,就是2排8個開關

加法得到的結果也是一個8位的整數,是以又需要1排8位的開關

要想實作加法,我們就要看一下,通過什麼樣的門電路,能夠連接配接起加數和被加數,得到最後期望的和

其實加法器就是把三排開關電路連起來

重學計算機組成原理(十二)- 加法器1 異或門和半加器2 全加器(Full Adder)3 總結延伸4 補充閱讀

人在計算加法的時候一般怎麼操作

二進制的加法和十進制沒什麼差別,一樣可以用列豎式

我們仍然是從左到右,一位一位進行計算,隻是把從逢10進1變成逢2進1

重學計算機組成原理(十二)- 加法器1 異或門和半加器2 全加器(Full Adder)3 總結延伸4 補充閱讀

一位數的加法

輸入一共是4種組合,00、01、10、11

  • 加法計算之後的個位是什麼,在輸入的兩位是00和11的情況下,對應的輸出都應該是0
  • 在輸入的兩位是10和01的情況下,輸出都是1

這個輸入和輸出的對應關系,其實就“異或門(XOR)”

與/或/非門,很容易就能和程式裡面的“AND(&)”“ OR( | )”和“ NOT( !)”對應

為什麼需要異或(XOR)

這樣一個在邏輯運算裡面沒有出現的形式,作為一個基本電路

異或門就是一個最簡單的整數加法,所需要使用的基本門電路

輸入的兩位都是11時,還需要向左側一位進位

這就對應一個與門

也就是有且隻有在加數和被加數都是1的時候,進位才是1

是以,通過一個

  • 異或門計算出個位
  • 與門計算出是否進位

就通過電路算出了一個一位數的加法

把兩個門電路打包,給它取一個名字,就叫作半加器(Half Adder)

  • 半加器的電路示範
重學計算機組成原理(十二)- 加法器1 異或門和半加器2 全加器(Full Adder)3 總結延伸4 補充閱讀

2 全加器(Full Adder)

半加器可以解決個位的加法問題,但放到二位上,就不夠用

這裡的豎式是個二進制的加法,是以從右往左數,第二列不是十位,稱為“二位”

對應的再往左,就應該分别是四位、八位

二位用一個半加器不能計算完成的原因也很簡單

因為二位除了一個加數/被加數,還需要加上來自個位的進位信号,一共需要三個數進行相加

無論是最簡單的門電路,還是用兩個門電路組合而成的半加器,輸入都隻能是兩個bit,也就是兩個開關。該怎麼辦呢?

用兩個半加器和一個或門,就能組合成一個全加器

第一個半加器,我們用和個位的加法一樣的方式,得到是否進位X和對應的二個數加和後的結果Y,這樣兩個輸出

然後,我們把這個加和後的結果Y,和個位數相加後輸出的進位資訊U,再連接配接到一個半加器上,就會再拿到一個是否進位的信号V和對應的加和後的結果W。

全加器就是兩個半加器加上一個或門

重學計算機組成原理(十二)- 加法器1 異或門和半加器2 全加器(Full Adder)3 總結延伸4 補充閱讀

這個W就是我們在二位上留下的結果。我們把兩個半加器的進位輸出,作為一個或門的輸入連接配接起來,隻要兩次加法中任何一次需要進位,那麼在二位上,我們就會向左側的四位進一位。因為一共隻有三個bit相加,即使3個bit都是1,也最多會進一位。

這樣,通過兩個半加器和一個或門,我們就得到了一個,能夠接受進位信号、加數和被加數,這樣三個數組成的加法。這就是我們需要的全加器。

有了全加器,我們要進行對應的兩個8 bit數的加法就很容易了

隻要把8個全加器串聯起來就好了

個位的全加器的進位信号作為二位全加器的輸入信号,二位全加器的進位信号再作為四位的全加器的進位信号

這樣一層層串接八層,我們就得到了一個支援8位數加法的算術單元

如果要擴充到16位、32位,乃至64位,都隻需要多串聯幾個輸入位和全加器就好了

8位加法器可以由8個全加器串聯而成

重學計算機組成原理(十二)- 加法器1 異或門和半加器2 全加器(Full Adder)3 總結延伸4 補充閱讀

唯一需要注意的是,對于這個全加器,在個位,我們隻需要用一個半加器,或者讓全加器的進位輸入始終是0。因為個位沒有來自更右側的進位。而最左側的一位輸出的進位信号,表示的并不是再進一位,而是表示我們的加法是否溢出了。

既然int這樣的16位的整數加法,結果也是16位數,那我們怎麼知道加法最終是否溢出了呢?因為結果也隻存得下加法結果的16位數。我們并沒有留下一個第17位,來記錄這個加法的結果是否溢出。

看到全加器的電路設計,相信你應該明白,在整個加法器的結果中,我們其實有一個電路的信号,會辨別出加法的結果是否溢出。我們可以把這個對應的信号,輸出給到硬體中其他标志位裡,讓我們的計算機知道計算的結果是否溢出

而現代計算機也正是這樣做的。這就是為什麼你在撰寫程式的時候,能夠知道你的計算結果是否溢出在硬體層面得到的支援。

3 總結延伸

兩個門電路,搭出一個半加器,就好像我們拿兩塊樂高,疊在一起,變成一個長方形的樂高,這樣我們就有了一個新的積木元件,柱子。我們再用兩個柱子和一個長條的積木組合一下,就變成一個積木橋。然後幾個積木橋串接在一起,又成了積木樓梯。

從簡單到複雜,我們一層層搭出了擁有更強能力的功能元件

重學計算機組成原理(十二)- 加法器1 異或門和半加器2 全加器(Full Adder)3 總結延伸4 補充閱讀

在上面的一層,我們隻需要考慮怎麼用下一層的元件搭建出自己的功能,而不需要下沉到更低層的其他元件。就像你之前并沒有深入學習過計算機組成原理,一樣可以直接通過進階語言撰寫代碼,實作功能。

在硬體層面,我們通過門電路、半加器、全加器一層層搭出了加法器這樣的功能元件。我們把這些用來做算術邏輯計算的元件叫作ALU,也就是算術邏輯單元。當進一步打造強大的CPU時,我們不會再去關注最細顆粒的門電路,隻需要把門電路組合而成的ALU,當成一個能夠完成基礎計算的黑盒子就可以了。

以此類推,後面我們講解CPU的設計和資料通路的時候,我們以ALU為一個基礎單元來解釋問題,也就夠了。

4 補充閱讀

出于性能考慮,實際CPU裡面使用的加法器,比起我們今天講解的電路還有些差别,會更複雜一些。真實的加法器,使用的是一種叫作超前進位加法器的東西。你可以找到北京大學在Coursera上開設的《計算機組成》課程中的Video-306 “加法器優化”一節,了解一下超前進位加法器的實作原理,以及我們為什麼要使用它。

繼續閱讀