并行地形成各级进位,各进位之间不存在依赖关系,因而这种方式也称为先行进位、同时进位或跳跃进位。
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
采用先行进位方式的四位全加器
采用串行进位的四位全加器
module myCLA(cin,G0,P0,G1,P1,G2,P2,G3,P3,C0,C1,C2,C3);
input cin,P0,P1,P2,P3,G0,G1,G2,G3;
output C0,C1,C2,C3;
//input [3:0]P,G;
//错误:input [3:0]P,[3:0]G;
assign C0=G0|(P0&cin);
assign C1=G1|(P1&(G0|(P0&cin)));
assign C2=G2|(P2&(G1|(P1&(G0|(P0&cin)))));
assign C3=G3|(P3&(G2|(P2&(G1|(P1&(G0|(P0&cin)))))));
endmodule
module full_adder(a,b,cin,sum,cout);
input a,b,cin;
output sum,cout;
assign {cout,sum}=a +b + cin ;
endmodule