您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 16位超前进位加法器的verilog实现
HHaarrbbiinnIInnssttiittuutteeooffTTeecchhnnoollooggyyvveerriilloogg实实验验报报告告((11))设计题目:16位超前进位加法器班级:姓名:学号:哈尔滨工业大学2015年6月一、功能描述加法运算是最基本的运算,所有其他基本算术运算都是以加法运算为基础。但因为加法运算存在进位问题,使得某一位计算结果的得出和所有低于它的位相关,因此,为了减少进位传输所耗的时间,提高计算速度,我们可以采用超前进位加法器,它是利用输入信号来预先产生高位进位信号,从而减少进位从低位到高位的传递时间。超前进位加法器,不同于串行进位加法器,对于每一位的结果是否有进位,不需要等前一位的进位结果计算出来,而是只要输入A,B到来就可以经过一些列的逻辑运算同时计算出各位是否有进位。理论上讲无论多少位的加法器都可以设计成为超前进位加法器,但是当位数很大的时候,超前进位加法器的逻辑会变得异常复杂,而失去了使用的意义,所以大多数超前进位加法器做到4位,而多于4位的要求,就用多个超前进位加法器级联实现,所以本设计要进行16位的加法运算,我们可以将其分成四组,组内采用超前进位,组间采用串行进位,既提高了运算速度,又不至于采用过多的门数。二、设计方案1.设计原理首先做两个传递函数;进位产生函数Gi和进位传送函数Gi=AiBiPi=Ai^Bi当Gi=1时会产生进位,而当Pi=1时会使进位输入传到输出。根据全加器原理,第i位的进位及和的输出可表示为Ci=Gi+PiCi-1Si=Pi^Ci-1由此可得各位的进位输出表达式C1=G1+P1C0C2=G2+P2G1+P2P1C0C3=G3+P3G2+P3P2G1+P3P2P1C0C4=G4+P4G3+P4P3G2+P4P3P2G1+P4P3P2P1C0…这样经过函数Pi和函数Qi产生一级时间延迟,经过计算C产生一级时延迟,则A,B输入一旦产生即可算出结果。2.设计思路进行16位超前进位加法器设计时由于位数太多如果采用全部超前进位则电路的逻辑结构极其复杂并且电路的规模会很大可以考虑用4个4位超前进位加法器来实现16位超前进位加法器的设计。三、关键代码1.首先我们进行四位超前进位加法器的设计,由设计方案中所述的算法,定义一个名为fulladder4的模块,该模块中的关键代码如下:assignp0=a[0]^b[0],p1=a[1]^b[1],p2=a[2]^b[2],p3=a[3]^b[3];assigng0=a[0]&b[0],g1=a[1]&b[1],g2=a[2]&b[2],g3=a[3]&b[3];assignc1=g0|(p0&c_in),c2=g1|(p1&g0)|(p1&p0&g0)|(p2&p1&p0&c_in),c3=g2|(p2&g1)|(p2&p1&g0)|(p3&p2&p1&p0&c_in),c4=g3|(p3&g2)|(p3&p2&g1)|(p3&p2&p1&g0)|(p3&p2&p1&p0&c_in);assignsum[0]=p0^c_in,sum[1]=p1^c1,sum[2]=p2^c2,sum[3]=p3^c3;assignc_out=c4;2.我们定义名为fulladder16的16位超前进位加法器,主要是通过例化四位超前进位加法器得到,关键代码如下:fulladder4i1(sum[3:0],c3,a[3:0],b[3:0],c_in);fulladder4i2(sum[7:4],c7,a[7:4],b[7:4],c3);fulladder4i3(sum[11:8],c11,a[11:8],b[11:8],c7);fulladder4i4(sum[15:12],c15,a[15:12],b[15:12],c11);assignc_out=c15;3.编写测试脚本文件,由于我们不可能将所有可能的输入一一列举,但是我们可以输入一些具有代表性的数据,例如我们可以让每四位数产生级间进位,观察结果是否正确,激励文件关键代码:initialbegina=5;b=4;c_in=0;#5a=2;b=6;c_in=1;#5a=4'b1101;b=4'b0011;c_in=0;#5a=8'b1101_0011;b=8'b0110_0001;c_in=1;#5a=12'b0101_1100_0101;b=12'b1100_0000_0101;c_in=0;#5a=16'b1011_0001_1100_1010;b=16'b1100_0000_0011_0000;c_in=1;end四、仿真与验证通过modelsim进行仿真,仿真时间设为30ps,波形图结果如下,从数据我们可知该系统实现了功能。仿真结果:0a=0000000000000101,b=0000000000000100,c_in=0sum=0000000000001001,c_out=05a=0000000000000010,b=0000000000000110,c_in=1sum=0000000000001001,c_out=010a=0000000000001101,b=0000000000000011,c_in=0sum=0000000000010000,c_out=015a=0000000011010011,b=0000000001100001,c_in=1sum=0000000100110101,c_out=020a=0000010111000101,b=0000110000000101,c_in=0sum=0001000111001010,c_out=025a=1011000111001010,b=1100000000110000,c_in=1sum=0111000111111011,c_out=1仿真波形图如下:从该图中可以更直观地验证结果。五、结论通过对16位超前进位加法器进行功能仿真,本设计达到了预定设计的目的,实现了利用verilog语言设计16位超前进位加法器这样一个简单的数字电路,但在验证时,我们只是测试观察了有限的输入,因此可靠性不强。更加可靠的验证方法有待于进一步的研究。附录116位超前进位加法器的verilog代码:modulefulladder16(sum,c_out,a,b,c_in);output[15:0]sum;outputc_out;input[15:0]a,b;inputc_in;wirec3,c7,c11,c15;fulladder4i1(sum[3:0],c3,a[3:0],b[3:0],c_in);fulladder4i2(sum[7:4],c7,a[7:4],b[7:4],c3);fulladder4i3(sum[11:8],c11,a[11:8],b[11:8],c7);fulladder4i4(sum[15:12],c15,a[15:12],b[15:12],c11);assignc_out=c15;endmodulemodulefulladder4(sum,c_out,a,b,c_in);output[3:0]sum;outputc_out;input[3:0]a,b;inputc_in;wirep0,g0,p1,g1,p2,g2,p3,g3;wirec1,c2,c3,c4;assignp0=a[0]^b[0],p1=a[1]^b[1],p2=a[2]^b[2],p3=a[3]^b[3];assigng0=a[0]&b[0],g1=a[1]&b[1],g2=a[2]&b[2],g3=a[3]&b[3];assignc1=g0|(p0&c_in),c2=g1|(p1&g0)|(p1&p0&g0)|(p2&p1&p0&c_in),c3=g2|(p2&g1)|(p2&p1&g0)|(p3&p2&p1&p0&c_in),c4=g3|(p3&g2)|(p3&p2&g1)|(p3&p2&p1&g0)|(p3&p2&p1&p0&c_in);assignsum[0]=p0^c_in,sum[1]=p1^c1,sum[2]=p2^c2,sum[3]=p3^c3;assignc_out=c4;endmodule附录2激励块代码如下:moduletop;reg[15:0]a,b;regc_in;wire[15:0]sum;wirec_out;fulladder16adder(.sum(sum),.c_out(c_out),.a(a),.b(b),.c_in(c_in));initialbegina=5;b=4;c_in=0;#5a=2;b=6;c_in=1;#5a=4'b1101;b=4'b0011;c_in=0;#5a=8'b1101_0011;b=8'b0110_0001;c_in=1;#5a=12'b0101_1100_0101;b=12'b1100_0000_0101;c_in=0;#5a=16'b1011_0001_1100_1010;b=16'b1100_0000_0011_0000;c_in=1;endendmodule
本文标题:16位超前进位加法器的verilog实现
链接地址:https://www.777doc.com/doc-3021997 .html