超前进位加法器

概述

之前学习了一位半加器与一/四位全加器的相关知识,接着学习超前进位加法器加深认识

八位级联进位加法器

设计文件

采用硬件行为方式描述八位全加器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
module qjq(co,sum,a,b,ci);
    input[7:0] a,b;
    input ci;
    output[7:0] sum;
    output co;
    reg[7:0] sum;
    reg co;
    reg[7:0] G,P,C;         //中间变量,分别是生产函数、传递函数、和进位函数
always @(a or b or ci)
    begin
    G[0] =a[0] & b[0];      //生产函数,加数相与,产生进位
    P[0] =a[0] | b[0];      //传递函数,如果a或b有不为0,则将进位输入传递
    C[0] =ci;               //最后位的进位输入,初始化位ci
    sum[0] =G[0]^ P[0] ^ C[0];//输出数据
    G[1] =a[1] & b[1];
    P[1] =a[1] | b[1];
    C[1] =G[0] |(P[0] & C[0]);//c=ab+(a+b)ci=G|(P&ci)
    sum[1] =G[1] ^ P[1] ^ C[1];
    G[2] =a[2] & b[2];
    P[2] =a[2] | b[2];
    C[2] =G[1] |(P[1] & C[1]);
    sum[2] =G[2] ^ P[2] ^ C[2];
    G[3] =a[3]& b[3];
    P[3] =a[3] | b[3];
    C[3] =G[2] |(P[2] & C[2]);
    sum[3] =G[3] ^ P[3] ^ C[3];
    G[4] =a[4] & b[4];
    P[4] =a[4] | b[4];
    C[4] =G[3] |(P[3] & C[3]);
    sum[4] =G[4] ^ P[4] ^ C[4];
    G[5] =a[5] & b[5];
    P[5] =a[5] | b[5];
    C[5] =G[4] |(P[4] & C[4]);
    sum[5] =G[5] ^ P[5] ^ C[5];
    G[6] =a[6] & b[6];
    P[6] =a[6] | b[6];
    C[6] =G[5] |(P[5] & C[5]);
    sum[6] =G[6] ^ P[6] ^ C[6];
    G[7] =a[7] & b[7];
    P[7] =a[7] | b[7];
    C[7] =G[6] |(P[6] & C[6]);
    sum[7] =G[7] ^ P[7] ^ C[7];
    co=G[7] |(P[7] & C[7]);
        end
    endmodule

仿真结构图

 

仿真文件

1
2
3
4
5
6
7
8
9
10
11
12
13
module qjqsimu;
reg [7:0] a,b;
reg ci;
wire [7:0] sum;
wire co;
qjq sl(co,sum,a,b,ci);
initial
    begin
        a=8'b00000000;b=8'b00000000;ci=0;   //初始化,可将a初始大一些得到co为1的情况
    end
always #2 assign {a,b}={a,b}+1;             //延迟2ps,增大观察范围
always #1 assign ci=~ci;
endmodule

仿真波形

 

说明:首先在设计文件中,由最开始的进位输入ci逐级传递给c,最后传递给co,每位数据都需要传递一次上级数据,代码运算次数多,延时高。

四位超前进位加法器

设计文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
module qjq(sum,c_out,a,b,c_in);
  input[3:0] a,b;
  input c_in;
  output[3:0] sum;
  output c_out;
  wire[4:0] g,p,c;
    assign c[0]=c_in;
    assign p=a|b;
    assign g=a&b;
    assign c[1]=g[0]|(p[0]&c[0]);
    assign c[2]=g[1]|(p[1]&(g[0]|(p[0]&c[0])));
    assign c[3]=g[2]|(p[2]&(g[1]|(p[1]&(g[0]|(p[0]&c[0])))));
    assign c[4]=g[3]|(p[3]&(g[2]|(p[2]&(g[1]|(p[1]&(g[0]|(p[0]&c[0])))))));
    assign sum=p^c[3:0];
    assign c_out=c[4];
endmodule

仿真结构图

 

仿真文件

1
2
3
4
5
6
7
8
9
10
11
12
13
module qjqsimu;
  reg [3:0] a,b;
  reg c_in;
  wire [3:0] sum;
  wire c_out;
  qjq U3(.a(a),.b(b),.c_in(c_in),.sum(sum),.c_out(c_out));
  initial 
    begin
      a=4'b0000;b=4'b0000;c_in=0;
  end
  always #10 assign {a,b}={a,b}+1;             
  always #5 assign c_in=~c_in;
endmodule

仿真波形

 

说明:设计文件中对每一个进位的运算都进行了合并,总共计算8次,如果按照八位级联加法器的写法,每一位需进行4次运算,加上最后的进位,总共应需要17次计算。显然是提高了效率。

八位超前进位

刚入手八位超前进位加法器的话,写之前就在为进位链的表达式头疼,但是做了一下四位超前进位,可以总结出表达式的规律,进而再写一遍进行验证,与级联加法器的仿真结果完全相同,其设计文件源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
module qjq(co,sum,a,b,ci);
    input [7:0] a,b;
    input ci;
    output [7:0] sum;
    output co;
    wire [7:0] G,P,C;         //中间变量,分别是生产函数、传递函数、和进位函数
assign    G=a&b;
assign    P=a|b;
assign    C[0]=ci;
assign    C[1]=G[1]|(P[1]&G[0])|(P[1]&P[0]&ci);
assign    C[2]=G[2]|(P[2]&G[1])|(P[2]&P[1]&G[0])|(P[2]&P[1]&P[0]&ci);
assign    C[3]=G[3]|(P[3]&G[2])|(P[3]&P[2]&G[1])|(P[3]&P[2]&P[1]&G[0])|(P[3]&P[2]&P[1]&P[0]&ci);
assign    C[4]=G[4]|(P[4]&G[3])|(P[4]&P[3]&G[2])|(P[4]&P[3]&P[2]&G[1])|(P[4]&P[3]&P[2]&P[1]&G[0])|(P[4]&P[3]&P[2]&P[1]&P[0]&ci);
assign    C[5]=G[5]|(P[5]&P[4]&G[3])|(P[5]&P[4]&P[3]&G[2])|(P[5]&P[4]&P[3]&P[2]&G[1])|(P[5]&P[4]&P[3]&P[2]&P[1]&G[0])|(P[5]&P[4]&P[3]&P[2]&P[1]&P[0]&ci);
assign    C[6]=G[6]|(P[6]&G[5])|(P[6]&P[5]&G[4])|(P[6]&P[5]&P[4]&G[3])|(P[6]&P[5]&P[4]&P[3]&G[2])|(P[6]&P[5]&P[4]&P[3]&P[2]&G[1])|(P[6]&P[5]&P[4]&P[3]&P[2]&P[1]&G[0])|(P[6]&P[5]&P[4]&P[3]&P[2]&P[1]&P[0]&ci);
assign    C[7]=G[7]|(P[7]&G[6])|(P[7]&P[6]&G[5])|(P[7]&P[6]&P[5]&G[4])|(P[7]&P[6]&P[5]&P[4]&G[3])|(P[7]&P[6]&P[5]&P[4]&P[3]&G[2])|(P[7]&P[6]&P[5]&P[4]&P[3]&P[2]&G[1])|(P[7]&P[6]&P[5]&P[4]&P[3]&P[2]&P[1]&G[0])|(P[7]&P[6]&P[5]&P[4]&P[3]&P[2]&P[1]&P[0]&ci);
assign   sum=P^C[7:0];
assign   co=C[7];
    endmodule
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值