超前进位加法器的原理是什么?
如题如题 如题 如题 如题 本帖最后由 lcytms 于 2017-4-6 20:35 编辑超前进位加法器
超前进位加法器的思想:三步运算。
1,由输入的A,B算出每一位的G,P;
2,由各位的G,P算出每一位的GN:0,PN:0;
3,由每一位的GN:0,PN:0与CIN算出每一位的COUT,S。
其中第1,3步显然是可以并行处理的,计算的主要复杂度集中在了第2步。
第2步的并行化,也就是实现GN:0,PN:0的点运算分解的并行化。
这种思想的产生,基于对加法器的分析。
令G = AB,P = A⊕B,则COUT(G,P) = G + PCIN,S(G,P)=P⊕CIN。
由此,A,B,CIN,S,COUT五者的关系,变为了G,P,CIN,S,COUT五者的关系。
再由点运算(•),(G,P)•(G’,P’)=(G + PG’,PP’),可以分解(G 3:2,P3:2) =(G3,P3)•(G2,P2)。
设计加法器时,忽略CIN,将COUT并入S,使之成为S的第33位,则只有三个量:A,B,S。
将A对应alu_in1,B对应alu_in2,S对应add_out。
这样前两者便是加法器中的input,最后一个便是加法器中的output。
顶层模块的接口就是以上三个。
在典型32位的超前进位加法器设计中,将三步运算中的第1,3步各用一个子模块实现,将第2步的运算分为五步,每一步用一个子模块实现,顶层共有7个模块。
从左至右,第一级由输入数据生成G,P。
然后是第二,三,四,五,六级,共5级点运算。
最后第七级,由前六级的结果产生和add_out与进位add_out。
可以看出,这七级是串行执行的关系。 给你一个实例:你看看就知道了!
module add_ahead(sum,cout,a,b,cin);
output sum;
output cout;
input a,b;
input cin;
wire G,P;
wire C,sum;
assign G=a&b; //产生第0位本位值和进位值
assign P=a|b;
assign C=cin;
assign sum=G^P^C;
assign G=a&b; //产生第1位本位值和进位值
assign P=a|b;
assign C=G|(P&cin);
assign sum=G^P^C;
assign G=a&b; //产生第2位本位值和进位值
assign P=a|b;
assign C=G|(P&C);
assign sum=G^P^C;
assign G=a&b; //产生第3位本位值和进位值
assign P=a|b;
assign C=G|(P&C);
assign sum=G^P^C;
assign G=a&b; //产生第4位本位值和进位值
assign P=a|b;
assign C=G|(P&C);
assign sum=G^P^C;
assign G=a&b; //产生第5位本位值和进位值
assign P=a|b;
assign C=G|(P&C);
assign sum=G^P^C;
assign G=a&b; //产生第6位本位值和进位值
assign P=a|b;
assign C=G|(P&C);
assign sum=G^P^C;
assign G=a&b; //产生第7位本位值和进位值
assign P=a|b;
assign C=G|(P&C);
assign sum=G^P^C;
assign cout=G|(P&C); //产生最高位进位输出
endmodule
页:
[1]