加减法运算器的设计.docx
《加减法运算器的设计.docx》由会员分享,可在线阅读,更多相关《加减法运算器的设计.docx(13页珍藏版)》请在冰豆网上搜索。
加减法运算器的设计
中央民族大学
数字电路实验报告
加减法运算器的设计
一、实验目的
1、掌握加减法运算器的VerilogHDL语言描述方法
2、理解超前进位算法的基本原理
3、掌握基于模块的多位加减运算器的层次化设计方法
4、掌握溢出检测方法和标志线的生成技术
5、熟悉QuartusⅡ10.0和DE2-115使用方法
二、实验设备
PC机+QuartusⅡ10.0+DE2-115
三、实验内容
1、在PC机上安装QuartusⅡ10.0或更高版本并破解。
(注意:
QuartusⅡ10.0版本以上软件不再包含仿真组件,因此需要在安装QuartusⅡ10.0同时选择安装第三方仿真工具,我们可以选择安装免费的Modelsim-Altera,学习如何编写VerilogHDL格式的仿真测试文件Testbench。
)
2、在PC机上安装DE2-115的驱动程序。
3、使用VerilogHDL语言实现一个4位行波(串行)进位的加减法运算器,要求有溢出和进位标志,仿真正确后封装成模块。
4、使用VerilogHDL语言实现一个4位超前(并行)进位加减运算器,要求有溢出和进位标志,仿真正确后封装成模块。
四、实验功能概要
1.四位行波进位的加减法运算器,有溢出和进位标志。
2.四位超前进位的加减法运算器,有溢出和进位标志。
五、设计详细描述
5.1四位行波进位加减法运算器
5.1.1功能描述
带符号位的4位的两数进行加减运算,m进行控制,m=0时进行加法,m=1时进行减法。
S表示输出结果,C表示进位输出,Y标志溢出。
5.1.2封装模块图
5.1.3总电路图
5.1.4组成模块
一位全加器电路图
一位全加器封装图
一位全加器功能仿真波形图
求补电路图
求补电路封装模块图
5.1.5程序设计
modulenum4_wait(
m,
A,
B,
Y,
SS
);
inputwirem;
inputwire[3:
0]A;
inputwire[3:
0]B;
outputwireY;
outputwire[3:
0]SS;
wire[3:
0]AA;
wire[3:
0]BB;
wire[3:
0]S;
wireSYNTHESIZED_WIRE_0;
wireSYNTHESIZED_WIRE_9;
wireSYNTHESIZED_WIRE_2;
wireSYNTHESIZED_WIRE_3;
wireSYNTHESIZED_WIRE_4;
wireSYNTHESIZED_WIRE_5;
wireSYNTHESIZED_WIRE_6;
wireSYNTHESIZED_WIRE_7;
Add_minusb2v_inst(
.A(SYNTHESIZED_WIRE_0),
.B(BB[3]),
.Ci(SYNTHESIZED_WIRE_9),
.C(SYNTHESIZED_WIRE_7),
.S(S[3]));
Add_minusb2v_inst1(
.A(SYNTHESIZED_WIRE_2),
.B(BB[2]),
.Ci(SYNTHESIZED_WIRE_3),
.C(SYNTHESIZED_WIRE_9),
.S(S[2]));
qiubub2v_inst14(
.a(A),
.aa(AA));
qiubub2v_inst15(
.a(B),
.aa(BB));
qiubub2v_inst16(
.a(S),
.aa(SS));
Add_minusb2v_inst2(
.A(SYNTHESIZED_WIRE_4),
.B(BB[1]),
.Ci(SYNTHESIZED_WIRE_5),
.C(SYNTHESIZED_WIRE_3),
.S(S[1]));
Add_minusb2v_inst3(
.A(SYNTHESIZED_WIRE_6),
.B(BB[0]),
.Ci(m),
.C(SYNTHESIZED_WIRE_5),
.S(S[0]));
assignSYNTHESIZED_WIRE_0=AA[3]^m;
assignSYNTHESIZED_WIRE_2=AA[2]^m;
assignSYNTHESIZED_WIRE_4=AA[1]^m;
assignSYNTHESIZED_WIRE_6=AA[0]^m;
assignY=SYNTHESIZED_WIRE_7^SYNTHESIZED_WIRE_9;
endmodule
5.1.6功能仿真波形图
(二进制波形图)
正常情况Y=0
存在溢出时Y=1
5.2四位超前进位加法运算器
5.2.1功能概述
实现两个四位的数的加法,S输出结果,overflow标志是否溢出,carry_out表示进位。
5.2.2封装模块图
5.2.3程序设计
moduleAdd_minus_num4
(
input[3:
0]a,
input[3:
0]b,
inputc0,//carry_in
inputclk,
inputcclr,
inputm;
outputregcarry_out,
outputreg[3:
0]sum,
outputregoverflow
);
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;//g0+c0p0
assignc2=g1|(g0&p1)|(c0&p0&p1);//g1+p1g0+p1p0c0
assignc3=g2|(g1&p2)|(g0&p1&p2)|(c0&p0&p1&p2);//g2+p2g1+p2p1g0+p2p1p0c0
assignc4=g3|(g2&p3)|(g1&p2&p3)|(g0&p1&p2&p3)|(c0&p0&p1&p2&p3);//g3+p3g2+p3p2g1+p3p2p1g0+p3p2p1p0c0
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;//符号位进位输出
overflow=c4^c3;//溢出设计
end
end
endmodule
5.2.4功能仿真波形图
溢出时carry_out=1;
六、实验注意事项
1.使用testbench进行仿真时切记initial块之间是并行的,否则会因理解有误使得结果相差很大。
2.使用Modelsim-Altrea仿真,在设置setting中编译TestBench部分建立新的TestBench时,名称一定要与testbench的文件名相同,即xxx_vlg_tst()格式,否则调用时会报错errorloading或无法出现波形图。
七、实验问题及解决方法
1.使用仿真软件时报错:
Info:
StartNativelinkSimulationprocess
Error:
NativeLinkdidnotdetectanyHDLfilesintheproject
Error:
NativeLinksimulationflowwasNOTsuccessful
NativelinkTCLscriptfailedwitherrorCode:
NONE
NativelinkTCLscriptfailedwitherrorInfo:
NativeLinkdidnotdetectanyHDLfilesintheproject(procedure"run_eda_simulation_tool"line1)
invokedfromwithin
"run_eda_simulation_tooleda_opts_hash"
问题解决:
由于是原理图自动生成的veriloghdl语言,而modelsim只能仿真hdl文件,不能仿真原理图。
可以用file->creat/update->createhdldesignfilefromcurrentfile来生成一个同名的hdl文件。
之后将原来的原理图文件从工程中移去(否则分析综合时会报错),进行分析综合。
这样就可以进行rtl仿真了。
2.使用modelsim-altera仿真时发现窗口能弹出,但没有wave波形图
问题解决:
窗口能弹出表示路径正确,点击波形图下方“transcript”,进入后可看到报错error提示,通常为testbench语法报错,直接进入vt文件进行修改即可。
3.报错errorloading
问题解决:
有两种原因:
第一次因为创建testbench时文件名与testbench里的名称不一样;第二次因为没有从工程目录下移除bdf文件或给它更名,我是利用电路图,生成VerilogHDL文件的,因此bdf文件也放在工程目录下,由于二者名字相同,软件无法判断哪个才是需要仿真的文件,因而报错。
4.使用4位并行进位加法器时,直接用的VerilogHDL语言进行仿真,结果有误。
问题解决:
一直查不出错误,关掉了所有文件,重新生成testbench模板并仿真,结果正确。