实验二 加减法运算器的设计实验报告.docx

上传人:b****5 文档编号:6634538 上传时间:2023-01-08 格式:DOCX 页数:11 大小:100.23KB
下载 相关 举报
实验二 加减法运算器的设计实验报告.docx_第1页
第1页 / 共11页
实验二 加减法运算器的设计实验报告.docx_第2页
第2页 / 共11页
实验二 加减法运算器的设计实验报告.docx_第3页
第3页 / 共11页
实验二 加减法运算器的设计实验报告.docx_第4页
第4页 / 共11页
实验二 加减法运算器的设计实验报告.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

实验二 加减法运算器的设计实验报告.docx

《实验二 加减法运算器的设计实验报告.docx》由会员分享,可在线阅读,更多相关《实验二 加减法运算器的设计实验报告.docx(11页珍藏版)》请在冰豆网上搜索。

实验二 加减法运算器的设计实验报告.docx

实验二加减法运算器的设计实验报告

 

加减法运算器的设计实验报告

 

实验二加减法运算器的设计

一、实验目的

1、理解加减法运算器的原理图设计方法

2、掌握加减法运算器的VERILOG语言描述方法

3、理解超前进位算法的基本原理

4、掌握基于模块的多位加减运算器的层次化设计方法

5、掌握溢出检测方法和标志线的生成技术

6、掌握加减运算器的宏模块设计方法

二、实验任务

1、用VERILOG设计完成一个4位行波进位的加减法运算器,要求有溢出和进位标志,并封装成模块。

模块的端口描述如下:

modulelab2_RippleCarry宽度可定制(默认为4位)的行波进位有符号数的加减法器。

#(parameterWIDTH=4)

(inputsigned[WIDTH-1:

0]dataa,

inputsigned[WIDTH-1:

0]datab,

inputadd_sub,//ifthisis1,add;elsesubtract

inputclk,

inputcclr,

inputcarry_in,//1表示有进位或借位

outputoverflow,

outputcarry_out,

outputreg[WIDTH-1:

0]result

2、修改上述运算器的进位算法,设计超前进位无符号加法算法器并封装成模块。

模块的端口描述如下:

modulelab2_LookaheadCarry//4位超前进位无符号加法器

input[3:

0]a,

input[3:

0]b,

inputc0,//carry_in

inputclk,

inputcclr,

outputregcarry_out,

outputreg[3:

0]sum

);

3、在上述超前进位加法运算器的基础上,用基于模块的层次化设计方法,完成一个32位的加法运算器,组内超前进位,组间行波进位。

4、用宏模块的方法实现一个32位加减运算器。

三、实验内容

1、用VERILOG设计完成一个4位行波进位的加减法运算器,要求有溢出和进位标志,并封装成模块。

模块的端口描述如下:

1)将清零信号cclr(sw16)设为1[无效],将控制加减的信号add_sub(sw17)设为1[加法],将输入信号dataa(sw3~sw0)和输入信号datab(sw7~sw4)设为几组不同的值,观察输出信号result(ledr3~ledr0),输出信号overflow(ledg[6]),和输出信号carry_out(ledr[7])观察并记录输出;

2)将清零信号cclr(sw16)设为0[有效],将原来的数据清除,观察并记录输出,可以验证清零是否有效;

3)再将清零信号cclr(sw16)设为1[无效],将控制加减的信号add_sub(sw17)设为0[减法],将输入信号dataa(sw3~sw0)和datab(sw7~sw4)设为几组不同的值,观察输出信号result(ledr3~ledr0),输出信号overflow(ledg[6]),和输出信号carry_out(ledr[7])观察并记录输出,观察并记录输出。

4)在时钟信号处输入一个上升沿(按下key0),观察并记录输出。

2、超前进位无符号加法算法器并封装成模块

1)将清零信号cclr(sw17)设为1[无效],将输入信号a(sw3~sw0)和b(sw7~sw4)和c0(sw15)设为几组不同的值,观察输出信号sum(ledg[3]~ledg[0])和carry_out(ledg7),观察并记录输出;

2)将清零信号cclr(sw17)设为0[有效],观察是否可以清零,验证清零是否有效,观察并记录输出。

3、用基于模块2的层次化设计方法,完成一个32位的加法运算器,组内超前进位,组间行波进位。

1)调用一个32计数器模块并封装,引用两个该计数器,分别给的加数和被加数输入,将低位来的进位c0(sw0)设为0,加法器清零信号cclr(sw[17])设为0[无效],计数器的使能控制端enable(sw15)设为1[有效],计数器的复位信号reset1(sw[0])设为0[无效],观察并记录观察结果;

2)在1)的基础上,将低位来的进位c0(sw0)设为1,加法器清零信号cclr(sw[17])设为0[无效],计数器的使能控制端enable(sw15)设为1[有效],计数器的复位信号reset1(sw[0])设为0[无效],观察并记录观察结果;

3)在1)的基础上,将低位来的进位c0(sw0)设为0,加法器清零信号cclr(sw[17])设为1[有效],计数器的使能控制端enable(sw15)设为1[有效],计数器的复位信号reset1(sw[0])设为0[无效],观察并记录观察结果;

