補碼器加減法,運算方法簡介
我們要知道什么是補碼的加法,我們為什么要用補碼的加法?
補碼的加法其實就是將兩個補碼形式的二進制數字直接相加,處理的時候忽略超出固定位數的進位。補碼的加法運算和無符號二進制數的加法操作一樣,不需要額外處理負號或減法的邏輯
補碼加法的具體操作步驟:
- 將兩個補碼數位對齊(確保位數一致)
- 諸位相加,處理進位
- 如果結果超出固定的位數,忽略超出部分的進位
例子:
假如我們在一個8位的系統中進行加法計算
- 5+3
- 5的補碼:00000101
- 3的補碼:00000011
- 00001000(結果位8)
- 5+(-3)
- 5的補碼:00000101
- -3的補碼:11111101
- 相加:10000010(結果位-2,最高位1表示結果是負數)
那么我們為什么要使用補碼的加法?
補碼的使用簡化了計算機硬件的設計,使有符號的整數運算變得更加高效統一。補碼的使用還簡化了負數的表示和處理,使計算機更方便地進行各種數值運算。
在了解了補碼的加法之后我們就可以嘗試設計一位全加器電路了
構造一個一位全加器
首先要知道什么是全加器?
全加器是一種基本的數字電路,用于二進制數的加法運算。它能夠同時處理兩個二進制數的加法運算。它能夠同時處理兩個二進制位和一個來自低位的進位輸入,并輸出該位的和以及進位到高位的值。全加器是構建多位二進制加法器的基本模塊。
全加器的功能
全加器有三個輸入兩個輸出:
- 輸入:兩個被加的二進制位A和B,以及來自前一位的進位輸入C_in_
- 輸出:該位的和S和向更高位傳遞的進位輸出C_out_
全加器的真值表
A | B | C_in_ | S | C_out_ |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 1 |
全加器的邏輯表達式
根據真值表,全加器的輸入S和輸出C可以用邏輯表達式表示:
- 和(sum)S:S = A XOR B XOR C_in_
- 進位(Carry)C_out_:C_out_ = (A * B) + (B * C_in_) + (A * C_in_)
一位全加器的電路實現
如下圖所示:
功能封裝
八位串行加法器
八位串行加法器是一種可以對兩個8位二進制數進行加法運算的電路,串行加法器的工作原理是每次處理一個位,并將進位傳遞到下一位進行累加。以下是八位串行加法器的詳細電路設計和驗證。
電路設計
- 全加器:用于對兩個二進制位及一個進位進行相加。
- 移位寄存器:用于存儲和移位操作,分別存儲兩個8位數加數和結果
- **D觸發器:**用于存儲和傳遞進位
- 時鐘:用于同步操作
電路示意圖
使用具體數字驗證
1. 初始化
- A寄存器:10101010
- B寄存器:01010101
- 進位 𝐶0:0
2. 逐位相加
- 第1次時鐘脈沖:
- 取出最低位:A0 = 0, B0 = 1, 𝐶0=0
- 全加器計算:𝑆0=0⊕1⊕0=1
- 進位:𝐶1=(0?1)+(1?0)+(0?0)=0
- 移位:A -> 01010101, B -> 00101010
- 第2次時鐘脈沖:
- 取出當前位:A1 = 1, B1 = 0, 𝐶1=0
- 全加器計算:𝑆1=1⊕0⊕0=1
- 進位:𝐶2=(1?0)+(0?0)+(1?0)=0
- 移位:A -> 00101010, B -> 00010101
- 第3次時鐘脈沖:
- 取出當前位:A2 = 0, B2 = 1, 𝐶2=0
- 全加器計算:𝑆2=0⊕1⊕0=1
- 進位:𝐶3=(0?1)+(1?0)+(0?0)=0
- 移位:A -> 00010101, B -> 00001010
- 第4次時鐘脈沖:
- 取出當前位:A3 = 1, B3 = 0, 𝐶3=0
- 全加器計算:𝑆3=1⊕0⊕0=1
- 進位:𝐶4=(1?0)+(0?0)+(1?0)=0
- 移位:A -> 00001010, B -> 00000101
- 第5次時鐘脈沖:
- 取出當前位:A4 = 0, B4 = 1, 𝐶4=0
- 全加器計算:𝑆4=0⊕1⊕0=1
- 進位:𝐶5=(0?1)+(1?0)+(0?0)=0
- 移位:A -> 00000101, B -> 00000010
- 第6次時鐘脈沖:
- 取出當前位:A5 = 1, B5 = 0, 𝐶5=0
- 全加器計算:𝑆5=1⊕0⊕0=1
- 進位:𝐶6=(1?0)+(0?0)+(1?0)=0
- 移位:A -> 00000010, B -> 00000001
- 第7次時鐘脈沖:
- 取出當前位:A6 = 0, B6 = 1, 𝐶6=0
- 全加器計算:𝑆6=0⊕1⊕0=1
- 進位:𝐶7=(0?1)+(1?0)+(0?0)=0
- 移位:A -> 00000001, B -> 00000000
- 第8次時鐘脈沖:
- 取出當前位:A7 = 1, B7 = 0, 𝐶7=0
- 全加器計算:𝑆7=1⊕0⊕0=1
- 進位:𝐶8=(1?0)+(0?0)+(1?0)=0
結果
最終輸出結果的各位和為 𝑆7𝑆6𝑆5𝑆4𝑆3𝑆2𝑆1𝑆0=11111111,即十進制的255。進位輸出 𝐶8=0,表示沒有產生進位。
八位可控加減法器
8位可控加減法器是一種能夠對兩個8位二進制數進行加法或減法運算的電路。它通過控制信號來決定是執行加法還是減法。減法可以通過將被減數取補碼并進行加法來實現。以下是詳細的電路設計和使用具體數字進行驗證的步驟。
電路設計
- 全加器:用于對兩個二進制位及一個進位進行相加。
- 移位寄存器:用于存儲和移位操作,分別存儲兩個八位數和結果。
- D觸發器:用于存儲和傳遞進位。
- 時鐘:用于同步操作。
- 異或門:用于將減法操作轉化為加法操作。
- 控制信號:用于選擇加法或減法操作。
電路示意圖
使用具體數字驗證
加法驗證
假設我們要相加的兩個8位數是:
- A = 01101101 (十進制的109)
- B = 00111011 (十進制的59)
- 初始化:
- A寄存器:01101101
- B寄存器:00111011
- 進位 _C_0:0
- 控制信號 Add/Sub = 0(加法)
- 逐位相加
- 第1次時鐘脈沖:
- 取出最低位:A0 = 1, B0 = 1, 𝐶0=0
- 全加器計算:𝑆0=1⊕1⊕0=0
- 進位:𝐶1=(1?1)+(1?0)+(0?0)=1
- 移位:A -> 00110110, B -> 00011101
- 第2次時鐘脈沖:
- 取出當前位:A1 = 0, B1 = 1, 𝐶1=1
- 全加器計算:𝑆1=0⊕1⊕1=0
- 進位:𝐶2=(0?1)+(1?1)+(0?1)=1
- 移位:A -> 00011011, B -> 00001110
- 第3次時鐘脈沖:
- 取出當前位:A2 = 1, B2 = 1, 𝐶2=1
- 全加器計算:𝑆2=1⊕1⊕1=1
- 進位:𝐶3=(1?1)+(1?1)+(1?1)=1
- 移位:A -> 00001101, B -> 00000111
- 第4次時鐘脈沖:
- 取出當前位:A3 = 1, B3 = 0, 𝐶3=1
- 全加器計算:𝑆3=1⊕0⊕1=0
- 進位:𝐶4=(1?0)+(0?1)+(1?1)=1
- 移位:A -> 00000110, B -> 00000011
- 第5次時鐘脈沖:
- 取出當前位:A4 = 0, B4 = 1, 𝐶4=1
- 全加器計算:𝑆4=0⊕1⊕1=0
- 進位:𝐶5=(0?1)+(1?1)+(0?1)=1
- 移位:A -> 00000011, B -> 00000001
- 第6次時鐘脈沖:
- 取出當前位:A5 = 1, B5 = 1, 𝐶5=1
- 全加器計算:𝑆5=1⊕1⊕1=1
- 進位:𝐶6=(1?1)+(1?1)+(1?1)=1
- 移位:A -> 00000001, B -> 00000000
- 第7次時鐘脈沖:
- 取出當前位:A6 = 0, B6 = 0, 𝐶6=1
- 全加器計算:𝑆6=0⊕0⊕1=1
- 進位:𝐶7=(0?0)+(0?1)+(0?1)=0
- 移位:A -> 00000000, B -> 00000000
- 第8次時鐘脈沖:
- 取出當前位:A7 = 0, B7 = 0, 𝐶7=0
- 全加器計算:𝑆7=0⊕0⊕0=0
- 進位:𝐶8=(0?0)+(0?0)+(0?0)=0
結果
最終輸出結果的各位和為 𝑆7𝑆6𝑆5𝑆4𝑆3𝑆2𝑆1𝑆0=10101000,即十進制的168。
減法驗證
初始化
- A寄存器:01101101
- B寄存器:00111011
- 進位 _C_0:1(由于使用補碼減法,初始進位為1)
- 控制信號 Add/Sub = 1(減法)
逐位計算(將B取反再加上A)
- 第1次時鐘脈沖:
- 取出最低位:A0 = 1, B0 = 1
- 由于控制信號為1,B0取反:B0’ = 0
- 全加器計算:𝑆0=1⊕0⊕1=0
- 進位:𝐶1=(1?0)+(0?1)+(1?1)=1
- 移位:A -> 00110110, B -> 00011101
- 第2次時鐘脈沖:
- 取出當前位:A1 = 0, B1 = 1
- 由于控制信號為1,B1取反:B1’ = 0
- 全加器計算:𝑆1=0⊕0⊕1=1
- 進位:𝐶2=(0?0)+(0?1)+(0?1)=0
- 移位:A -> 00011011, B -> 00001110
- 第3次時鐘脈沖:
- 取出當前位:A2 = 1, B2 = 1
- 由于控制信號為1,B2取反:B2’ = 0
- 全加器計算:𝑆2=1⊕0⊕0=1
- 進位:𝐶3=(1?0)+(0?0)+(1?0)=0
- 移位:A -> 00001101, B -> 00000111
- 第4次時鐘脈沖:
- 取出當前位:A3 = 1, B3 = 0
- 由于控制信號為1,B3取反:B3’ = 1
- 全加器計算:𝑆3=1⊕1⊕0=0
- 進位:𝐶4=(1?1)+(1?0)+(1?0)=1
- 移位:A -> 00000110, B -> 00000011
- 第5次時鐘脈沖:
- 取出當前位:A4 = 0, B4 = 1
- 由于控制信號為1,B4取反:B4’ = 0
- 全加器計算:𝑆4=0⊕0⊕1=1
- 進位:𝐶5=(0?0)+(0?1)+(0?1)=0
- 移位:A -> 00000011, B -> 00000001
- 第6次時鐘脈沖:
- 取出當前位:A5 = 1, B5 = 0
- 由于控制信號為1,B5取反:B5’ = 1
- 全加器計算:𝑆5=1⊕1⊕0=0
- 進位:𝐶6=(1?1)+(1?0)+(0?0)=1
- 移位:A -> 00000001, B -> 00000000
- 第7次時鐘脈沖:
- 取出當前位:A6 = 0, B6 = 0
- 由于控制信號為1,B6取反:B6’ = 1
- 全加器計算:𝑆6=0⊕1⊕1=0
- 進位:𝐶7=(0?1)+(1?1)+(0?1)=0
- 移位:A -> 00000000, B -> 00000000
- 第8次時鐘脈沖:
- 取出當前位:A7 = 0, B7 = 0
- 由于控制信號為1,B7取反:B7’ = 1
- 全加器計算:𝑆7=0⊕1⊕0=1
- 進位:𝐶8=(0?1)+(1?0)+(0?0)=0
結果
最終輸出結果的各位和為 𝑆7𝑆6𝑆5𝑆4𝑆3𝑆2𝑆1𝑆0=00110010,即十進制的50。