Altifigence Academy

16 / 63 · 概念

加法器與進位傳遞結構

推導全加器公式,同時分析漣波進位的功能、寬度與延遲。

一個位元位置的總和需要兩個位元表示

ai,bi,cia_i,b_i,c_i 相加範圍為 0~3,因此需要總和 sis_i 與送往下一位的 carry ci+1c_{i+1}。三個輸入中有奇數個 1 時,總和位元為 1;至少兩個為 1 時,carry 為 1。

si=ai⊕bi⊕cis_i=a_i\oplus b_i\oplus c_i
ci+1=aibi+(ai⊕bi)cic_{i+1}=a_ib_i+(a_i\oplus b_i)c_i

定義 generate gi=aibig_i=a_ib_i、propagate pi=ai⊕bip_i=a_i\oplus b_i,可得 ci+1=gi+picic_{i+1}=g_i+p_ic_i,其中 ++ 為 OR。半加器是沒有 carry 輸入的特例,總和為 XOR,carry 為 AND。

切換三個輸入,確認 a+b+cin = sum+2×cout 是否永遠成立。carry 成為下一位的輸入,其位權與 sum 不同。

一個位元的和與送往下一位的進位

a + b + cin = sum + 2 × cout

Carry 會傳到多遠

考慮 4 位元 1111 + 0001。bit 0 產生 carry,再傳過其餘三位。要儲存的總和為 0000,最高位 carry 為 1。在 ripple-carry 結構中,低位 carry 可能使高位計算必須等待。

c2=g1+p1g0+p1p0c0c_2=g_1+p_1g_0+p_1p_0c_0

展開算式後,可看見平行計算 carry 的可能性。實際高速加法器會組合群組 propagate/generate,但需在包含扇入、配線及元件庫的面積與延遲間取捨。RTL 的 + 不一定實作成某一種 ripple-carry 電路。

在設計中保留總和寬度

SystemVerilog
logic [3:0] a, b, sum;
logic cin, cout;
logic [4:0] wide_sum;
assign wide_sum = {1'b0, a} + {1'b0, b} + {4'b0000, cin};
assign sum = wide_sum[3:0];
assign cout = wide_sum[4];

最大需表示 15+15+1=3115+15+1=31,因此 5 位元足夠。先決定是否只需低位總和、carry 是否傳到下一級,以及是否需要飽和。互動練習用來確認單位全加器的真值表真值表完整列出所有可能的輸入組合,以及每個組合的輸出。隨時間的變化須另外以波形確認。 詳細內容,不是量測實際合成結果延遲的工具。

變更輸入以觀察結果

自己試試看

4 位元 unsigned 中,a=9a=9、b=6b=6、cin=1c_{in}=1,求完整總和、4 位元總和與 carry。若把同一電路解讀成 signed 加法,能只憑 carry 判斷 overflow 嗎?

查看解說

完整總和為 16,位元序列為 10000,因此 sum=0000、carry=1。signed 解讀中 1001 是 −7,故 −7+6+1=0-7+6+1=0,仍在範圍內。carry 與 signed overflow 是不同條件。

此選擇適用於本瀏覽器,隨時可從頁尾變更。