4)在1)的基础上,将低位来的进位c0(sw0)设为0,加法器清零信号cclr(sw[17])设为0[无效],计数器的使能控制端enable(sw15)设为0[无效],计数器的复位信号reset1(sw[0])设为0[无效],观察并记录观察结果;

5)在1)的基础上,将低位来的进位c0(sw0)设为0,加法器清零信号cclr(sw[17])设为1[有效],计数器的使能控制端enable(sw15)设为1[有效],计数器的复位信号reset1(sw[0])设为1[有效],观察并记录观察结果;

4、用宏模块的方法实现一个32位加减运算器

1)引用一个32位的加减法器,并将其封装成模块,仍用任务三中的32位计数器给加数和被加数值;

2)将输入信号cclr(sw16)设为0[无效],加减法控制信号add_sub(sw17)设为1[加法],计数器的使能信号enable(sw15)设为1,计数器的复位信号reset1(sw0)设为0[无效],观察在信号检测中引出的观察对象;

3)将输入信号cclr(sw16)设为0[无效],加减法控制信号add_sub(sw17)设为0[减法],计数器的使能信号enable(sw15)设为1,计数器的复位信号reset1(sw0)设为0[无效],观察在信号检测中引出的观察对象;

4)将输入信号cclr(sw16)设为0[无效],加减法控制信号add_sub(sw17)设为1[加法],计数器的使能信号enable(sw15)设为1[有效],计数器的复位信号reset1(sw0)设为1[有效],观察在信号检测中引出的观察对象;

5)将输入信号cclr(sw16)设为0[无效],加减法控制信号add_sub(sw17)设为1[加法],计数器的使能信号enable(sw15)设为0[无效],计数器的复位信号reset1(sw0)设为1[有效],观察在信号检测中引出的观察对象。

四、实验仪器及设备:

一、电脑(QuartusⅡ10.0)二、DE2_115开发板

五、实验步骤

1根据自己预习情况,编写VERILOG代码

2进行功能仿真

进行分析与综合,排除语法上的错误

建立波形仿真文件,输入激励

生成功能仿真网表

进行功能仿真,观察输出结果

3选择器件

选择DE2_115开发板的CYCLONEIV4CE115

4分配管脚

5下载验证

DE2_115开发板的下载:

使用USB-Blaster进行下载

6按照实验要求设置波段开关,观察LEDR0的显示,验证任务一、二的功能是否正确。

7按照实验原理进行仿真,验证任务三、四的结果,仿真图像如下:

任务三

任务四

六、实验心得

通过本次加减法运算器的设计的实验,我进一步了解了Verilog语言的基本语法,利用Verilog语句实现了用VERILOG设计的带有溢出和进位标志的一个4位行波进位的加减法运算器,超前进位无符号加法算法器,并将其封装为模块,调用实现了32位的加法计数器(组内超前,组间行波行进),以及用宏模块的方法实现一个8位加减运算器。

在验证试验准确性时,学会了如何利用DE2_115开发板进行检测。

另外,在实验过程中,我也了解到了,我们要时刻细心严谨,认真做好每一步,避免出现低级错误。

七、思考题

1、加减运算电路中减法是如何实现的?

回答:

在加减运算电路中,一个数减去另一个数是由一个数加上另一个数的补码(即加上这个数取反再加1)来实现的。

1、超前进位的原理是什么?

回答:

超前进位加法器是利用输入信号同时计算出每一位的进位产生信号和进位传递信号,各级的进位彼此独立产生,只与输入数据和C0有关,将各级间的进位级联传播给去掉了,因此减小了进位产生的延迟,实现了各位的并行运算。

令Gi为进位产生信号,Pi为进位传递信号

则Ci+1=Gi+Pi*Ci

即:

C1=G0+P0·C0

C2=G1+P1·C1=G1+P1·G0+P1·P0▪C0

C3=G2+P2·C2=G2+P2·G1+P2·P1·G0+P2·P1·P0·C0

C4=G3+P3·C3=G3+P3·G2+P3·P2·G1+P3·P2·P1·G0+P3·P2·P1·P0·C0

2、列出三种溢出检测算法?

回答:

(1)根据操作数的符号位来检测

fa和fb分别表示两个操作数的(a,b)的符号位,fs表示结果的符号位,则溢出信号为OVL=

,若OVL=1则表示有溢出,若为0则没有溢出。

(2)根据进位来检测

Ci表示符号位的进位,C表示数值最高位的进位,则溢出信号OVL=Ci⊕C,若OVL=1则表示有溢出,若为0则没有溢出。

(3)双符号位法

fs1和fs2表示结果的双符号位,则则溢出信号OVL=fs1⊕fs2,若OVL=1则表示有溢出,若为0则没有溢出。

3、标志线的生成方法是什么?

回答:

在此我们的设计方案中采取双符号位法,对输入数据进行双符号位表示,标志位取最终结果高两位的异或值,若结果为1,表示存在溢出;否则,表示没有溢出。

4、如何理解模块封装和层次化的设计思想?

回答:

将一个设计分为不同的层次进行设计,然后对每一部分的设计进行封装,最后在总的设计中进行调用。

