為了減小行波進位加法器中進位傳播延遲的影響,可以嘗試在每一級中快速計算進位,如果能在較短時間完成計算,則可以提高加法器性能。
我們可以進行如下的推導:
設 gi=xi&yi, pi = xi +y i
ci+1 = xi&y i+x i&ci+yi&ci=xi&yi + (xi+yi)&ci=g i+pi&c i = gi+pi&(gi-1+pi-1&ci-1)=g i+pi&g i-1+pi&pi-1&ci-1= ….=gi+pi &gi-1+pi &pi-1&gi-2+…+pi&pi-1…p2&p1 &g0+pi &pi-1..p1 &p0&c0; 實現這個邏輯電路的加法器是超前進位加法器。從公式中,可以看出門延時要比行波進位加法器小很多。但是電路復雜,邏輯門的扇入數量將限制超前進位加法器的速度。
由於扇入數量限制,通常我們僅實現4位超前進位加法器和8位超前進位加法器,然后在串聯成16/32/64等高位加法器。
下面是4位和8位的超前進位加法器代碼:
module adder4_fast( cin, x, y, s, cout ); input cin; input [3:0] x; input [3:0] y; output [3:0] s; output cout; wire [4:0] g,p,c; assign c[0] = cin; assign p = x | y; assign g = x & y; //assign c[1] = g[0] | (p[0] & c[0]); //assign c[2] = g[1] | (p[1] & (g[0] | (p[0] & c[0]))); //assign c[3] = g[2] | (p[2] & (g[1] | (p[1] & (g[0] | (p[0] & c[0]))))); //assign c[4] = g[3] | (p[3] & (g[2] | (p[2] & (g[1] | (p[1] & (g[0] | (p[0] & c[0]))))))); assign c[1] = g[0] | (p[0] & c[0]); assign c[2] = g[1] | (p[1]&g[0])|(p[1]&p[0]&c[0]); assign c[3] = g[2] | (p[2]&g[1])|(p[2]&p[1]&g[0])|(p[2]&p[1]&p[0]&c[0]); assign c[4] = g[3] | (p[3]&g[2])|(p[3]&p[2]&g[1])|(p[3]&p[2]&p[1]&g[0])|(p[3]&p[2]&p[1]&p[0]&c[0]); assign s = x^y^c[3:0]; assign cout = c[4]; endmodule
module adder8_fast( cin, x, y, s, cout ); input cin; input [7:0] x; input [7:0] y; output [7:0] s; output cout; wire [8:0] g,p,c; assign c[0] = cin; assign p = x | y; assign g = x & y; //assign c[1] = g[0] | (p[0] & c[0]); //assign c[2] = g[1] | (p[1] & (g[0] | (p[0] & c[0]))); //assign c[3] = g[2] | (p[2] & (g[1] | (p[1] & (g[0] | (p[0] & c[0]))))); //assign c[4] = g[3] | (p[3] & (g[2] | (p[2] & (g[1] | (p[1] & (g[0] | (p[0] & c[0]))))))); //assign c[5] = g[4] | (p[4] & (g[3] | (p[3] & (g[2] | (p[2] & (g[1] | (p[1] & (g[0] | (p[0] & c[0]))))))))); //assign c[6] = g[5] | (p[5] & (g[4] | (p[4] & (g[3] | (p[3] & (g[2] | (p[2] & (g[1] | (p[1] & (g[0] | (p[0] & c[0]))))))))))); //assign c[7] = g[6] | (p[6] & (g[5] | (p[5] & (g[4] | (p[4] & (g[3] | (p[3] & (g[2] | (p[2] & (g[1] | (p[1] & (g[0] | (p[0] & c[0]))))))))))))); //assign c[8] = g[7] | (p[7] & (g[6] | (p[6] & (g[5] | (p[5] & (g[4] | (p[4] & (g[3] | (p[3] & (g[2] | (p[2] & (g[1] | (p[1] & (g[0] | (p[0] & c[0]))))))))))))))); assign c[1] = g[0] | (p[0] & c[0]); assign c[2] = g[1] | (p[1]&g[0])|(p[1]&p[0]&c[0]); assign c[3] = g[2] | (p[2]&g[1])|(p[2]&p[1]&g[0])|(p[2]&p[1]&p[0]&c[0]); assign c[4] = g[3] | (p[3]&g[2])|(p[3]&p[2]&g[1])|(p[3]&p[2]&p[1]&g[0])|(p[3]&p[2]&p[1]&p[0]&c[0]); assign c[5] = g[4] | (p[4]&g[3])|(p[4]&p[3]&g[2])|(p[4]&p[3]&p[2]&g[1])|(p[4]&p[3]&p[2]&p[1]&g[0])|(p[4]&p[3]&p[2]&p[1]&p[0]&c[0]); assign c[6] = g[5] | (p[5]&g[4])|(p[5]&p[4]&g[3])|(p[5]&p[4]&p[3]&g[2])|(p[5]&p[4]&p[3]&p[2]&g[1])|(p[5]&p[4]&p[3]&p[2]&p[1]&g[0])|(p[5]&p[4]&p[3]&p[2]&p[1]&p[0]&c[0]); assign c[7] = g[6] | (p[6]&g[5])|(p[6]&p[5]&g[4])|(p[6]&p[5]&p[4]&g[3])|(p[6]&p[5]&p[4]&p[3]&g[2])|(p[6]&p[5]&p[4]&p[3]&p[2]&g[1])|(p[6]&p[5]&p[4]&p[3]&p[2]&p[1]&g[0])|(p[6]&p[5]&p[4]&p[3]&p[2]&p[1]&p[0]&c[0]); assign c[8] = g[7] | (p[7]&g[6])|(p[7]&p[6]&g[5])|(p[7]&p[6]&p[5]&g[4])|(p[7]&p[6]&p[5]&p[4]&g[3])|(p[7]&p[6]&p[5]&p[4]&p[3]&g[2])|(p[7]&p[6]&p[5]&p[4]&p[3]&p[2]&g[1])|(p[7]&p[6]&p[5]&p[4]&p[3]&p[2]&p[1]&g[0])|(p[7]&p[6]&p[5]&p[4]&p[3]&p[2]&p[1]&p[0]&c[0]); assign s = x^y^c[7:0]; assign cout = c[8]; endmodule
下面的代碼把4個超前進位加法器串聯起來,形成一個32位加法器。
module addern_fast( cin, x, y, s, cout ); input cin; input [31:0] x; input [31:0] y; output [31:0] s; output cout; wire [2:0] cout_tmp; adder8_fast adder8_fast_0(.cin(cin),.x(x[7:0]),.y(y[7:0]),.s(s[7:0]),.cout(cout_tmp[0])); adder8_fast adder8_fast_1(.cin(cout_tmp[0]),.x(x[15:8]),.y(y[15:8]),.s(s[15:8]),.cout(cout_tmp[1])); adder8_fast adder8_fast_2(.cin(cout_tmp[1]),.x(x[23:16]),.y(y[23:16]),.s(s[23:16]),.cout(cout_tmp[2])); adder8_fast adder8_fast_3(.cin(cout_tmp[2]),.x(x[31:24]),.y(y[31:24]),.s(s[31:24]),.cout(cout)); endmodule
下面是4位超前進位加法器的邏輯圖:
8位超前進位加法器的波形結果。