????????接下來幾篇博客,我將介紹常見的幾種加法器設(shè)計,包括超前進位、Kogge-Stone、brent-kung、carry-skip、Conditional-Sum等加法器的原理及Verilog實現(xiàn)。
???????本文將介紹行波進位加法器、超前進位加法器的原理及Verilog實現(xiàn)。
1. 行波進位加法器 (Ripple Carry Adder,?RCA)
1.1 原理
???????從下方原理圖即可看出,行波進位加法器由一系列全加器級聯(lián)而成,這種加法器面積小,由于每一比特的進位輸入必須等待前一比特完成進位輸出的計算,所以這種加法器的速度慢。

1.2 Verilog實現(xiàn)
(1)完成單比特全加器的模塊
module full_adder(
input a,
input b,
input c_in,
output sum,
output c_out
);
assign {c_out,sum} = a + b + c_in;
endmodule
(2)全加器級聯(lián)
module RCA(
input [3:0] a,
input [3:0] b,
input c_in,
output [3:0] sum,
output c_out
);
wire sum1,sum2,sum3,sum4;
wire c_out1,c_out2,c_out3;
assign sum = {sum4,sum3,sum2,sum1};
full_adder f0(
.a(a[0]),
.b(b[0]),
.c_in(c_in),
.sum(sum1),
.c_out(c_out1)
);
full_adder f1(
.a(a[1]),
.b(b[1]),
.c_in(c_out1),
.sum(sum2),
.c_out(c_out2)
);
full_adder f2(
.a(a[2]),
.b(b[2]),
.c_in(c_out2),
.sum(sum3),
.c_out(c_out3)
);
full_adder f3(
.a(a[3]),
.b(b[3]),
.c_in(c_out3),
.sum(sum4),
.c_out(c_out)
);
endmodule

2. 超前進位加法器 (Carry Look Ahead Adder , CLA)
2.1 設(shè)計原理

? ? ? ?我們可以按A、B異或結(jié)果和A·B結(jié)果分成3組(表中用不同顏色進行區(qū)分),不難發(fā)現(xiàn),第一組沒有進位,第三組必有進位,第二組中Ci為1則有進位。因此可以通過這種特性提前得到進位。
? ? ? ?定義:
? ? ? ?根據(jù)真值表的特點可以推出:
???????因此,CLA的計算流程如下:
? ? ? ?1)?對面向輸入的第一層,并行預(yù)計算gi和pi
? ? ? ?2) 計算進位ci
? ? ? ?3) 根據(jù)pi和ci計算si
???????超前進位加法器優(yōu)化改進行波進位器的關(guān)鍵路徑,通過采用并行計算進位的方法,解決了行波進位加法器的進位依賴問題。然而對于大位寬的超前進位加法器,進位邏輯計算單元面積耗費大。
2.2 Verilog實現(xiàn)
(1)pg單元設(shè)計
module pg_cell(
input a,
input b,
output g,
output p
);
assign g = a & b;
assign p = a ^ b;
endmodule
(2)CLA實現(xiàn)文章來源:http://www.zghlxwxcb.cn/news/detail-720940.html
module LCA #(width=4) (
input [width-1:0] op1,
input [width-1:0] op2,
input cin,
output [width-1:0] sum1,
output [width-1:0] sum2,
output cout,
output cout2
);
//CLA
wire [width-1:0] g;
wire [width-1:0] p;
wire [width:0] c;
//gp generator
genvar i;
for( i=0; i<width; i=i+1) begin
pg_cell pg_cell_u(
.a( op1[i]),
.b( op2[i]),
.g( g[i] ),
.p( p[i] )
);
end
//carry generator
assign c[0] = cin;
assign c[1] = g[0] + ( c[0] & p[0] );
assign c[2] = g[1] + ( (g[0] + ( c[0] & p[0]) ) & p[1] );
assign c[3] = g[2] + ( (g[1] + ( (g[0] + (c[0] & p[0]) ) & p[1])) & p[2] );
assign c[4] = g[3] + ( (g[2] + ( (g[1] + ( (g[0] + (c[0] & p[0]) ) & p[1])) & p[2] )) & p[3]);
assign cout = c[width];
genvar k;
for( k=0; k<width; k=k+1) begin
assign sum1[k] = p[k] ^ c[k];
end
endmodule

求學(xué)路上,你我共勉(??????)??文章來源地址http://www.zghlxwxcb.cn/news/detail-720940.html
到了這里,關(guān)于各種加法器的比對分析與Verilog實現(xiàn)(1)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!