shaofan530530 发表于 2010-8-5 14:49:55

超前进位加法器的原理是什么?

如题如题 如题 如题 如题

CPLD 发表于 2010-8-5 14:52:23

本帖最后由 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。
        可以看出,这七级是串行执行的关系。

芙蓉帐暖 发表于 2010-8-22 16:37:22

给你一个实例:你看看就知道了!
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]
查看完整版本: 超前进位加法器的原理是什么?