目錄
0、緒論
在聊進位邏輯之前,先準備一些預備知識關於加法器(半加器和全加器)電路;
0.1、半加器
半加器(half adder)的功能是將兩個一位二進制數相加。它具有兩個輸入和兩個輸出,兩個輸入分別爲 A、B,代表着等待相加的兩個數,輸出爲 Sum、Carry;Sum代表加的結果,Carry 代表進位邏輯;
半加器的真值表爲:
A | B | Carry | Sum |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 |
0 | 1 | 0 | 1 |
1 | 1 | 1 | 0 |
加法器電路主要的構成元件由 XOR(異或門)構成,XOR 的真值表爲:
所以一個半加器可以由一個異或門和一個與門組成:
半加器的簡化圖爲:
0.2、全加器
全加器(full adder)將兩個一位二進制數相加,並根據接收到的低位進位信號,輸出和、進位輸出。全加器的三個輸入信號爲兩個加數 A、B 和低位進位 Cin
全加器真值表爲:
A | B | Cin | Cout | Sum |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | 1 |
0 | 1 | 0 | 0 | 1 |
1 | 1 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 1 |
1 | 0 | 1 | 1 | 0 |
0 | 1 | 1 | 1 | 0 |
1 | 1 | 1 | 1 | 1 |
全加器的邏輯電路爲:
全加器的簡化圖爲:
1、XILINX CARRY4
XILINX 7 系列提供的 CLB 中的 SLICE 資源,每個 SLICE 包含了一個 CARRY4 進位邏輯:
先整理出輸入輸出,如下所示:
其中,
- CI:是上一個 CARRY4 的進位輸出,位寬爲1;
- CYINT:是進位的初始化值,位寬爲1;
- DI:是數據的輸入(兩個加數的任意一個),位寬爲4;
- SI:是兩個加數的異或,位寬爲4;
- O:是加法結果輸出,位寬爲4;
- CO:是進位輸出,位寬爲4;(爲什麼進位輸出是4bit?後面有解釋)
這裏我們要先解釋一下FPGA中利用Carry Chain實現加法的原理,比如兩個加數分別爲 a = 4'b1000
和 b=4'b1100
,其結果應該是 8+12=20
。
a = 4'b1000;
b = 4'b1100;
S = a ^ b = 4'b0100;
D = b = 4'b1100; //D取a也可以
CIN = 0; //沒有上一級的進位輸入
CYINIT = 0; //初始值爲0
// 下面爲CARRY4的計算過程,具體的算法跟上圖中過程一樣
S0 = 0; //S的第0位
O0 = S0 ^ 0 = 0 ^ 0 = 0;
CO0 = DI0 = 0; //上圖中的MUXCY,S0爲0時,選擇1,也就是DI0,S0爲1是選擇2
S1 = 0;
O1 = S1 ^ CO0 = 0 ^ 0 = 0;
CO1 = DI1 = 0;
S2 = 1;
O2 = S2 ^ CO1 = 0 ^ 1 = 1;
CO2 = CO1 = 0;
S3 = 0;
O3 = S3 ^ CO2 = 0 ^ 0 = 0;
CO3 = DI3 = 1;
加法最終的輸出結果爲:
a = 4'b1000;
b = 4'b1100;
{O3,O2,O1,O0}=4’b0100
{CO3,CO2,CO1,CO0}=4’b1000
最終結果:{CO3,O3,O2,O1,O0} = 5’b10100 = 20
可以看出 {O3,O2,O1,O0} 是 a+b 的半加器結果,而 {CO3,CO2,CO1,CO0} 是 a+b 的進位結果;
輸出給下一級的 COUT 只是CO[3]。
參考文獻:
https://blog.csdn.net/zhanghaijun2013/article/details/103122927
https://blog.csdn.net/qq_16184883/article/details/82918184