⼏种常见加法器的verilog实现
**⼏种常见加法器的verilog实现**
本⼈刚开始研⼀的学习,想着开个博客把研究⽣学习的内容记录⼀下,也养成⼀个好的习惯。研究⽣的⽅向是数字IC,把最近做的⼏个加法器作业记录⼀下。
eruption⼀:16位进位跳跃加法器。
利⽤门级实现的加法器电路,通过进位传递函数Pi进⾏进位选择,可以提前进位的计算,使得后⼀级计算可以提前,加快计算的过程。这个电路由⼀位全加器,级联成四位加法器,再级联成16位加法器,具体电路如下图:
pay attention to其中Pi = ai ⊕ bi,Pi:j = Pi ·Pi-1…Pj,代码会附上。
⼆:16位进位选择加法器
利⽤门级实现,实际上是加法器进⾏两路计算,⼀路是进位为1的计算,⼀路是进位为0的计算,提前计算好,再根据进位去选择⽤哪⼀路的值,相当于并⾏执⾏计算过程,缩短了等待计算的时间,代码见后
三:16位并⾏前缀加法器
利⽤门级实现,并⾏的意思相当于在知道加数的前提下经过相关运算,可以提前计算出每⼀位的进位是多少,这样便可以很⼤程度节省计算等待的过程,相当于每⼀位的计算都是并⾏执⾏的,但这个电路的缺点是不能级联,写起来相对复杂。
本⼈写这个加法器时先定义好⿊块,灰⾊块和缓冲器块,在⼀⾏⼀⾏书写代码,代码看起来虽多,其实都是⼀些模块的调⽤。
总结
这三个模块经过modelsim仿真,结果正确。
on on`//进位跳跃加法器设计
module carry_skip_adder16(a,b,Cin,sum,Cout);
input [16:1] a,b;
remainedinput Cin;
output [16:1] sum;
output Cout;
wire Cout1,Cout2,Cout3,c1,c2,c3,c4,p1,p2,p3,p4;
muxtwo m1(Cout1,Cin,c1,p1); //c1和cin选择⼀个作为下⼀级的进位
full_adder4 a1(a[4:1],b[4:1],Cin,sum[4:1],c1); //产⽣低四位和数和进位C1,
pi P1(a[4:1],b[4:1],p1); //产⽣进位选择信号p1,⽤来选择c1还是cin作为下⼀级的进位。
muxtwo m2(Cout2,Cout1,c2,p2);
full_adder4 a2(a[8:5],b[8:5],Cout1,sum[8:5],c2);
pi P2(a[8:5],b[8:5],p2);
muxtwo m3(Cout3,Cout2,c3,p3);
full_adder4 a3(a[12:9],b[12:9],Cout2,sum[12:9],c3);
pi P3(a[12:9],b[12:9],p3);
muxtwo m4(Cout,Cout3,c4,p4);
full_adder4 a4(a[16:13],b[16:13],Cout3,sum[16:13],c4);
pi P4(a[16:13],b[16:13],p4);
endmodule
//⼀位全加器
module full_adder(a,b,Cin,sum,Cout);
input a,b;kiddy
input Cin;
output sum;
output Cout;
wire t1,t2,t3;
wire s1;
xor (s1,a,b);
xor (sum,s1,Cin);
and (t3,a,b);
and (t2,b,Cin);
and (t1,a,Cin);
or (Cout,t1,t2,t3);
endmodule
//四位全加器设计
module full_adder4(a,b,Cin,sum,Cout);
input [4:1] a,b;
input Cin;
output [4:1]sum;
output Cout;
wire Cout1,Cout2,Cout3;
full_adder f1(a[1],b[1],Cin,sum[1],Cout1);
full_adder f2(a[2],b[2],Cout1,sum[2],Cout2);
layoff
full_adder f3(a[3],b[3],Cout2,sum[3],Cout3);
full_adder f4(a[4],b[4],Cout3,sum[4],Cout);
endmodule
//⼆选⼀多路选择器
module muxtwo(Cout,c0,c1,p);
input c0,c1,p;
output Cout;
wire np,la,lb;
not (np,p);
and (la,c1,np);
and (lb,c0,p);
or (Cout,la,lb);
endmodule
//进位传递函数⽣成模块
白萝卜的英文module pi(a,b,p);
input [4:1] a,b;
output p;
wire p1,p2,p3,p4;
xor (p1,a[1],b[1]);
xor (p2,a[2],b[2]);
xor (p3,a[3],b[3]);
xor (p4,a[4],b[4]);
and (p,p1,p2,p3,p4);
endmodule
测试⽂件
`timescale 1ns/1ns
module carry_skip_adder16_tb;
reg [16:1] a,b;
reg Cin;
wire [16:1] sum;
wire Cout;
carry_skip_adder16 c1(
.a(a),
.b(b),
.Cin(Cin),
.sum(sum),
.Cout(Cout)
);
betrayalinitial begin
Cin = 1;
a = 231;
b= 331;
#20;
a = 500;
b = 600;
print screen#30;
六级真题下载a = 10;
b = 5;
#200;
$stop;
end
endmodule `
/
/16位进位选择加法器
module carry_lect(a,b,Cin,sum,Cout);
input [16:1] a,b;
input Cin;
output [16:1] sum;
output Cout;
wire c4,c8,c12;
wire c8_0,c8_1,c12_0,c12_1,c16_0,c16_1;
wire [16:1]sum1,sum2;
full_adder4 f1(a[4:1],b[4:1],Cin,sum[4:1],c4);//第⼀级4位加法器
full_adder4 f2(a[8:5],b[8:5],1'b0,sum1[8:5],c8_0);//第⼆级进位为零加法器
full_adder4 f3(a[8:5],b[8:5],1'b1,sum2[8:5],c8_1);//第⼆级进位为1加法器
muxtwo m1(sum[8:5],sum1[8:5],sum2[8:5],c4);
carry_gene u1(c4,c8_0,c8_1,c8); //产⽣第⼆级进位
full_adder4 f4(a[12:9],b[12:9],1'b0,sum1[12:9],c12_0);//第三级进位为零加法器
full_adder4 f5(a[12:9],b[12:9],1'b1,sum2[12:9],c12_1);//第三级进位为1加法器
muxtwo m2(sum[12:9],sum1[12:9],sum2[12:9],c8);
carry_gene u2(c8,c12_0,c12_1,c12); //产⽣第三级进位
full_adder4 f6(a[16:13],b[16:13],1'b0,sum1[16:13],c16_0);//第三级进位为零加法器 full_adder4 f7(a[16:13],b[16:13],1'b1,sum2[16:13],c16_1);//第三级进位为1加法器 muxtwo m3(sum[16:13],sum1[16:13],sum2[16:13],c12);
carry_gene u3(c12,c16_0,c16_1,Cout); //产⽣第三级进位
endmodule
//⼆选⼀多路选择器
module muxtwo(sum,sum1,sum2,c);
input [4:1]sum1,sum2;
input c;
output [4:1] sum;
wire nc;
wire [4:1]la,lb;
not (nc,c);
and (la[1],sum1[1],nc);