超前进位加法器设计(参考资料)

更新时间:2023-05-07 13:21:31 阅读: 评论:0

加法器设计(三)超前进位加法器(Verilog
超前进位加法器

module add4_head ( a, b, ci, s, pp, gg);

input[3:0]    a;
input[3:0]    b;
input            ci;

output[3:0]  s;
output          pp;
output          gg;

wire[3:0]      p;
wire[3:0]      g;
wire[2:0]      c;

assign p[0] = a[0] ^ b[0];
assign p[1] = a[1] ^ b[1];
assign p[2] = a[2] ^ b[2];
assign p[3] = a[3] ^ b[3];

assign g[0] = a[0] & b[0];
assign g[1] = a[1] & b[1];
assign g[2] = a[2] & b[2];
assign g[3] = a[3] & b[3];

assign c[0] = (p[0] & ci) | g[0];
assign c[1] = (p[1] & c[0]) | g[1];
assign c[2] = (p[2] & c[1]) | g[2];

assign pp = p[3] & p[2] & p[1] & p[0];
assign gg  = g[3] | (p[3] & (g[2] | p[2] & (g[1] | p[1] & g[0])));

assign s[0] = p[0] ^ ci;
assign s[1] = p[1] ^ c[0];
assign s[2] = p[2] ^ c[1];
assign s[3] = p[3] ^ c[2];

endmodule

首先要明确几个概念:
p表示进位否决信号(pass),如果p0就否决调前一级的进位输入。否决的意思就是即使前一级有进位,本级也不会向后一级产生进位输出。
g表示进位产生信号(generate),如果g1就表示一定会向后一级产生进位输出。

p[n] = a[n] ^ b[n]
这句话的意思是说,当a=1,b=0a=0,b=1时前一级的进位输入信号不能否决。这样就有个问题了,即当a=1,b=1时前一级的进位输入信号也不能否决啊,怎么没有体现出来?其实当a=1,b=1时产生了进位产生信号g,它的优先级高于p信号,就忽略了p信号,直接产生了向后一级产生进位输出,是没有逻辑错误的。

g[n] = a[n] & b[n]
这句话的意思是说,如果a=1,b=1时就直接向后一级产生进位输出信号,而不用考虑其它的任何因素。

pp表示本级模块的进位否决信号,如果pp0就否决调前一级模块的进位输入。
gg表示本级模块进位产生信号,如果gg1就表示一定会向后一级模块产生进位输出。

这两个信号ppgg都是用于超前进位模块之间的连接,如44位超前进位加法器模块再使用超前进位逻辑进行连接构成16位超前进位加法器。

pp = p[3] & p[2] & p[1] & p[0]
这句话的意思是说,当a+b=1111时,此时前一级模块的进位输入不能被否决。

gg = g[3] | (p[3] & (g[2] | p[2] & (g[1] | p[1] & g[0])))
这一句可以这样理解,它是嵌套了几层的:
1.  如果g[3]=1,即最高位要产生进位位,则表示本模块一定会向后一级模块产生进位输出,于是gg=1
2.  如果g[3]=0,但是p[3]=1(表示不能否决掉前一级的进位),而且前一级又有进位输入时,gg=1
3.  以下层次的关系依此类推。

总之,可以看出几个规律:
1.  用于模块内部的pg信号,它们的产生都不依赖于模块内部各位之间的进位信号,而是由输入信号ab直接得到的。
2.  用于模块外部的ppgg信号,它们的产生也不依赖于该模块的进位输入信号,ppgg信号用于超前进位链的再次级联。
3.  当进位产生信号(ggg)为1时,一定向后一级产生进位输出,此时不需要等待前一级进位信号的输入,速度得以加快。
4.  当进位产生信号(ggg)为0时,向不向后一级产生进位输出就不好说了。我们能肯定的是如果此时进位否决信号(ppp)为0,则一定不会向后一级产生进位输出,这种情况也不需要等待前一级进位信号的输入,速度还是得以加快。
5.  如果进位产生信号(ggg)为0,并且进位否决信号(ppp)为1,向不向后一级产生进位输出就完全取决于前一级进位信号的输入了,这时花的时间最长。

写得很仓促,加上原先对超前进位链的结构设计理解不深,内容定有不妥之处,还望大家指正。
超前进位加法器顶层模块
`timescale 1ns / 1ps
module add4_headtest_v;
    // Inputs
    reg [3:0] a;
    reg [3:0] b;
    reg ci;
    // Outputs
    wire [3:0] s;
    wire pp;
    wire gg;
    // Instantiate the Unit Under Test (UUT)
    add4_head uut (
        .a(a),
        .b(b),
        .ci(ci),
        .s(s),
        .pp(pp),
        .gg(gg)
    );
    initial begin
        // Initialize Inputs
        a = 4'b1100;
        b = 4'b1010;
        ci = 1;
        // Wait 100 ns for global ret to finish
        #100;
      a = 4'b1010;
        b = 4'b0011;
        ci = 1;
        // Add stimulus here
       
        #200;
        a = 4'b1011;
        b = 4'b1001;
        ci = 0;
    end
     
endmodule
Verilog 16位超前进位加法器源码
module cla16 (a,b,s);  //top module 含有四个4 位超前进位加法器子模块
input [15:0] a, b;
output [15:0] s;
wire pp4,pp3,pp2,pp1;
wire gg4,gg3,gg2,gg1;
wire [14:0] Cp;
wire [15:0] p,g;

claslice i1 (p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],1'b0,Cp[2],Cp[1],Cp[0],pp1,gg1);
claslice i2 (p[7],p[6],p[5],p[4],g[7],g[6],g[5],g[4],Cp[3],Cp[6],Cp[5],Cp[4],pp2,gg2);
claslice i3 (p[11],p[10],p[9],p[8],g[11],g[10],g[9],g[8],Cp[7],Cp[10],Cp[9],Cp[8],pp3,gg3);
claslice i4 (p[15],p[14],p[13],p[12],g[15],g[14],g[13],g[12],Cp[11],Cp[14],Cp[13],Cp[12],pp4,gg4);
claslice i5 (pp4,pp3,pp2,pp1,gg4,gg3,gg2,gg1,1'b0,Cp[11],Cp[7],Cp[3],pp5,gg5);
pg i0(a[15:0],b[15:0],p[15:0],g[15:0]);
assign s[0]=p[0]^1'b0;
assign s[1]=p[1]^Cp[0];
assign s[2]=p[2]^Cp[1];
assign s[3]=p[3]^Cp[2];
assign s[4]=p[4]^Cp[3];
assign s[5]=p[5]^Cp[4];
assign s[6]=p[6]^Cp[5];
assign s[7]=p[7]^Cp[6];
assign s[8]=p[8]^Cp[7];
assign s[9]=p[9]^Cp[8];
assign s[10]=p[10]^Cp[9];
assign s[11]=p[11]^Cp[10];
assign s[12]=p[12]^Cp[11];
assign s[13]=p[13]^Cp[12];
assign s[14]=p[14]^Cp[13];
assign s[15]=p[15]^Cp[14];
endmodule
module claslice(p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],Co,Cp[2],Cp[1],Cp[0],pp,gg);  //4位超前进位加法器模块
input [3:0] p, g;
input Co;
output [2:0] Cp;
output pp,gg;
assign Cp[0]=g[0]|p[0]&Co;
assign Cp[1]=g[1]|p[1]&Cp[0];
assign Cp[2]=g[2]|p[2]&Cp[1];
assign pp=p[3]&p[2]&p[1]&p[0];
assign gg=g[3]|(p[3]&(g[2]|p[2]&(g[1]|p[1]&g[0])));
endmodule
module pg(a,b,p,g);  //进位产生信号、进位传递信号 产生模块
input [15:0] a, b;
output [15:0] p,g;
assign p=a^b;
assign g=a&b;
endmodule

本文发布于:2023-05-07 13:21:31,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/548493.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:进位   信号   产生   模块   超前   输入   输出   否决
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图