模块化的设计很好的体现了自上而下的设计思想。

对于较大的工程,可以清洗的明白设计的逻辑,另外封装好的模块可以多次调用,节省了设计时间。

5、宏模块的设计有何优点与缺点?

应在何时使用?

回答:

优点:

直接调用系统的模块,大大节省了设计者的时间,并且减少了设计者出错的可能性,方便快捷。

缺点:

宏模块都是已经定以设计好的,用户不能根据自己的需要进行修改,因此具有一定的局限性。

何时使用:

在设计对模块内部构造要求不高时,可以使用宏模块,以减少设计的工作量。

八、Verilog代码

1、实现用VERILOG设计完成一个4位行波进位的加减法运算器,要求有溢出和进位标志,并封装成模块。

modulelab_2_1

#(parameterWIDTH=4)

inputsigned[WIDTH-1:

0]dataa,

inputsigned[WIDTH-1:

0]datab,

inputadd_sub,//ifthisis1,add;elsesubtract

inputclk,

inputcclr,

inputcarry_in,

outputoverflow,

outputcarry_out,

outputreg[WIDTH-1:

0]result

);

wire[WIDTH:

0]dataa_temp;

wire[WIDTH:

0]datab_temp;

reg[WIDTH:

0]ci_temp;

reg[WIDTH:

0]result_temp;

regcarry_in_temp;

integeri;

integertemp;

assigndataa_temp[WIDTH:

0]={dataa[WIDTH-1],dataa[WIDTH-1:

0]};

assigndatab_temp[WIDTH:

0]=(add_sub==1)?

{datab[WIDTH-1],datab[WIDTH-1:

0]}:

~{datab[WIDTH-1],datab[WIDTH-1:

0]};

assignoverflow=(result_temp[WIDTH]^result_temp[WIDTH-1])?

1'b1:

1'b0;

assigncarry_out=ci_temp[WIDTH];

always@(dataa_tempordatab_temporcarry_in)

begin

carry_in_temp=(add_sub==1)?

{carry_in}:

~{carry_in};

ci_temp[0]=carry_in_temp;

temp=carry_in_temp;

result_temp[0]=dataa_temp[0]^datab_temp[0]^ci_temp[0];

for(i=0;i

begin

ci_temp[i+1]=(dataa_temp[i]^datab_temp[i])&temp|(dataa_temp[i]&datab_temp[i]);//

result_temp[i+1]=dataa_temp[i+1]^datab_temp[i+1]^ci_temp[i+1];

temp=ci_temp[i+1];

end

end

always@(posedgeclkornegedgecclr)

begin

if(!

cclr)

begin

result[WIDTH-1:

0]<=4'b0000;

end

else

begin

result[WIDTH-1:

0]<=result_temp[WIDTH-1:

0];

end

end

endmodule

2、实现修改上述运算器的进位算法,设计超前进位无符号加法算法器并封装成模块

modulelab_2_2

input[3:

0]a,

input[3:

0]b,

inputc0,

inputclk,

inputcclr,

outputregcarry_out,

outputreg[3:

0]sum

);

wirec1,c2,c3,c4;

wirep0,p1,p2,p3;

wireg0,g1,g2,g3;

wiresum0,sum1,sum2,sum3;

assigng0=a[0]&b[0];

assigng1=a[1]&b[1];

assigng2=a[2]&b[2];

assigng3=a[3]&b[3];

assignp0=a[0]^b[0];

assignp1=a[1]^b[1];

assignp2=a[2]^b[2];

assignp3=a[3]^b[3];

assignc1=g0|c0&p0;

assignc2=g1|(g0&p1)|(c0&p0&p1);

assignc3=g2|(g1&p2)|(g0&p1&p2)|(c0&p0&p1&p2);

assignc4=g3|(g2&p3)|(g1&p2&p3)|(g0&p1&p2&p3)|(c0&p0&p1&p2&p3);

assignsum0=p0^c0;

assignsum1=p1^c1;

assignsum2=p2^c2;

assignsum3=p3^c3;

always@(posedgeclkornegedgecclr)

begin

if(!

cclr)

begin

sum<=0;

carry_out<=0;

end

else

begin

sum<={sum3,sum2,sum1,sum0};

carry_out<=c4;

end

end

endmodule

3、实现计数器的Verilog代码

modulecounter

#(parameterWIDTH=64)

inputclk,reset,

outputreg[WIDTH-1:

0]count

);

//Resetifneeded,orincrementifcountingisenabled

always@(posedgeclkorposedgereset)

begin

if(reset)

count<=0;

else

count<=count+1;

end

endmodule

4、实现调用宏模块以及实例化的Verilog代码

modulelab2_4

(inputCCLR,CLK,A_B,EN,

input[31:

0]A,B,

output[31:

0]RESULT,

outputOVERFLOW

);

rrrr_inst(

.aclr(CCLR),

.add_sub(A_B),

.clk_en(EN),

.clock(CLK),

.dataa(A),

.datab(B),

.overflow(OVERFLOW),

.result(RESULT)

);

endmodule

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

当前位置:首页 > 医药卫生 > 基础医学

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

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