从底层结构开始学习FPGA(7)----进位链CARRY4
文章目錄
系列目錄與傳送門
一、半加器與全加器
1.1、半加器
1.2、全加器
二、多bit加法(以4bit為例)
2.1、串行(行波)進位加法器(RCA)
2.2、超前進位加法器(Carry-Lookahead Adder,CLA)
三、進位鏈CARRY4
3.1、端口
3.2、內部組成
3.3、推斷
3.4、測試實例
系列目錄與傳送門
????????《從底層結構開始學習FPGA》目錄與傳送門
一、半加器與全加器
????????FPGA底層的CARRY4本質上就是用來實現最基本的加、減法運算的,在了解CARRY4之前,我們需要對1bit以及多bit的二進制加法及其FPGA實現做一個了解。
????????1bit的二進制加法可以分為兩類:無底層進位的半加器與有底層進位的全加器。減法運算本質上仍是一種加法運算,在二進制電路中采用加上負數的補碼實現。
1.1、半加器
????????半加器電路是指對兩個輸入數據位相加,輸出一個結果位和進位,沒有進位輸入的加法器電路。?
????????半加器有兩個1位2進制數輸入,輸出1個進位、1個結果位。真值表如下:
| 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 |
| 1 | 1 | 1 | 0 |
????????從真值表,我們可以推斷出其實現:
- 結果 S = A ^ B;
- 進位 C = AB;
? ? ? ? 映射到電路就是一個2輸入異或門加一個2輸入與門:
1.2、全加器
? ? ? ? 全加器是在半加器的基礎上的升級版,除了加數和被加數加和外還要加上前上一級傳進來的進位信號。全加器真值表為:
| 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 |
????????從真值表,我們可以推斷出其實現:
- 結果? S= A ^ B ^ Cin;
- 進位 C = (A&B) | (Cin & (A^B) ;
? ? ? ? 映射到電路的實現:
? ? ? ? 比半加器要復雜一些,構成為2個異或門+2個與門+1個或門。?
二、多bit加法(以4bit為例)
? ? ? ? 有了單個bit的二進制加法電路(全加器)后,我們就可以通過級聯來實現多bit的二進制加法了,但是多個全加器如何級聯則是一個需要考慮的問題。
2.1、串行(行波)進位加法器(RCA)
????????進行兩個4bit的二進制數相加,就要用到4個全加器。那么在進行加法運算時,首先準備好的是1號全加器的3個input。而2、3、4號全加器的Cin全部來自前一個全加器的Cout,只有等到1號全加器運算完畢,2、3、4號全加器才能依次進行進位運算,最終得到結果。 這樣進位輸出,像波浪一樣,依次從低位到高位傳遞, 最終產生結果的加法器,也因此得名為行波進位加法器(Ripple-Carry Adder,RCA)。
????????RCA的優點是電路布局簡單,設計方便, 我們只要設計好了全加器,連接起來就構成了多位的加法器。 但是缺點也很明顯,也就是高位的運算必須等待低位的運算完成, 這樣造成了整個加法器的延遲時間很長。將4bit的RCA內部結構全部打開,就得到了如圖所示的4-bit RCA的門電路圖。要對一個電路的性能進行分析,我們就要找出其中的最長路徑。 也就是找出所有的從輸入到輸出的電路連接中,經過的門數最多的那一條,也稱為關鍵路徑。
????????我們來做一個簡單的分析, 對于最低位的全加器,它在A、B和Cin都已經準備好。其實,輸入信號進入到這塊電路之后,在連接線上傳遞需要花時間。 稱為線延遲,而經過這樣的門,也需要花時間,稱為門延遲。
????????對于第一個全加器,它的最長路徑,是紅色線標記的那條。
????????那么,假設經過一個門電路的延遲時間為T,那么經過4個全加器所需要的總延遲時間就是:2T x 4 + T(第一個全加器產生3個T) = 9T。所以推出,經過n個全加器所產生的總延遲時間為2T x n + T = (2n+1)T。從此可以看出來RCA電路的最大問題就是組合邏輯延遲太高。
2.2、超前進位加法器(Carry-Lookahead Adder,CLA)
????????用前一個全加器的參數來表示后面的進位輸出(Cout),即:
????????由此來表示4個全加器的進位輸出為:
????????最終需要得到的是C4,經過換算,C4=G3+P3·G2+P3·P2·G1+P3·P2·P1·G0+P3·P2·P1·P0·C0,而這些參數,全部已知!并不需要前一個全加器運算輸出,就可以提前計算進位輸出, 用這樣的方法實現了加法器就被稱為超前進位加法器(Carry-Lookahead Adder,CLA)。
????????重新繪制CLA的布線方式:
????????CLA的方式獲得了較短的組合邏輯延遲,但是電路的面積卻大了非常的多,這就是FPGA設計中非常經典的“面積換時間”。
? ? ? ? 同時需要注意的是,上面的門電路實現僅僅是求得C4,而如果要同時求C3 C2 C1的話,電路面積還會增大許多。
????????所以在FPGA內部會是使用CLA這種方式來實現加法器嗎?答案是也不是。
三、進位鏈CARRY4
????????Xilinx FPGA底層的加法器(進位鏈)CARRY4是一種超前進位的加法器,但是為了面積與普適性其實現原理與上述的CLA電路還是有一點區別。
? ? ? ? 每個SLICE中都有1個(每個CLB則有2個)CARRY4用來實現進位邏輯,不同的進位鏈可級聯以形成更寬的加/減邏輯:
3.1、端口
? ? ? ? 先來看下CARRY的整體構成及其端口:
? ? ? ? ?端口含義:
- CI:是上一個 CARRY4?的進位輸出,位寬為1;可級聯構成更大的加法邏輯
- CYINT:是進位的初始化值,位寬為1;0為加法,1為減法
- DI:是數據的輸入(可以是兩個加數的任意一個,至于為什么后面再解釋),位寬為4;
- SI:是兩個加數的異或結果,位寬為4;
- O:是加法結果輸出,位寬為4;
- CO:是進位輸出,位寬為4;(這里的進位代表每一位加法的進位,比如CO0代表最低位的加法進位,而CO3則代表最高位的加法進位,這樣就可以同樣實現小于4bit的加減法)
3.2、內部組成
? ? ? ? 僅僅只看端口無法理解CARRY4是如何實現進位算法的,接下來看下內部的具體實現:
? ? ? ? 從上圖可以看到,實際上CARRY4是分為相同的4個部分的,每個部分都用MUX2加異或門來實現進位邏輯。
? ? ? ? 這里需要說明的是,上述MUX2的實現邏輯均為:S = 0,結果為左側輸入;?S = 1,結果為則右側輸入。
? ? ? ?
????????一步一步來看:
(一:O0、CO0)
????????最底層的結果O0等于S0異或CIN,S0則為兩個加數的異或,也就是O0 = A0 ^ B0^ CIN。
????????若S0 = 0,則意味著兩個加數相等,即00或11,此時O0的結果與CIN一致。若S0 = 1,則意味著兩個加數不相等,即01或10,此時O0的結果與CIN相反。
? ? ? ? 當S0 = 0,則意味著兩個加數相等,即00或11,此時MUX2選擇DI0作為進位CO0的結果。若DI0為0,則意味著A0,B0,CO0都為0;若DI0為1,則意味著A0,B0,CO0都為1;
????????當S0 = 1,則意味著兩個加數不相等,即01或10,此時MUX2選擇CIN作為進位CO0的結果。若CIN為0,則意味著A0,B0,CIN為100,此時不需要進位,與CIN相等;若CIN為1,則意味著A0,B0,CIN為101,此時需要進位,仍與CIN相等;
省略(O1、CO1),(O2、CO2)的推斷過程······
(四:O3、CO3)
? ? ? ? 結果O3等于S3異或CO2,S3則為兩個加數的異或,也就是O3 = A3 ^ B3 ^ CO2。
????????若S3 = 0,則意味著兩個加數相等,即00或11,此時O3的結果與CO2一致。
????????若S3 = 1,則意味著兩個加數不相等,即01或10,此時O3的結果與CO2相反。
? ? ? ? 當S3 = 0,則意味著兩個加數相等,即00或11,此時MUX2選擇DI3作為進位CO3的結果。若DI3為0,則意味著A3,B3,CO3都為0;若DI3為1,則意味著A3,B3,CO3都為1;
????????當S3 = 1,則意味著兩個加數不相等,即01或10,此時MUX2選擇CO2作為進位CO3的結果。若CO2為0,則意味著A3,B3,CO2為100,此時不需要進位,與CO2相等;若CO2為1,則意味著A3,B3,CO2為101,此時需要進位,仍與CO2相等;
? ? ? ? 這樣的結構看起來很像行波進位加法器RCA,最高層的進位需要從最底層一步步往上傳遞,實則不然。
? ? ? ? 可以舉例,假如兩個加數的最高位A3,B3為00或11,即S3=0時,此時的CO3直接等于DI3(因為00+0不進位和11+1要進位),也就是A3或者說B3(相等的),此時就不需要從下一層傳遞進位信號過來參與運算,這一情況出現的概率為50%。而另外50%的情況A3,B3不相等,即01或10(S3=1)時,此時的CO3取決于CO2(因為10或01+1進位;+0則不進位)。在次高位到最低位的情況均與上述一致。
????????也就是說只有在最極端的情況下,才需要在每一位考慮來自下一級的進位(如1010+0101,也就是每一位的兩個加數均不一致),此時的進位組合邏輯是可能存在的最長組合邏輯路徑。但是這種架構和上述的超前進位加法器比起來,其面積減少了非常多,僅使用了4個MUX2 + 4個XOR門,且這8個門電路均位于CLB的同一個SLICE里邊,不同與傳統的門電路的延遲,其線延遲可以控制得非常小。
3.3、推斷
????????為什么說其本質還是超前進位加法器,我們可以從其邏輯式入手進行推斷:
????????對于CARRY4,S=a ^ b端口D可以任選a、b輸入當中的一個,如選擇b
????????輸出端:那么O端即表示輸出端:O = S ^ cin = a ^ b ^ cin
????????進位端:
????????????????CO=(a^b)'b +(a^b)cin ????????//多路復用器:y=s’b+scin
????????????????=(a’b+ab’)‘b+(a^b)cin
????????????????=(a’b)’(ab’)‘b+(a^b)cin
????????????????=(a+b’)(a’+b)b+(a^b)cin
????????????????=(ab+b’b)(a’+b)+(a^b)cin
? ? ? ? ? ? ? ? =ab(a’+b)+(a^b)cin
????????????????=(a^b)cin+ab
? ? ? ? 假設有十進制的4bit數 4 + 8 =12,則二進制為 0100 + 1000 = 1100,用CARRY4的端口:
- 異或S = A ^ B = 0100 ^ 1000 = 1100
- 進位:CO0 = DI0 = B0 = 0;CO1?= DI1?= B1?= 0;CO2 = CO1??= 0;CO3= CO2??= 0,所以進位CO= 0000,與實際相符
- 位結果:O0 = S0 ^ CIN = 0 ^ 0=0;O1 = S1 ^ CO0 = 0 ^ 0=0;O2 = S2 ^ CO1 = 1 ^ 0=1;O3 = S3 ^ CO2 = 1 ^ 0=1;所以位結果O = 1100,也與實際相符
3.4、測試實例
? ? ? ? 接下來寫個簡單的實例測試一下(2個8位數相加):
module test(input [7:0] A, input [7:0] B, output [7:0] S );assign S = A + B;endmodule? ? ? ? 由于是8bit的加法,所以其綜合結果是2個CARRY4級聯組成。
`timescale 1ns / 1ns module tb_test();reg [7:0] A; reg [7:0] B; wire [7:0] S;//例化test模塊 test test_inst(.A (A), .B (B), .S (S) );initial beginA =0; B =0;#200 $finish; endalways #10 begin A ={$random }%64; B ={$random }%64; endendmodule? ? ? ? 測試結果不說了,一目了然:
總結
以上是生活随笔為你收集整理的从底层结构开始学习FPGA(7)----进位链CARRY4的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IDEA的快捷键与qq的冲突了怎么办
- 下一篇: ART运行时垃圾收集(GC)过程分析