Verilog学习之路(7)— 数字加法器
一、前言
数字加法器是一种较为常见的逻辑运算器件,被广泛用于计算机、通信和多媒体数字集成电路中。广义发加法器包括加法器和减法器,在实际系统中加法器的输入信号通常采用的是补码形式,因此就电路结构而言,加法器和减法电路是一样的,只不过输入信号采用的是补码输入。
二、全加器
如果运算考虑了来自低位的进位,那么该运算就为全加运算,实现全加运算的电路称为全加器。2输入1bit信号全加器的真值表如下所示, 其中A、B是两个加数,CI是来自低位的进位,SUM是相加的和,CO是向高位的进位。
A | B | CI | SUM | CO |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 1 |
通过真值表结合卡诺图我们可以化简得到逻辑表达式为如下所示
SUM = A⊕B⊕CI
CO = AB+(A⊕B)CI
我们则可以得到与之对应的电路图如下所示
在verilog中使用连续赋值语句实现如下所示
module fulladder(SUM, CO, A, B, CI);
input A, B, CI;
output SUM, CO;
assign SUM = A^B^CI;
assign CO = (A&B)|((A^B)&CI);
endmodule
另外还可以直接使用行为级描述方法实现
module fulladder(SUM, CO, A, B, CI);
input A, B, CI;
output SUM, CO;
assign {CO, SUM} = A+B+CI;
endmodule
三、超前进位加法器
超前进位加法器是一种高速加法器,每级进位由附加的组合电路产生,高位的运算不需等待低位运算完成,因此可提供运算速度。如下为超前进位加法器的设计原理,来自《数字电子技术基础(第6版)》
然后我们可以编写一个4位超前进位加法器如下所示
module four_bits_fast_addr(sum, cout, a, b, cin);
input [3:0] a, b;
input cin;
output [3:0] sum;
output cout;
wire [4:0] g,p,c;
assign c[0] = cin;
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 cout = c[4];
endmodule
综合后的电路如图所示
将每一位分拆后如下所示