Verilog 加法器和減法器(6)


     為了減小行波進位加法器中進位傳播延遲的影響,可以嘗試在每一級中快速計算進位,如果能在較短時間完成計算,則可以提高加法器性能。

     我們可以進行如下的推導:

     設 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位超前進位加法器的邏輯圖:

image

8位超前進位加法器的波形結果。

image








免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM