半加器(Half Adder)
半加器的功能是将两个一位二进制数相加
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 |