先行进位加法器.docx

上传人:b****5 文档编号:5324275 上传时间:2022-12-15 格式:DOCX 页数:9 大小:39.16KB
下载 相关 举报
先行进位加法器.docx_第1页
第1页 / 共9页
先行进位加法器.docx_第2页
第2页 / 共9页
先行进位加法器.docx_第3页
第3页 / 共9页
先行进位加法器.docx_第4页
第4页 / 共9页
先行进位加法器.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

先行进位加法器.docx

《先行进位加法器.docx》由会员分享,可在线阅读,更多相关《先行进位加法器.docx(9页珍藏版)》请在冰豆网上搜索。

先行进位加法器.docx

先行进位加法器

实验四32位先行进位加法器

一、功能概述

串行进位加法器延时很大,每级的输出结果都要等上一级的进位到来才可以求和算出结果,这次实验对普通全加器进行改良,改良为先行进位加法器。

先行进位加法器,各级的进位彼此是独立产生,只与输入数据A,B和C_in有关,将各级间的进位级联传播给去掉了,这样就可以减小进位产生的延时。

每个等式与只有三级延迟的电路对应,第一级延迟对应进位产生信号和进位传递信号,后两级延迟对应上面的积之和。

通过这种进位方式实现的加法器称为超前进位加法器。

因为各个进位是并行产生的,所以是一种并行进位加法器。

二、实验原理

1、设二进制加法器第i位为Ai,Bi,输出为Si,进位输入为Ci,进位输出为Ci+1,则有:

Si=Ai⊕Bi⊕Ci(1-1)Ci+1=Ai*Bi+Ai*Ci+Bi*Ci=Ai*Bi+(Ai+Bi)*Ci(1-2)令Gi=Ai*Bi,Pi=Ai+Bi,则Ci+1=Gi+Pi*Ci当Ai和Bi都为1时,Gi=1,产生进位Ci+1=1

当Ai和Bi有一个为1时,Pi=1,传递进位Ci+1=Ci

因此Gi定义为进位产生信号,Pi定义为进位传递信号。

Gi的优先级比Pi高,也就是说:

当Gi=1时(当然此时也有Pi=1),无条件产生进位,而不管Ci是多少;当Gi=0而Pi=1时,进位输出为Ci,跟Ci之前的逻辑有关。

下面推导4位超前进位加法器。

设4位加数和被加数为A和B,进位输入为Cin,进位输出为Cout,对于第i位的进位产生Gi=Ai·Bi,进位传递Pi=Ai+Bi,i=0,1,2,3。

于是这各级进位输出,递归的展开Ci,有:

C0=Cin

C1=G0+P0·C0

C2=G1+P1·C1=G1+P1·G0+P1·P0?

C0

C3=G2

+

P2·C2=

G2

+

P2·

G1+

P2·P

1·G0+

P2·P1·

P0

·C0

C4=G3

+

P3·C3=

G3

+

P3·

G2+

P3·P

2·G1+

P3·P2·

P1

·G0+P3·

P2·

P1·

P0·

C0

1-3)

Cout=C4

由此可以看出,各级的进位彼此独立产生,只与输入数据Ai、Bi和Cin有关。

2、接口说明

表1:

32位超前进位加法器接口信号说明表

序号

接口信号名称

方向

说明

备注

1

A[31:

0]

I

输入数据

2

B[31:

0]

I

输入数据

3

S[31:

0]

O

加法结果

4

count

O

最高位进位

3、结构框图

A31~28B31~28A27~24B27~24A23~20B23~20A19~16B19~16

A15~12B15~12A11~8B11~8A7~4B7~4A3~0B3~0

三、实验方案方案一:

分为两个模块:

1个4位add_4和1个add_32,其中add_32调用4个add_4.

首先设计4位超前进位加法器:

框图如下:

设计好四位的之后,开始调用四位的实现32位的

pg

方案二:

分为五个模块:

(1)计算传播值和产生值模块:

模块

(2)超前进位模块:

cla模块

(3)加法求和模块:

sum模块

(4)求和并按输出a,b,c_in分组:

bit_slice模块

(5)32位超前进位加法器总模块:

cla_32总框图:

四、验证方案:

对32位的两个输入赋值:

当a=32'b1000_0001_0111_1011_1101_1001_1101_1000;

b=32'b0111_1000_

0001_

1000_

1100_

0111_

0101_

0001;

c_in=1'b0;

结果:

s=32'b1111

_1001

_1001

_0100

_1010

_0001

_0010_

1001;

当a=32'b1000_0001_

0111_

1011_

1101_

1001_

1101_

1000;

b=32'b0111_1000_

0001_

1000_

1100_

0111_

0101_

0001;

c_in=1'b1;

结果:

s=32'b1111

_1001

_1001

_0100

_1010

_0001

_0010_

1010;

来对波形进行观察,看波形是否正确。

五、实验代码:

方案一:

(1)add_32模块顶层模块:

2)4位add_4模块方案二:

(1)cla_32顶层模块:

modulecla_32(a,b,c_in,s,count);input[31:

0]a,b;

inputc_in;

output[31:

0]s;

outputcount;

wire[7:

0]gg,gp,gc;

