概述
之前学习了一位半加器与一/四位全加器的相关知识,接着学习超前进位加法器加深认识
八位级联进位加法器
设计文件
采用硬件行为方式描述八位全加器
1 module qjq(co,sum,a,b,ci); 2 input[7:0] a,b; 3 input ci; 4 output[7:0] sum; 5 output co; 6 reg[7:0] sum; 7 reg co; 8 reg[7:0] G,P,C; //中间变量,分别是生产函数、传递函数、和进位函数 9 always @(a or b or ci) 10 begin 11 G[0] =a[0] & b[0]; //生产函数,加数相与,产生进位 12 P[0] =a[0] | b[0]; //传递函数,如果a或b有不为0,则将进位输入传递 13 C[0] =ci; //最后位的进位输入,初始化位ci 14 sum[0] =G[0]^ P[0] ^ C[0];//输出数据 15 G[1] =a[1] & b[1]; 16 P[1] =a[1] | b[1]; 17 C[1] =G[0] |(P[0] & C[0]);//c=ab+(a+b)ci=G|(P&ci) 18 sum[1] =G[1] ^ P[1] ^ C[1]; 19 G[2] =a[2] & b[2]; 20 P[2] =a[2] | b[2]; 21 C[2] =G[1] |(P[1] & C[1]); 22 sum[2] =G[2] ^ P[2] ^ C[2]; 23 G[3] =a[3]& b[3]; 24 P[3] =a[3] | b[3]; 25 C[3] =G[2] |(P[2] & C[2]); 26 sum[3] =G[3] ^ P[3] ^ C[3]; 27 G[4] =a[4] & b[4]; 28 P[4] =a[4] | b[4]; 29 C[4] =G[3] |(P[3] & C[3]); 30 sum[4] =G[4] ^ P[4] ^ C[4]; 31 G[5] =a[5] & b[5]; 32 P[5] =a[5] | b[5]; 33 C[5] =G[4] |(P[4] & C[4]); 34 sum[5] =G[5] ^ P[5] ^ C[5]; 35 G[6] =a[6] & b[6]; 36 P[6] =a[6] | b[6]; 37 C[6] =G[5] |(P[5] & C[5]); 38 sum[6] =G[6] ^ P[6] ^ C[6]; 39 G[7] =a[7] & b[7]; 40 P[7] =a[7] | b[7]; 41 C[7] =G[6] |(P[6] & C[6]); 42 sum[7] =G[7] ^ P[7] ^ C[7]; 43 co=G[7] |(P[7] & C[7]); 44 end 45 endmodule
仿真结构图
仿真文件
1 module qjqsimu; 2 reg [7:0] a,b; 3 reg ci; 4 wire [7:0] sum; 5 wire co; 6 qjq sl(co,sum,a,b,ci); 7 initial 8 begin 9 a=8'b00000000;b=8'b00000000;ci=0; //初始化,可将a初始大一些得到co为1的情况 10 end 11 always #2 assign {a,b}={a,b}+1; //延迟2ps,增大观察范围 12 always #1 assign ci=~ci; 13 endmodule
仿真波形
说明:首先在设计文件中,由最开始的进位输入ci逐级传递给c,最后传递给co,每位数据都需要传递一次上级数据,代码运算次数多,延时高。
四位超前进位加法器
设计文件
1 module qjq(sum,c_out,a,b,c_in); 2 input[3:0] a,b; 3 input c_in; 4 output[3:0] sum; 5 output c_out; 6 wire[4:0] g,p,c; 7 assign c[0]=c_in; 8 assign p=a|b; 9 assign g=a&b; 10 assign c[1]=g[0]|(p[0]&c[0]); 11 assign c[2]=g[1]|(p[1]&(g[0]|(p[0]&c[0]))); 12 assign c[3]=g[2]|(p[2]&(g[1]|(p[1]&(g[0]|(p[0]&c[0]))))); 13 assign c[4]=g[3]|(p[3]&(g[2]|(p[2]&(g[1]|(p[1]&(g[0]|(p[0]&c[0]))))))); 14 assign sum=p^c[3:0]; 15 assign c_out=c[4]; 16 endmodule
仿真结构图
仿真文件
1 module qjqsimu; 2 reg [3:0] a,b; 3 reg c_in; 4 wire [3:0] sum; 5 wire c_out; 6 qjq U3(.a(a),.b(b),.c_in(c_in),.sum(sum),.c_out(c_out)); 7 initial 8 begin 9 a=4'b0000;b=4'b0000;c_in=0; 10 end 11 always #10 assign {a,b}={a,b}+1; 12 always #5 assign c_in=~c_in; 13 endmodule
仿真波形
说明:设计文件中对每一个进位的运算都进行了合并,总共计算8次,如果按照八位级联加法器的写法,每一位需进行4次运算,加上最后的进位,总共应需要17次计算。显然是提高了效率。
八位超前进位
刚入手八位超前进位加法器的话,写之前就在为进位链的表达式头疼,但是做了一下四位超前进位,可以总结出表达式的规律,进而再写一遍进行验证,与级联加法器的仿真结果完全相同,其设计文件源码如下:
1 module qjq(co,sum,a,b,ci); 2 input [7:0] a,b; 3 input ci; 4 output [7:0] sum; 5 output co; 6 wire [7:0] G,P,C; //中间变量,分别是生产函数、传递函数、和进位函数 7 assign G=a&b; 8 assign P=a|b; 9 assign C[0]=ci; 10 assign C[1]=G[1]|(P[1]&G[0])|(P[1]&P[0]&ci); 11 assign C[2]=G[2]|(P[2]&G[1])|(P[2]&P[1]&G[0])|(P[2]&P[1]&P[0]&ci); 12 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); 13 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); 14 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); 15 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); 16 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); 17 assign sum=P^C[7:0]; 18 assign co=C[7]; 19 endmodule