本节的目的是为了更好的预估delay。
1.1bit全加器
module fadd_1b(
a,
b,
cin,
s,
cout
);
input wire a,b,cin;
output wire s,cout;
wire p,g;
assign p = a|b;//propagate carry
assign g = a&b;//generate carry
assign s = a^b^cin;
assign cout = (p&cin)|g;
endmodule
也可以写成
assign {cout,s} = {1'b0 , a} +{1'b0 ,b} + {1'b0 ,cin};
也可以综合成类似的结构。
2.8bit全加器 行波进位加法器
module add_8b(a,b,s);
input wire [7:0]a,b;
output wire [8:0]s;
assign s = {1'b0, a} + {1'b0 ,b}; //若ab为有符号数,手动扩展符号位s = {a[7], a} + {b[7] ,b};
endmodule
3.为了减小delay,设计了carry select adder,delay由两个4bit adder减少为一个4bit adder 和一个MUX,但是面积增加了50%
4.进一步优化,设计了8bit adder (carry look ahead)超前进位加法器,从算法上改进。
生成信号Gi = Ai *Bi; 传递信号Pi = Ai +Bi.
Ci+1 = Ai *Bi +(Ai +Bi) *Ci
Ci+1 = Gi +Pi *Ci
以4bit为例,delay缩小为三级门延迟。
5.减法器结构
y={1’b0,a[15:0]} - {1’b0,b[15:0]}
y={1’b0,a[15:0]} +(0 - {1’b0,b[15:0]})
y={1’b0,a[15:0]} +({~ {1’b0,b[15:0]}} +1’b1)
通常用二进制补码表示负数
6.三个数相加
CSA(保留进位加法器)
先把每bit对应相加,再把{c[4:1],1’b0}与{1’b0,s[4:1]}做加法。(同[3:0],这里1为最低bit)
7.多bit拓展:
8.乘法器:Wallace Tree拓展;
9.除法器:调IP核