在CPU等對(duì)性能要求較高的電路中,一般都會(huì)采用超前進(jìn)位加法器,因?yàn)槌斑M(jìn)位加法器的延時(shí)相對(duì)來(lái)說(shuō)比較小。下面講述超前進(jìn)位加法器的原理:
我們知道,一個(gè)三輸入,二輸出的全加器,其邏輯關(guān)系為
S = A ⊕ B ⊕ C i n S=A\oplus B\oplus C_{in} S=A⊕B⊕Cin?
C
o
u
t
=
(
A
&
B
)
∣
(
C
i
n
&
(
A
⊕
B
)
)
C_{out}=(A\& B) | (C_{in}\&(A\oplus B))
Cout?=(A&B)∣(Cin?&(A⊕B))
對(duì)于普通的級(jí)聯(lián)的加法器,上一位的進(jìn)位輸出需要作為下一位的進(jìn)位輸入,因此,隨著加法器位寬的增大,加法器的延時(shí)也會(huì)線性增大,如下圖所示。究其原因,就是下一個(gè)比特位對(duì)上一個(gè)比特位的依賴造成的,超前進(jìn)位加法器就是解決了這個(gè)問(wèn)題,從而實(shí)現(xiàn)低延時(shí)的效果。
首先,我們有
C
i
+
1
=
A
i
B
i
+
C
i
(
A
i
+
B
i
)
C_{i+1}=A_{i}B_i+C_i(A_i+B_i)
Ci+1?=Ai?Bi?+Ci?(Ai?+Bi?)
該式子描述了第i+1位的進(jìn)位輸出和第i位的進(jìn)位輸出之間的關(guān)系,如果我們用
C
i
=
A
i
?
1
B
i
?
1
+
C
i
?
1
(
A
i
?
1
+
B
i
?
1
)
C_i=A_{i-1}B_{i-1}+C_{i-1}(A_{i-1}+B_{i-1})
Ci?=Ai?1?Bi?1?+Ci?1?(Ai?1?+Bi?1?)
代替上式中的
C
i
C_i
Ci?,則可以得到
C
i
+
1
C_{i+1}
Ci+1?和
C
i
?
1
C_{i-1}
Ci?1?之間的關(guān)系,進(jìn)一步將
C
i
?
1
C_{i-1}
Ci?1?用
C
i
?
2
C_{i-2}
Ci?2?表示,一直迭代到
C
0
C_0
C0?,即
C
i
n
C_{in}
Cin?,我們發(fā)現(xiàn),此時(shí)進(jìn)位輸出不再依賴于前面任何一級(jí)加法器的結(jié)果,因此也就達(dá)到了我們要的效果。下圖是一個(gè)4位超前進(jìn)位加法器的示意圖,由圖可知,超前進(jìn)位加法器的延遲是固定的,與加法器的位寬無(wú)關(guān),因此超前進(jìn)位加法器具有低延遲的優(yōu)點(diǎn),然后,從圖中也不難發(fā)現(xiàn),隨著位寬的增大,與門(mén)的扇入也隨之增大,因此電路也會(huì)變得更加復(fù)雜。在實(shí)際電路設(shè)計(jì)中,通過(guò)將兩者(串行進(jìn)位加法器、超前進(jìn)位加法器)相結(jié)合,從而在延遲和電路復(fù)雜度間進(jìn)行權(quán)衡。
下面是1個(gè)簡(jiǎn)單的4位超前進(jìn)位加法器的Verilog代碼實(shí)現(xiàn):
module CLA(
input logic cin,
input logic [3:0] a,
input logic [3:0] b,
output logic cout,
output logic [3:0] sum
);
logic [4:0] c;
logic [3:0] g;
logic [3:0] p;
//
assign g=a&b;
assign p=a^b;
assign c[0]=cin;
assign cout=c[4];
//Cout=Gi+PiCin
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])))))));
genvar i;
generate
for(i=0;i<4;i++)begin:sum_block
assign sum[i]=p[i]^c[i];
end
endgenerate
endmodule
相應(yīng)的測(cè)試平臺(tái)為:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-402115.html
module test;
logic [3:0] a;
logic [3:0] b;
logic cin;
logic cout_ref;
logic cout;
logic [3:0] sum_ref;
logic [3:0] sum;
logic error;
initial
begin
repeat(100)
begin
#10
cin=$urandom%2;
a=$urandom%16;
b=$urandom%16;
end
end
assign {cout_ref,sum_ref}=cin+a+b;
assign error=(sum!=sum_ref)?1'b1:1'b0;
initial begin
#1000
$finish;
end
initial begin
$fsdbDumpfile("./out.fsdb");
$fsdbDumpvars(0);
end
CLA u(.*);
endmodule
VCS仿真波形如下圖所示,可以看到,代碼是無(wú)誤的。
【注】本博客搬運(yùn)自本人知乎文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-402115.html
到了這里,關(guān)于Verilog實(shí)現(xiàn)超前進(jìn)位加法器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!