歷史上,馮·諾依曼最終選擇了二進制做爲計算機的底層數制。二進制0和1映射到物理電路只有兩種狀態,這兩種狀態能夠方便地用電路通斷、晶體管導通或截止、電平高低等等來表示,極大地簡化了實現數值表示和運算的物理方法。spa
具體簡化到什麼程度?爲了能有一個形象的感知,咱們不妨本身動手實驗:只使用原始的電磁式繼電器,實現一個8位全加器模型。設計
1、全加器組合邏輯code
咱們首先考慮半加器的實現。顯然,當兩個1 bit二進制操做數數A,B進行加法運算時,本位結果至關於A ⊕ B。接下來考慮進位結果的生成。根據進位制,當且僅當A,B同時爲1時,進位1。因而咱們得出表達式:blog
sum = A ⊕ B carry = A * B
對於每一位i,加入來自上一位的進位Ci-1,便獲得全加器。因而第i位結果至關於Ai ⊕ Bi ⊕ Ci-1。考慮每一位的進位,根據進位制,當且僅當Ai,Bi,Ci-1中至少兩個操做數同時爲1時,進位1。因而全加器表達式以下:it
Sum(i) = Ai ⊕ Bi ⊕ Ci-1
Carry(i) = Ai * Bi + Ai * Ci + Bi * Ci
化簡,獲得表達式:class
Sum(i) = (Ai ⊕ Bi) ⊕ Ci-1
Carry(i) = Ai * Bi + Ci-1 * (Ai ⊕ Bi )
經過觀察易得,硬件上,每一位至少須要5個雙端口門電路來實現。基礎
2、繼電器實現軟件
其實,上個世紀工程師利用繼電器實現控制邏輯是比較常見的事情。硬件
在本文中,咱們須要首先實現與、或、異或三種門電路。經過觀察不難發現,三種門電路實現以下(注意這裏並無考慮門電路端口的傳輸延遲一致性問題):二進制
因而根據上一節得出的表達式,得出單位全加器的電路以下:
將8個單位全加器串聯起來,便獲得一個串行8位全加器。這裏只是簡單地把第一位的進位輸入復位。在微處理中,經常支持addc指令,將上次結果的進位輸出做爲本次的進位輸入。通過若干addc指令後,能夠完成長數值的加法。
採用Protues電路仿真軟件驗證咱們所設計的電路,結果以下,其中左側兩排電平信號源爲全加器的輸入,而右側一排電平指示器爲全加器的輸出。
其中,對於有符號運算,操做數均以補碼錶示。
3、問題總結
首先,因爲串行全加器的結構所致,輸出將出現毛刺。同時在繼電器實現的或門中,兩個端口的傳輸延遲不一致,這會加重電路輸出的毛刺。
所以,讀出結果時,應待輸出信號穩定後再讀取。
因爲輸出從暫穩態到穩態所經歷的時間很是短,做爲演示模型使用時,可忽略不計。
4、心得
回首當年部分採用十進制的ENIAC,和後來真正採用二進制的EDSAC,計算機真正走向了成熟的商業應用。這其中任何領域的進步都離不開基礎科學的進步,而基礎科學研究的迷人之處也在於:任何一個看起來質樸的結論,均可能引起深入的改變。
2018 11.1