先行进位加法器——原理解析
(2011-12-08 21:38:21)
标签:
先行进位加法器fpga杂谈 |
先行进位加法器
则有
令Gi =
Xi·Yi,
则Ci+1
当Xi和Yi都为1时,Gi = 1,产生进位Ci+1 = 1
当Xi和Yi有一个为1时,Pi = 1,传递进位Ci+1 = Ci
当Gi=0而Pi=1时,进位输出为Ci, 跟Ci之前的逻辑有关。
于是这各级进位输出,递归的展开Ci ,有:
C0 = Cin
C1=G0 + P0·C0
C2=G1 + P1·C1 = G1 + P1·(G0 + P0·C0)=G1 + P1·G0 + P1·P0 ▪C0
C3=G2 + P2·C2 = G2 + P2·G1 + P2·P1·G0 + P2·P1·P0·C0
C4=G3 + P3·C3 = G3 + P3·G2 + P3·P2·G1 + P3·P2·P1·G0 + P3·P2·P1·P0·C0
Cout=C4
同时由真值表可以简单的得出第i位的和为:
module add_ahead(a,b,sum,cin,cout
);
input [3:0] a,b;
input cin;
output [3:0] sum;
output cout;
wire c1,c2,c3;//各级进位输出
wire [3:0] g,p;
//产生第 0 位的本位值和进位输出
assign g[0]= a[0]& b[0];
assign p[0]= a[0]| b[0];
assign sum[0]= g[0]^p[0]^cin;
assign c1=g[0]|(p[0]&cin);
//产生第 1 位的本位值和进位输出
assign g[1]= a[1]& b[1];
assign p[1]= a[1]| b[1];
assign sum[1]= g[1]^p[1]^c1;
assign c2=g[1]|(p[1]&c1);
//产生第 2 位的本位值和进位输出
assign g[2]= a[2]& b[2];
assign p[2]= a[2]| b[2];
assign sum[2]= g[2]^p[2]^c2;
assign c3=g[2]|(p[2]&c2);
//产生第 3 位(最高位)的本位值和进位输出
assign g[3]= a[3]& b[3];
assign p[3]= a[3]| b[3];
assign sum[3]= g[3]^p[3]^c3;
assign cout=g[3]|(p[3]&c3);
endmodule

加载中…