一、進位儲存加法器

進位儲存加法器(Carry Save Adder,CSA)終於開啟了讀者見面會。在之前介紹的眾多加法器的縮寫中,CSA眾多。比較廣為人知的CSA可能是進位儲存加法器,所以它是怎樣的存在呢?

使用進位儲存加法器在執行多個數加法時具有極小的進位傳播延遲,它的基本思想即將

3個加數的和

減少為

2個加數的和

,將進位c和和s分別計算儲存,並且每位元可以獨立計算c和s,所以速度極快。

在許多加法計算中,一般有2個以上,或者更多的加數。

如: Sum = A + B + C + D + E + …

最直接的辦法是:先將A+B結果計算出來,再與C計算,依次進行,如下圖(1)。

【HDL系列】進位儲存加法器原理與設計

對於m個數相加,每個數n位元寬,總共需要m-1次加法。假如使用超前進位加法器LCA的話,直接相加法總共需要的門延遲為

O(mlg n)

;如果使用樹形加法器(後期會介紹),門延遲將變為

O(lg m * lg n)

使用進位儲存加法器CSA結構則可以將門延遲降到更低,其結構如上圖(2)所示,它將3個數相加轉換為2個數相加,最後達到LCA的加數位寬為n+m-2,LCA的門延遲為

O(lg(n+m))

,則總門延遲為

O( m+lg(n+m) )。

以(10 + 7 + 12 = 29)為例看看進位儲存加法器是啥高階操作:

10的二進位制1010;7的二進位制111;12的二進位制1100;列出如下算式,按列2進位制數相加,滿2進1,這就是普通的豎式計算,結果為11100,即29。

【HDL系列】進位儲存加法器原理與設計

豎式計算

而進位儲存加法器將進位Carry與和Sum分開計算,計算步驟如下:

(1)計算和Sum:每一列數相加,對進位制數取模,此處為二進位制,如(0+1+0)=1,(0+1+1)=0,(1+1+1)=1。

(2)計算進位Carry:從豎式低位開始計算,低位向高位進位,每一列的數相加對進位制數取商。如下式中,(0+1+0)/ 2 = 0 … 1,(1+1+0)/ 2 = 1 … 0,忽略餘數。低位向高位傳遞進位。

(3)如下式子中,3個數的和變成了2個數,Carry和Sum,分別是11100和00001,注意,此處Carry是11100不是1110,因為是低位往高位進位,最低位進位為0,從豎式也可以看出,對Carry和Sum相加,結果仍然是11101,即29。

【HDL系列】進位儲存加法器原理與設計

CSA進位Carry與和Sum豎式計算方法

二、3:2 Compressors

3:2 Compressor是進位儲存加法器的一種,它將三個數的和轉換為2個數的和,基本行為與第一部分描述的一致,根據算式的行為,列出其真值表如下:

【HDL系列】進位儲存加法器原理與設計

定睛一看,3:2 Compressor就是一個全加器啊!

所以只要將全加器經過如下的變換,就可以將全加器FA生成進位儲存加法器CSA,簡直換湯不換藥,重新包裝了一下。

【HDL系列】進位儲存加法器原理與設計

三個32位元的數x,y,z相加,其CSA結構如下:

【HDL系列】進位儲存加法器原理與設計

在使用verilog設計一個算式如Sum = A + B + C + D;則可以設計一個全加器,由全加器組成N位元的CSA結構,將多個數合併,經過兩級CSA,最後將進位C[N-1:0]與和Sum[N-1:0]透過一個加法器相加,注意進位C傳入到任何模組中時,需要將C[N-1:0]乘以2,因為這是它合併後真正的數。

歡迎批評指正,更多閱讀,關注“

紙上談芯

”,不定期更新,共同學習:

【HDL系列】進位儲存加法器原理與設計