加法器及加法器的优化

半加器(Half Adder)

半加器的功能是将两个一位二进制数相加

  • 输入为 A,B
  • 输出 S(和),C(进位)

1
// 一位半加器,行为描述
2
module half_adder(
3
	input a,b,
4
    output s,
5
    output c
6
);
7
    assign s = a^b;
8
    assing c = a&b;
9
endmodule

全加器 (Full Adder)

全加器由两个半加器构成

  • 输入 A,B,Cin(进位输入)
  • 输出 S,Cout

1
// 四位全加器
2
module adder4(
3
    input [3:0] a, b,
4
    input c_in,
5
    
6
    output [3:0] s,
7
    output c
8
);
9
    assign {c, s} = a+b+c_in;
10
    //全加器的缺点:加法器延时过高
11
    
12
    
13
    assign s = a^b^c_in;
14
    assign c = (a&b) | (c_in^(a^b));
15
endmodule

八位全加器

由四个全加器构成的4-bit加法器

上述加法器被称为行波进位加法器(Ripple Carry Adder),低位全加器的Cout连接到高一位全加器的Cin端。

缺点: 高位必须等待低位的运算完成,延迟时间长。

加法器的优化——超前进位加法器(Carry-Lookahead Adder,CLA)

RCA的主要问题是高位的运算必须等待低位的“进位输出信号”,那我们的优化思路就是‘能否提前计算出“进位输出信号’ ?

首先写出真值表

卡诺图化简后可以得到:

设:进位函数:$G_i = A_i \cdot B_i$,进位传输函数:$P_i = A_i+B_i$

则:$C_{i+1} = G_i + P_i \cdot C_i$

4位超前进位加法器对应的Verilog HDL代码为:

1
module four_bits_fast_adder(sum_out,c_out,a,b,c_in);
2
input [3:0] a,b;
3
input c_in;
4
output [3:0] sum_out;
5
output c_out;
6
7
wire [4:0] g,p,c;
8
assign c[0] = c_in;
9
assign g = a|b;
10
assign p = a&b;
11
assign c[1] = g[0]|(p[0]&c[0]);
12
assign c[2] = g[1]|(p[1]&(g[0]|(p[0]&c[0])));
13
assign c[3] = g[2]|(p[2]&g[1]|(p[1]&(g[0]|(p[0]&c[0]))));
14
assign c[4] = g[3]|(p[3]&g[2]|(p[2]&g[1]|(p[1]&(g[0]|(p[0]&c[0])))));
15
assign sum_out = p^c[3:0];
16
assign c_out = c[4];
17
endmodule