wire[3:

0]ggg,ggp,ggc;

wiregggg,gggp;

bit_slice

b1(.a(a[3:

0]),.b(b[3:

0]),.c_in(gc[0]),.s(s[3:

0]),.gp(gp[0]),.gg(gg[0]));bit_slice

b2(.a(a[7:

4]),.b(b[7:

4]),.c_in(gc[1]),.s(s[7:

4]),.gp(gp[1]),.gg(gg[1]));bit_slice

b3(.a(a[11:

8]),.b(b[11:

8]),.c_in(gc[2]),.s(s[11:

8]),.gp(gp[2]),.gg(gg[2]));

bit_slice

b4(.a(a[15:

12]),.b(b[15:

12]),.c_in(gc[3]),.s(s[15:

12]),.gp(gp[3]),.gg(gg[3]));

bit_slice

b5(.a(a[19:

16]),.b(b[19:

16]),.c_in(gc[4]),.s(s[19:

16]),.gp(gp[4]),.gg(gg[4]));

bit_slice

b6(.a(a[23:

20]),.b(b[23:

20]),.c_in(gc[5]),.s(s[23:

20]),.gp(gp[5]),.gg(g

g[5]));

bit_slice

b7(.a(a[27:

24]),.b(b[27:

24]),.c_in(gc[6]),.s(s[27:

24]),.gp(gp[6]),.gg(gg[6]));

bit_slice

b8(.a(a[31:

28]),.b(b[31:

28]),.c_in(gc[7]),.s(s[31:

28]),.gp(gp[7]),.gg(gg[7]));

cla

c0(.p(gp[3:

0]),.g(gg[3:

0]),.c_in(ggc[0]),.c(gc[3:

0]),.gp(ggp[0]),.gg(ggg[0]));

cla

c1(.p(gp[7:

4]),.g(gg[7:

4]),.c_in(ggc[1]),.c(gc[7:

4]),.gp(ggp[1]),.gg(ggg[

1]));

assignggp[3:

2]=2'b11;

assignggg[3:

2]=2'b00;

clac2(.p(ggp),.g(ggg),.c_in(c_in),.c(ggc),.gp(gggp),.gg(gggg));

assigncount=gggg|(gggp&c_in);

endmodule

2)pg模块:

modulepg(a,b,p,g);

input[3:

0]a,b;

output[3:

0]p,g;

assignp=a^b;

assigng=a&b;

endmodule

(3)cla模块:

modulecla(p,g,c_in,c,gp,gg);input[3:

0]p,g;

inputc_in;

output[3:

0]c;

outputgp,gg;

function[99:

0]do_cla;

input[3:

0]p,g;

inputc_in;

begin:

label

integeri;

reggp,gg;

reg[3:

0]c;

gp=p[0];

gg=g[0];

c[0]=c_in;

for(i=1;i<4;i=i+1)

begin

gp=gp&p[i];gg=(gg&p[i])|g[i];c[i]=(c[i-1]&p[i-1])|g[i-1];end

do_cla={c,gp,gg};

end

endfunction

assign{c,gp,gg}=do_cla(p,g,c_in);endmodule

(4)sum模块:

modulesum(a,b,c,s);

input[3:

0]a,b,c;output[3:

0]s;wire[3:

0]t=a^b;

assigns=t^c;

endmodule

5)bit_slice模块:

modulebit_slice(a,b,c_in,s,gp,gg);

input[3:

0]a,b;

inputc_in;

output[3:

0]s;

outputgp,gg;

wire[3:

0]p,g,c;

pgi1(a,b,p,g);

clai2(p,g,c_in,c,gp,gg);

sumi3(a,b,c,s);

endmodule

(6)激励代码:

modulecla32_tb;

//Inputs

reg[31:

0]a;

reg[31:

0]b;

regc_in;

//Outputs

wire[31:

0]s;

wirecount;

//InstantiatetheUnitUnderTest(UUT)cla_32uut(

.a(a),

.b(b),

.c_in(c_in),

.s(s),

.count(count)

);

initialbegin

//InitializeInputs

a=0;

b=0;

c_in=0;

//Wait100nsforglobalresettofinish

#10

a=32'b1000_

0001

0111

1011_

1101_

1001

1101

_1000;

b=32'b0111_

1000

0001

1000_

1100_

0111

0101

_0001;

c_in=1'b0;

#10

a=32'b1000_

0001

0111

1011_

1101_

1001

1101

_1000;

b=32'b0111_

1000

0001

1000_

1100_

0111

0101

_0001;

c_in=1'b1;

//Addstimulushereendendmodule

六、波形图说明1、仿真波形

2、结果说明

对于三个输入:

a=32'b1000_0001_0111_1011_1101_1001_1101_1000;

b=32'b0111_1000_0001_1000_1100_0111_0101_0001;c_in=1'b0;

结果与实验方案的相同,结果仿真正确.

七、实验总结

对于这次实验,自己在老师布置完,努力做了几个下午,不断调试才得到正确结果波形,是非常有收获的。

同时我也采用了两种方案来设计,真正的对先行进位加法器有了全新的认识,对于它的内部工作原理深有体会,对自己以后的电路设计奠定了基础,自己以后会更加努力。

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

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1