加法器


 

計算機里的加減乘除四則運算,最基本的就是加法運算,其余三種運算都可以通過加法運算來實現。

 

I. 半加器 (Half Adder)

考慮一位二進制加法運算,如果不考慮進位的話,我們可以得到如下真值表:

A,B表示輸入,C(Carry)表示進位,S(Sum)表示結果。

可以得到:

 

用邏輯門來實現:

II. 全加器 (Full Adder)

有了半加器以后我們發現,這種加法器並不能實現多位數的加法,因此誕生了有進位的全加器。和半加器不一樣,一個全加器有三個輸入(A,B和低位進位)和兩個輸出(和以及進位輸出)。

列出真值表:

 

 可以得到:

 

 邏輯門實現:

III. 紋波進位加法器 (Ripple Carry Adder)

將n個全加器級聯起來,就是一個n位的加法器,這就是逐級進位加法器。

考慮到門電路中的電場狀態改變需要時間,如果輸入電平發生了變化,那么輸出電平需要一段時間后才會響應,當然這段時間很小,小到了納秒級別。因此,這種加法器有個缺點:每一位的進位輸入依賴於上一位的進位輸出,只有前一位的進位信號穩定后,這一位的全加器的運算才是有意義的。如果位數n很大的話,整個加法器會變慢,最后會限制CPU主頻的提高。

IV. 超前進位加法器 (Carry-lookahead Adder)

既然級聯一位的加法器算有這樣的缺點,那就干脆直接設計一個位數足夠大的加法器!

我們列出2位的全加器的真值表:

 

我們看到,隨着n增大,真值表的行數是指數級別增長的。即使位數僅僅只有2,真值表的行數都達到了32,人工求解布爾表達式變得很困難。但是理論上,這樣的全加器的確存在,而且實際上,有一個更優雅的設計方法。

再次考慮上面講到的全加器,不再以級聯的方式獲得進位輸入,而是直接根據輸入,設計電路得到合適的進位,這樣設計出來的加法器叫做超前進位加法器。

 

 

其中,每一級的進位可以由當前的兩個位產生(generate),C_{k_g}=A_kB_k;或者由上一級傳遞(propagate)的進位 {C_{in}}_k={C_{out}}_{k-1} 和當前輸入累加導致的,C_{k_{p}}=A_k+ B_k,因此下一級的進位是C_{k+1}=C_{k_g}+C_{k_p} \cdot C_i=A_kB_k+C_k(A_k+B_k)

因此,得到關於2位超前進位加法器的布爾表達式:

Y_0=A_0\oplus B_0\oplus C_0=A_0\oplus B_0\oplus CY_1=A_1\oplus B_1\oplus C_1=A_1\oplus B_1\oplus (C_{0_g}+C_{0_p} \cdot C_0 )=A_1\oplus B_1\oplus (A_0B_0+C(A_0+B_0))Carry=C_2=C_{1_g}+C_{1_p}\cdot C_1=A_1B_1+(A_1+B_1)\cdot (A_0B_0+C(A_0+B_0))

 

 

 

考慮到集成電路的面積,成本,功耗,散熱等因素,超前進位加法器的位數一般不會過大。一般將幾個超前進位加法器(如8位,16位)級聯起來,得到位數夠寬的加法器。

 

 

鏈接:https://www.zhihu.com/question/29707696/answer/114610705
來源:知乎


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM