16位超前进位加法器的verilog实现.docx

上传人:b****1 文档编号:10876091 上传时间:2023-05-28 格式:DOCX 页数:9 大小:34.30KB
下载 相关 举报
16位超前进位加法器的verilog实现.docx_第1页
第1页 / 共9页
16位超前进位加法器的verilog实现.docx_第2页
第2页 / 共9页
16位超前进位加法器的verilog实现.docx_第3页
第3页 / 共9页
16位超前进位加法器的verilog实现.docx_第4页
第4页 / 共9页
16位超前进位加法器的verilog实现.docx_第5页
第5页 / 共9页
16位超前进位加法器的verilog实现.docx_第6页
第6页 / 共9页
16位超前进位加法器的verilog实现.docx_第7页
第7页 / 共9页
16位超前进位加法器的verilog实现.docx_第8页
第8页 / 共9页
16位超前进位加法器的verilog实现.docx_第9页
第9页 / 共9页
亲,该文档总共9页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

16位超前进位加法器的verilog实现.docx

《16位超前进位加法器的verilog实现.docx》由会员分享,可在线阅读,更多相关《16位超前进位加法器的verilog实现.docx(9页珍藏版)》请在冰点文库上搜索。

16位超前进位加法器的verilog实现.docx

16位超前进位加法器的verilog实现

哈尔滨工业大学

2015年6月

一、功能描述

加法运算是最基本的运算,所有其他基本算术运算都是以加法运算为基础。

但因为加法运算存在进位问题,使得某一位计算结果的得出和所有低于它的位相关,因此,为了减少进位传输所耗的时间,提高计算速度,我们可以采用超前进位加法器,它是利用输入信号来预先产生高位进位信号,从而减少进位从低位到高位的传递时间。

超前进位加法器,不同于串行进位加法器,对于每一位的结果是否有进位,不需要等前一位的进位结果计算出来,而是只要输入A,B到来就可以经过一些列的逻辑运算同时计算出各位是否有进位。

理论上讲无论多少位的加法器都可以设计成为超前进位加法器,但是当位数很大的时候,超前进位加法器的逻辑会变得异常复杂,而失去了使用的意义,所以大多数超前进位加法器做到4位,而多于4位的要求,就用多个超前进位加法器级联实现,所以本设计要进行16位的加法运算,我们可以将其分成四组,组内采用超前进位,组间采用串行进位,既提高了运算速度,又不至于采用过多的门数。

二、设计方案

1.设计原理

首先做两个传递函数;进位产生函数Gi和进位传送函数

Gi=AiBi

Pi=Ai^Bi

当Gi=1时会产生进位,而当Pi=1时会使进位输入传到输出。

根据全加器原理,第i位的进位及和的输出可表示为

Ci=Gi+PiCi-1

Si=Pi^Ci-1

由此可得各位的进位输出表达式

C1=G1+P1C0

C2=G2+P2G1+P2P1C0

C3=G3+P3G2+P3P2G1+P3P2P1C0

C4=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.编写测试脚本文件,由于我们不可能将所有可能的输入一一列举,但是我们可以输入一些具有代表性的数据,例如我们可以让每四位数产生级间进位,观察结果是否正确,激励文件关键代码:

initial

begin

a=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=0

sum=0000000000001001,c_out=0

5a=0000000000000010,b=0000000000000110,c_in=1

sum=0000000000001001,c_out=0

10a=0000000000001101,b=0000000000000011,c_in=0

sum=0000000000010000,c_out=0

15a=0000000011010011,b=0000000001100001,c_in=1

sum=0000000100110101,c_out=0

20a=0000010111000101,b=0000110000000101,c_in=0

sum=0001000111001010,c_out=0

25a=1011000111001010,b=1100000000110000,c_in=1

sum=0111000111111011,c_out=1

仿真波形图如下:

从该图中可以更直观地验证结果。

五、结论

通过对16位超前进位加法器进行功能仿真,本设计达到了预定设计的目的,实现了利用verilog语言设计16位超前进位加法器这样一个简单的数字电路,但在验证时,我们只是测试观察了有限的输入,因此可靠性不强。

更加可靠的验证方法有待于进一步的研究。

附录1

16位超前进位加法器的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;

endmodule

modulefulladder4(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));

initial

begin

a=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

endmodule

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2