1. 程式人生 > >carry_ahead adder 超前進位加法器

carry_ahead adder 超前進位加法器

一、1位半加器的實現

1.1 原理

半加器由兩個一位輸入相加,輸出一個結果位和進位,沒有進位輸入的加法器電路。

1.2 真值表

這裡寫圖片描述

1.3 邏輯表示式

S = A ^ B
C = A & B

1.4 Verilog 實現

module half_adder(
input  a,
input b, 
output sum,
output c_out
);

assign sum = a^b;
assign cout = a&b;
endmodule
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

二、1位全加器的實現

2.1 原理

由兩個1位的加數和一個進位作為輸入,輸出一個結果位和進位,與半加器相比,全加器不只考慮本位計算結果是否有進位,也考慮上一位對本位的進位。

2.2 真值表

這裡寫圖片描述

2.3 邏輯表示式

Si =Ai ^ Bi^ Ci-1
Ci = AiBi + AiCi-1 + BiCi-1 = AiBi + (Ai+Bi)Ci-1

2.4 Verilog 實現

2.4.1 兩個半加器和一個或門實現

module full_adder(
input a,
input b,
input c_in,
output sum,
output c_out
);
wire sum1;
wire c_out1,c_out2;

half_adder  half_adder1(.a(a),.b(b),.sum(sum1),.c_out(c_out1));
half_adder  half_adder2(.a(co),.b(sum1),.sum(sum),.c_out(c_out2));
assign c_out =  c_out1|c_out2;
endmodule
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2.4.2 若不用半加器實現,通常三種建模方法,用結構化描述舉例

這裡寫圖片描述
Si =Ai ^ Bi^ Ci-1
Ci = AiBi + AiCi-1 + BiCi-1 = AiBi + (Ai+Bi)Ci-1

module full_adder (
input a,
input b,
input c_in,
output sum,
output c_out
);
wire S1, T1, T2, T3;

xor x1 (S1, a, b);
xor x2 (Sum, S1, c_in);
and A1 (T3, a, b );
and A2 (T2, b, c_in);
and A3 (T1, a, c_in);
or O1 (c_out, T1, T2, T3 );
endmodule
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

三、4位序列加法器

3.1 原理

由4個1位全加器串聯形成4位加法器,上一全加器的進位輸出端作為下一全加器的進位輸入端

3.2 原理圖

這裡寫圖片描述

3.3 邏輯表示式

S0=A0 ^ B0^ Cin
S1 =A1^ B1^ C0
S2 =A2 ^ B2^ C1
S3 =A3 ^ B3^ C2

C0 = A0B0+ A0Cin + B0Cin
C1 = A1B1 + A1C0 + B1C0
C2 = A2B2+ A2C1 + B2C1
C3= A3B3 + A3C2 + B3C2

3.4 Verilog 實現

3.4.1 例化四個1位全加器實現4位序列加法器

module add_4 ( 
input [3:0]a, 
input [3:0]b, 
input c_in, 
output [3:0] sum, 
output c_out 
); 
wire [3:0] c_tmp; 

full_adder i0 ( a[0], b[0], c_in, sum[0], c_tmp[0]); 
full_adder i1 ( a[1], b[1], c_tmp[0], sum[1], c_tmp[1] );  
full_adder i2 ( a[2], b[2], c_tmp[1], sum[2], c_tmp[2] );  
full_adder i3 ( a[3], b[3], c_tmp[2], sum[3], c_tmp[3] );  
assign c_out = c_tmp[3];
endmodule
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

3.4.2 行為級建模方式描述4位加法器

module add_4(
    input [3:0] a,
    input [3:0] b,
    input c_in,
    output [3:0] sum,
    output c_out
    );

assign {c_out,sum} = a+b+c_in;

endmodule
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

使用了拼接運算子——{a,b}

四、4位超前進位加法器的實現

4.1 原理

對普通的全加器進行改良設計的並行加法器,主要針對普通全加器串聯互相進位產生延遲而進行改良

Si =Ai ^ Bi^ Ci-1
Ci = AiBi + AiCi-1 + BiCi-1 = AiBi + (Ai+Bi)Ci-1

令 Gi=Ai*Bi ; Pi=Ai+Bi 代入Ci =AiBi + (Ai+Bi)Ci-1
得 Ci=Gi+Gi*Ci-1

C0 = C_in
C1=G0 + P0·C0
C2=G1 + P1·C1 = G1 + P1·G0 + P1·P0 ▪C0
C3=G2 + P2·C2 = G2 + P2·G1 + P2·P1·G0 + P2·P1·P0·C0
C4=G3 + P3·C3 = G3 + P3·G2 + P3·P2·G1 + P3·P2·P1·G0 + P3·P2·P1·P0·C0
C_out=C4

4.2 原理圖

這裡寫圖片描述

4.3 Verilog 實現4位超前加法器

module fastadd_4(
  input[3:0] a,
  input[3:0] b,
  input c_in,
  output[3:0] sum,
  output c_out
  );
  wire[4:0] g,p,c;
    assign c[0]=c_in;
    assign p=a^b;
    assign g=a&b;
    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 sum=p^c[3:0];
    assign c_out=c[4];
endmodule
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

模擬測試程式碼:

