大致介紹下加法電路吧。
要讓計算機進行算術運算,首先要對輸入的資料進行編碼。現代計算機都是二進位制計算機,n位二進位制數的編碼空間是。如果使用8位二進位制編碼,最多可以有256種不同的狀態,可以對應到自然數中的0-255,這就是8位無符號整數。
我們知道有限數集對加法運算是不封閉的,對加法運算封閉的數集一定是無限數集(例如自然數集的子集)。顯然計算機只能處理有限的資料,因此我們需要一個在有限數集上的封閉運算,模 加法滿足這一性質,而且在二進位制運算中實現起來特別簡單。
舉個例子,如果運算的輸入和輸出都使用8位無符號整數,某些情況下會產生溢位問題,即計算結果用8位存不下,這時就要把溢位部分丟棄,例如:
,
注意到
因此,輸出只要比輸入多一位,就可以完整保留運算結果,這多出的一位就是進位(carry)。
回憶一下,你是怎麼學會算術的?熟練背出10以內的加法和乘法,把十進位制表示的算術運算分解成若干個10以內的加法和乘法,分步計算出來就可以了。教會計算機做算術也差不多如此,教會二進位制計算機做加法,只需要教會它在2以內的加法就可以了。
在數學上,一元函式是一個數集到另一個數集的對映:
多元函式是向量集到一個數集的對映:
向量函式是向量集到一個數集的多個對映:
多元向量函式實際上就是多個多元函式的組合:
接下來介紹一位半加器 ,輸入 為A,B;輸出 為S,C。
是兩個二進位制向量,維度都是2, ;
是一個2維向量集 到數集 的2維向量函式。
設計這個兩輸入半加器就是設計這個函式
(其中, ),
至於這個函式要怎麼設計,就需要布林代數的知識了。
列出真值表:
布林代數告訴我們,Carry = A and B,Sum = A xor B = ((not A) and B) or (A and (not B))。上面這兩個邏輯表示式可以這樣簡寫:
於是 就這麼被實現了。
再回憶一下,學會10以內的加法後,怎麼掌握更大範圍的整數加法?列豎式就好了。
根據 求解 就是列豎式的過程了。
好了,現在列個豎式計算下3+3吧。
我們發現,只有兩個輸入的半加器是不夠用的,前一位的進位還要作為下一位的輸入。
全加器的輸入應該有三個,其真值表如下:
從而得到:
將n個全加器級聯起來,就是一個n位的加法器,這就是逐級進位加法器。
考慮到閘電路中的電場狀態改變需要時間,如果輸入電平發生了變化,那麼輸出電平需要一段時間後才會響應,當然這段時間很小,小到了納秒級別。因此,這種加法器有個缺點:每一位的進位輸入依賴於上一位的進位輸出,只有前一位的進位訊號穩定後,這一位的全加器的運算才是有意義的。如果位數n很大的話,整個加法器會變慢,最後會限制CPU主頻的提高。
既然級聯一位的加法器算有這樣的缺點,那就乾脆直接設計一個位數足夠大的加法器!
我們列出2位的全加器的真值表:
我們看到,隨著n增大,真值表的行數是指數級別增長的。即使位數僅僅只有2,真值表的行數都達到了32,人工求解布林表示式變得很困難。但是理論上,這樣的全加器的確存在,而且實際上,有一個更優雅的設計方法。
再次考慮上面講到的全加器,不再以級聯的方式獲得進位輸入,而是直接根據輸入,設計電路得到合適的進位,這樣設計出來的加法器叫做超前進位加法器。
其中,每一級的進位可以由當前的兩個位產生(generate),;或者由上一級傳遞(propagate)的進位 和當前輸入累加導致的,,因此下一級的進位是
因此,得到關於2位超前進位加法器的布林表示式:
圖片來自《數位電子技術(第九版)》 電子工業出版社 Thomas L. Floyd 著 餘璆 等 譯
考慮到積體電路的面積,成本,功耗,散熱等因素,超前進位加法器的位數一般不會過大。一般將幾個超前進位加法器(如8位,16位)級聯起來,得到位數夠寬的加法器。
大致介紹下加法電路吧。
要讓計算機進行算術運算,首先要對輸入的資料進行編碼。現代計算機都是二進位制計算機,n位二進位制數的編碼空間是。如果使用8位二進位制編碼,最多可以有256種不同的狀態,可以對應到自然數中的0-255,這就是8位無符號整數。
我們知道有限數集對加法運算是不封閉的,對加法運算封閉的數集一定是無限數集(例如自然數集的子集)。顯然計算機只能處理有限的資料,因此我們需要一個在有限數集上的封閉運算,模 加法滿足這一性質,而且在二進位制運算中實現起來特別簡單。
舉個例子,如果運算的輸入和輸出都使用8位無符號整數,某些情況下會產生溢位問題,即計算結果用8位存不下,這時就要把溢位部分丟棄,例如:
,
注意到
因此,輸出只要比輸入多一位,就可以完整保留運算結果,這多出的一位就是進位(carry)。
回憶一下,你是怎麼學會算術的?熟練背出10以內的加法和乘法,把十進位制表示的算術運算分解成若干個10以內的加法和乘法,分步計算出來就可以了。教會計算機做算術也差不多如此,教會二進位制計算機做加法,只需要教會它在2以內的加法就可以了。
在數學上,一元函式是一個數集到另一個數集的對映:
多元函式是向量集到一個數集的對映:
向量函式是向量集到一個數集的多個對映:
多元向量函式實際上就是多個多元函式的組合:
接下來介紹一位半加器 ,輸入 為A,B;輸出 為S,C。
是兩個二進位制向量,維度都是2, ;
是一個2維向量集 到數集 的2維向量函式。
設計這個兩輸入半加器就是設計這個函式
(其中, ),
至於這個函式要怎麼設計,就需要布林代數的知識了。
列出真值表:
布林代數告訴我們,Carry = A and B,Sum = A xor B = ((not A) and B) or (A and (not B))。上面這兩個邏輯表示式可以這樣簡寫:
於是 就這麼被實現了。
再回憶一下,學會10以內的加法後,怎麼掌握更大範圍的整數加法?列豎式就好了。
根據 求解 就是列豎式的過程了。
好了,現在列個豎式計算下3+3吧。
我們發現,只有兩個輸入的半加器是不夠用的,前一位的進位還要作為下一位的輸入。
全加器的輸入應該有三個,其真值表如下:
從而得到:
將n個全加器級聯起來,就是一個n位的加法器,這就是逐級進位加法器。
考慮到閘電路中的電場狀態改變需要時間,如果輸入電平發生了變化,那麼輸出電平需要一段時間後才會響應,當然這段時間很小,小到了納秒級別。因此,這種加法器有個缺點:每一位的進位輸入依賴於上一位的進位輸出,只有前一位的進位訊號穩定後,這一位的全加器的運算才是有意義的。如果位數n很大的話,整個加法器會變慢,最後會限制CPU主頻的提高。
既然級聯一位的加法器算有這樣的缺點,那就乾脆直接設計一個位數足夠大的加法器!
我們列出2位的全加器的真值表:
我們看到,隨著n增大,真值表的行數是指數級別增長的。即使位數僅僅只有2,真值表的行數都達到了32,人工求解布林表示式變得很困難。但是理論上,這樣的全加器的確存在,而且實際上,有一個更優雅的設計方法。
再次考慮上面講到的全加器,不再以級聯的方式獲得進位輸入,而是直接根據輸入,設計電路得到合適的進位,這樣設計出來的加法器叫做超前進位加法器。
其中,每一級的進位可以由當前的兩個位產生(generate),;或者由上一級傳遞(propagate)的進位 和當前輸入累加導致的,,因此下一級的進位是
因此,得到關於2位超前進位加法器的布林表示式:
圖片來自《數位電子技術(第九版)》 電子工業出版社 Thomas L. Floyd 著 餘璆 等 譯
考慮到積體電路的面積,成本,功耗,散熱等因素,超前進位加法器的位數一般不會過大。一般將幾個超前進位加法器(如8位,16位)級聯起來,得到位數夠寬的加法器。