运算部件

运算部件

定点补码加法器设计

全加器

全加器的S有三级门延迟,cout端有两级门延迟。

串行进位加法器

先行进位加法器

进位的传递

\(g_i\) 是进位生成因子。当相加的两位为1的时候才会产生进位因此:\(g_i=a_i*b_i\)

\(p_i\)是进位传递因子,当相加的两位有一个为1的时侯上一级的进位可以传递到下一级,因此\(p_t=a_i+b_i\)

此时有:\(c_{i+1}=pi+g_i*ci\)

4位并行进位逻辑

此时可以实现块内并行

块间并行

思路

块间并行加法器

如上图所示,首先a和b生成p,g需要两级门延迟。第一层的p生成第二级的p0-p3,g0-g3输入需要两级门延迟,然后第二层级的p0-p3和C0生成c1-c3(也就是第一级的c4,c8,c12)需要两级门延迟。最后第一级根据c4,c8,c12,生成c4-c15.需要两级门延迟,一共是8级门延迟。如果是生成16位加法器的s15.需要c15与a15,b15经过全加器得到需要3级门延迟。一共是11级门延迟。

同理如果是得到s31需要10+2+3=15级门延迟

加法器的verilog实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
module add16(a, b, cin, out, cout); 
input [15:0] a;
input [15:0] b;
input cin;
output [15:0] out;
output cout;
wire [15:0] p = a|b;
wire [15:0] g = a&b;
wire [3:0] P, G;
wire [15:0] c;
assign c[0] = cin;
C4 C0_3 (.p(p[3:0]),.g(g[3:0]),.cin(c[0]),.P(P[0]),.G(G[0]),.cout(c[3:1]));
C4 C4_7 (.p(p[7:4]),.g(g[7:4]),.cin(c[4]),.P(P[1]),.G(G[1]),.cout(c[7:5]));
C4 C8_11(.p(p[11:8]),.g(g[11:8]),.cin(c[8]),.P(P[2]),.G(G[2]),.cout(c[11:9]));
C4 C12_15(.p(p[15:12]),.g(g[15:12]),.cin(c[12]),.P(P[3]),.G(G[3]),.cout(c[15:13]));
C4 C_INTER(.p(P),.G(G),.cin(c[0]),.P(),.G(),.cout({c[12],c[8],c[4]}));

assign cout = (a[15]&b[15]) | (a[15]&c[15]) | (b[15]&c[15]);
assign out = (~a&~b&c)|(~a&b&~c)|(a&~b&~c)|(a&b&c);
endmodule
1
2
3
4
5
6
7
8
9
10
11
module C4(p,g,cin,P,G,cout) 
input [3:0] p, g;
input cin;
output P,G;
output [2:0] cout;
assign P=&p;
assign G=g[3]|(p[3]&g[2])|(p[3]&p[2]&g[1])|(p[3]&p[2]&p[1]&g[0]);
assign cout[0]=g[0]|(p[0]&cin);
assign cout[1]=g[1]|(p[1]&g[0])|(p[1]&p[0]&cin);
assign cout[2]=g[2]|(p[2]&g[1])|(p[2]&p[1]&g[0])|(p[2]&p[1]&p[0]&cin);
endmodule

BOOTH乘法器

补码乘法原理

Booth算法

基本原理

Booth二位一乘算法

对于16位乘法一位Booth算法还是需要计算32个数的加法,使用二位一乘后加法只需要进行16个数的相加。

Booth两位乘电路

华莱士树

利用全加器减小加法数量,全加器把三个加数变成两个加数

基本思想

结构

华莱士树进位连接要求 :进位输入信号必须接到进位输出该信号层次的上一层或更高

不这样连接的后果:

16位华莱士树

32位定点补码乘法器