前言
2023.4.25
一、半加器
兩個數(shù)直接相加,無進位,真值表如下
module add_half(
input A ,
input B ,
output wire S ,
output wire C
);
assign S = A ^ B;
assign C = A & B;
endmodule
二、全加器
兩個數(shù)和進位一起相加,根據(jù)真值表畫出卡諾圖,對表達式進行化簡
S = A ^ B ^ Cin;
CO = A & B | A & Cin | B & Cin;
{CO, S} = A + B + Cin; //也可以直接寫成這種形式
用兩個半加器來組成一個全加器
module add_full(
input A ,
input B ,
input Ci ,
output wire S ,
output wire Co
);
wire c_1;
wire c_2;
wire sum_1;
add_half add_half_1(
.A (A),
.B (B),
.S (sum_1),
.C (c_1)
);
add_half add_half_2(
.A (sum_1),
.B (Ci),
.S (S),
.C (c_2)
);
assign Co = c_1 | c_2;
endmodule
三、串行/行波進位加法器(Ripple-Carry Adder/RCA)
原理:N bit的加法器由N個1 bit的全加器組成
。從低位開始,逐位相加, 每一bit需要等待前面計算出來得到進位,才能進行下一bit的計算
優(yōu)點:電路結構比較簡單
缺點:速度比較慢,組合邏輯延時較長
內部的門延遲如下圖所示:
module add_4(
input [3:0] A ,
input [3:0] B ,
input Ci ,
output wire [3:0] S ,
output wire Co
);
wire [3:0] C;
genvar i; //用generate來例化多個模塊
generate
for(i=0;i<4;i=i+1)begin:adder
add_full add(
.A(A[i]),
.B(B[i]),
.Ci(i==0?Ci:C[i-1]),
.S(S[i]),
.Co(C[i])
);
end
endgenerate
assign Co = C[3];
endmodule
四、超前進位加法器(Lookahead Carry Adder/LCA)
原理:邏輯電路事先得出每一位全加器的進位輸入信號(并行計算各個加法器的進位),而無需再從最低位開始向高位逐位傳遞進位信號,一種用面積換性能的方法。
優(yōu)點:縮短路徑的延時
缺點:電路比較復雜,面積大
只需要三級門電路就可以計算出進位CO
而整個電路的計算結果需要四級延時
module lca_4(
input [3:0] A_in ,
input [3:0] B_in ,
input C_1 ,
output wire CO ,
output wire [3:0] S
);
wire [3:0] P,G,C;
genvar i;
generate for(i=0;i<4;i=i+1)
begin:adder //這個地方的名稱不可少
assign P[i] = A_in[i] ^ B_in[i];
assign G[i] = A_in[i] & B_in[i];
assign C[i] = (i==0)?(G[i] | P[i] & C_1) : (G[i] | P[i] & C[i-1]);
assign S[i] = (i==0)?(P[i] ^ C_1) : (P[i] ^ C[i-1]);
end
endgenerate
assign CO = C[3];
endmodule
五、進位保存加法器(Carry Save Adder/CSA)
原理:把對應bit的數(shù)相加,分別得到進位和和的結果,再把進位和和進行相加。
優(yōu)點:把三個數(shù)相加變成了兩個數(shù)相加,門延遲最小
文章來源:http://www.zghlxwxcb.cn/news/detail-429657.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-429657.html
到了這里,關于verilog手撕代碼2——各種加法器介紹——真值表、表達式、電路圖的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!