`timescale 1ns/1ps
module add_top;
reg [3:0] a,b;
reg c_in;
wire [3:0] sum;
wire c_out;
fastadd_4 x(.a(a),.b(b),.c_in(c_in),.sum(sum),.c_out(c_out));
initial begin
  a=4'b0000;
  b=4'b0000;
  c_in=0;
end
always #5 c_in=c_in+1;
always #10 a=a+1;
always #160 b=b+1;
endmodule
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16


轉載地址:https://blog.csdn.net/Zach_z/article/details/78353188?locationNum=5&fps=1

一、1位半加器的實現

1.1 原理

半加器由兩個一位輸入相加,輸出一個結果位和進位,沒有進位輸入的加法器電路。

1.2 真值表

這裡寫圖片描述

1.3 邏輯表示式

S = A ^ B
C = A & B

1.4 Verilog 實現

module half_adder(
input  a,
input b, 
output sum,
output c_out
);

assign sum = a^b;
assign cout = a&b;
endmodule
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

二、1位全加器的實現

2.1 原理

由兩個1位的加數和一個進位作為輸入,輸出一個結果位和進位,與半加器相比,全加器不只考慮本位計算結果是否有進位,也考慮上一位對本位的進位。

2.2 真值表

這裡寫圖片描述

2.3 邏輯表示式

Si =Ai ^ Bi^ Ci-1
Ci = AiBi + AiCi-1 + BiCi-1 = AiBi + (Ai+Bi)Ci-1

2.4 Verilog 實現

2.4.1 兩個半加器和一個或門實現

module full_adder(
input a,
input b,
input c_in,
output sum,
output c_out
);
wire sum1;
wire c_out1,c_out2;

half_adder  half_adder1(.a(a),.b(b),.sum(sum1),.c_out(c_out1));
half_adder  half_adder2(.a(co),.b(sum1),.sum(sum),.c_out(c_out2));
assign c_out =  c_out1|c_out2;
endmodule
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2.4.2 若不用半加器實現,通常三種建模方法,用結構化描述舉例

這裡寫圖片描述
Si =Ai ^ Bi^ Ci-1
Ci = AiBi + AiCi-1 + BiCi-1 = AiBi + (Ai+Bi)Ci-1

module full_adder (
input a,
input b,
input c_in,
output sum,
output c_out
);
wire S1, T1, T2, T3;

xor x1 (S1, a, b);
xor x2 (Sum, S1, c_in);
and A1 (T3, a, b );
and A2 (T2, b, c_in);
and A3 (T1, a, c_in);
or O1 (c_out, T1, T2, T3 );
endmodule
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

三、4位序列加法器

3.1 原理

由4個1位全加器串聯形成4位加法器,上一全加器的進位輸出端作為下一全加器的進位輸入端

3.2 原理圖

這裡寫圖片描述

3.3 邏輯表示式

S0=A0 ^ B0^ Cin
S1 =A1^ B1^ C0
S2 =A2 ^ B2^ C1
S3 =A3 ^ B3^ C2

C0 = A0B0+ A0Cin + B0Cin
C1 = A1B1 + A1C0 + B1C0
C2 = A2B2+ A2C1 + B2C1
C3= A3B3 + A3C2 + B3C2

3.4 Verilog 實現

3.4.1 例化四個1位全加器實現4位序列加法器

module add_4 ( 
input [3:0]a, 
input [3:0]b, 
input c_in, 
output [3:0] sum, 
output c_out 
); 
wire [3:0] c_tmp; 

full_adder i0 ( a[0], b[0], c_in, sum[0], c_tmp[0]); 
full_adder i1 ( a[1], b[1], c_tmp[0], sum[1], c_tmp[1] );  
full_adder i2 ( a[2], b[2], c_tmp[1], sum[2], c_tmp[2] );  
full_adder i3 ( a[3], b[3], c_tmp[2], sum[3], c_tmp[3] );  
assign c_out = c_tmp[3];
endmodule
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

3.4.2 行為級建模方式描述4位加法器

module add_4(
    input [3:0] a,
    input [3:0] b,
    input c_in,
    output [3:0] sum,
    output c_out
    );

assign {c_out,sum} = a+b+c_in;

endmodule
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

使用了拼接運算子——{a,b}

四、4位超前進位加法器的實現

4.1 原理

對普通的全加器進行改良設計的並行加法器,主要針對普通全加器串聯互相進位產生延遲而進行改良

Si =Ai ^ Bi^ Ci-1
Ci = AiBi + AiCi-1 + BiCi-1 = AiBi + (Ai+Bi)Ci-1

令 Gi=Ai*Bi ; Pi=Ai+Bi 代入Ci =AiBi + (Ai+Bi)Ci-1
得 Ci=Gi+Gi*Ci-1

C0 = C_in
C1=G0 + P0·C0
C2=G1 + P1·C1 = G1 + P1·G0 + P1·P0 ▪C0
C3=G2 + P2·C2 = G2 + P2·G1 + P2·P1·G0 + P2·P1·P0·C0
C4=G3 + P3·C3 = G3 + P3·G2 + P3·P2·G1 + P3·P2·P1·G0 + P3·P2·P1·P0·C0
C_out=C4

4.2 原理圖

這裡寫圖片描述

4.3 Verilog 實現4位超前加法器

module fastadd_4(
  input[3:0] a,
  input[3:0] b,
  input c_in,
  output[3:0] sum,
  output c_out
  );
  wire[4:0] g,p,c;
    assign c[0]=c_in;
    assign p=a^b;
    assign g=a&b;
    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 sum=p^c[3:0];
    assign c_out=c[4];
endmodule
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

模擬測試程式碼:

`timescale 1ns/1ps
module add_top;
reg [3:0] a,b;
reg c_in;
wire [3:0] sum;
wire c_out;
fastadd_4 x(.a(a),.b(b),.c_in(c_in),.sum(sum),.c_out(c_out));
initial begin
  a=4'b0000;
  b=4'b0000;
  c_in=0;
end
always #5 c_in=c_in+1;
always #10 a=a+1;
always #160 b=b+1;
endmodule
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16


轉載地址:https://blog.csdn.net/Zach_z/article/details/78353188?locationNum=5&fps=1