集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 3984|回复: 2

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

[复制链接]
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[31:0],B对应alu_in2[31:0],S对应add_out[32:0]。
这样前两者便是加法器中的input,最后一个便是加法器中的output。
顶层模块的接口就是以上三个。

典型32位的超前进位加法器设计中,将三步运算中的第1,3步各用一个子模块实现,将第2步的运算分为五步,每一步用一个子模块实现,顶层共有7个模块。
        从左至右,第一级由输入数据生成G,P。
        然后是第二,三,四,五,六级,共5级点运算。
        最后第七级,由前六级的结果产生和add_out[31:0]与进位add_out[32]。
        可以看出,这七级是串行执行的关系。
芙蓉帐暖 发表于 2010-8-22 16:37:22 | 显示全部楼层
给你一个实例:你看看就知道了!
module add_ahead(sum,cout,a,b,cin);
output[7:0] sum;
output cout;
input[7:0] a,b;
input cin;
wire[7:0] G,P;
wire[7:0] C,sum;

assign G[0]=a[0]&b[0];            //产生第0位本位值和进位值
assign P[0]=a[0]|b[0];
assign C[0]=cin;
assign sum[0]=G[0]^P[0]^C[0];

assign G[1]=a[1]&b[1];        //产生第1位本位值和进位值
assign P[1]=a[1]|b[1];
assign C[1]=G[0]|(P[0]&cin);
assign sum[1]=G[1]^P[1]^C[1];

assign G[2]=a[2]&b[2];        //产生第2位本位值和进位值
assign P[2]=a[2]|b[2];
assign C[2]=G[1]|(P[1]&C[1]);
assign sum[2]=G[2]^P[2]^C[2];

assign G[3]=a[3]&b[3];        //产生第3位本位值和进位值
assign P[3]=a[3]|b[3];
assign C[3]=G[2]|(P[2]&C[2]);
assign sum[3]=G[3]^P[3]^C[3];

assign G[4]=a[4]&b[4];        //产生第4位本位值和进位值
assign P[4]=a[4]|b[4];
assign C[4]=G[3]|(P[3]&C[3]);
assign sum[4]=G[2]^P[2]^C[2];

assign G[5]=a[5]&b[5];         //产生第5位本位值和进位值
assign P[5]=a[5]|b[5];
assign C[5]=G[4]|(P[4]&C[4]);
assign sum[5]=G[5]^P[5]^C[5];

assign G[6]=a[6]&b[6];        //产生第6位本位值和进位值
assign P[6]=a[6]|b[6];
assign C[6]=G[5]|(P[5]&C[5]);
assign sum[6]=G[6]^P[6]^C[6];

assign G[7]=a[7]&b[7];         //产生第7位本位值和进位值
assign P[7]=a[7]|b[7];
assign C[7]=G[6]|(P[6]&C[6]);
assign sum[7]=G[7]^P[7]^C[7];
assign cout=G[7]|(P[7]&C[7]);     //产生最高位进位输出
endmodule
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-12-25 12:22 , Processed in 0.059006 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表