**几种常见加法器的verilog实现**
本人刚开始研一的学习,想着开个博客把研究生学习的内容记录一下,也养成一个好的习惯。研究生的方向是数字IC,把最近做的几个加法器作业记录一下。
一:16位进位跳跃加法器。
利用门级实现的加法器电路,通过进位传递函数Pi进行进位选择,可以提前进位的计算,使得后一级计算可以提前,加快计算的过程。这个电路由一位全加器,级联成四位加法器,再级联成16位加法器,具体电路如下图:
其中Pi = ai ⊕ bi,Pi:j = Pi ·Pi-1…Pj,代码会附上。
二:16位进位选择加法器
利用门级实现,实际上是加法器进行两路计算,一路是进位为1的计算,一路是进位为0的计算,提前计算好,再根据进位去选择用哪一路的值,相当于并行执行计算过程,缩短了等待计算的时间,代码见后
三:16位并行前缀加法器
利用门级实现,并行的意思相当于在知道加数的前提下经过相关运算,可以提前计算出每一位的进位是多少,这样便可以很大程度节省计算等待的过程,相当于每一位的计算都是并行执行的,但这个电路的缺点是不能级联,写起来相对复杂。
本人写这个加法器时先定义好黑块,灰色块和缓冲器块,在一行一行书写代码,代码看起来虽多,其实都是一些模块的调用。
总结
这三个模块经过modelsim仿真,结果正确。
`//进位跳跃加法器设计
module carry_skip_adder16(a,b,Cin,sum,Cout);
input [16:1] a,b;
input 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;
input Cin;
output sum;
output Cout;
wire t1,t2