- 基本單元:全加器
- 假設全加器的延遲是1,占用的面積也是1。
- 行波進位加法器(Ripple Carry Adder)
- 結構類似於我們拿筆在紙上做加法的方法。從最低位開始做加法,將進位結果送到下一級做和。由於本級的求和需要等待前一級的進位結果才可以得到,所以對於兩個N-bit的求和。即使有N個一位的全加器,也需要N個延遲。
- 不妨考慮m個n-bit的加數求和,采用樹形結構。占用面積:m*n,時間延遲:n*log2(m)。
- 上面沒有考慮每兩個加數的進位,事實上,采用樹形結構,第一次求和加法器的位數是n,輸出的結果是n+1,最后一次加法的位數就是n+log2(m)。進位產生的多出來的位數就是1/2*log2(m)。故實際的延遲應該是n*log2(m)+1/2*log2(m)*log2(m)
- 超前進位加法器(Carry Look-Ahead, CLA)
- 事實上,在以下兩種情況中,Ci=1:
-
- Ai和Bi都為1
- Ai和Bi有一個為1,且Ci-1為1
- 則第i位的求和電路可以用下圖實現:
-
- 對應的表達式如下:
-
- 遞歸后有:
- 由此可見,每一級的進位僅與輸入信號有關,無需等待前一級的進位而可以根據輸入信號直接產生,這就是超前進位的原理。
- 延遲分析:產生P和G僅需要一個單位的延遲,得到C之后的求和得到S也只需要一個單位的延遲。最大的延遲發生在上例的C4,即P3P2P1P0C0,如果使用二輸入與門或者或門的話,延遲為log2(n),n為兩個加數的bit位數。所以時間復雜度為O(log2(n)),小於行波進位加法器的O(n)。相應的,資源消耗為n*log2(n)。對於m個加數,延遲為log2(m)*log2(n)
- 注意,上面的延遲也沒有計算最高位進位的影響,而是默認每個加數從頭到尾都是n位。
- 進位存儲加法器(Carry Save Adder, CSA)
-
- 在有多個加數的時候,我們可以先加前兩個,再加第三個,如此循環。也可以兩兩配對做加法,然后得到的加數再兩兩配對。這種算法的時間消耗主要是每次得到求和結果時進位需要從后往前累加,而在多個加數時,其實我們可以把本級的進位存儲下來,作為運算結果到下一級求和,而不必立刻求和。
-
- 由上圖可知,完整的進位存儲加法器,先用進位存儲的方法計算每位的部分和以及進位結果,對於m個加數,延時為m-2。在最后階段對着兩部分求和得到最后的結果,注意,此處的延遲不是log2(n),因為每經過一級CSA,就多了一位進位,最后的延遲應該是log2(m-2+n)。所以使用進位存儲加法器計算m個加數,時間復雜度為O(m+log2(m+n))