用verilog编写16位加法器乘法器自动售货机 (1).doc
- 文档编号:83387
- 上传时间:2022-10-02
- 格式:DOC
- 页数:27
- 大小:97.72KB
用verilog编写16位加法器乘法器自动售货机 (1).doc
《用verilog编写16位加法器乘法器自动售货机 (1).doc》由会员分享,可在线阅读,更多相关《用verilog编写16位加法器乘法器自动售货机 (1).doc(27页珍藏版)》请在冰豆网上搜索。
-!
Verilog课程实验报告
实验1十六位超前进位加法器
1.1系统设计要求
用超前进位加法器实现一个有符号位的16位加法器,并且考虑溢出的情况
2.1详细设计
根据超前进位加法器的原理Co=G|(P&Ci)S=P^Ci设计出4位加法器的子模块,然后通过4个4位加法器的相连来得到十六位的加法器。
原理如下图所示。
溢出用flag=0表示。
3.1程序
//-------------16位超前进位加法器-----------------
modulecla16(a,b,s,flag);//含有a,b,输出s,进位flag的模块
input[15:
0]a,b;//输入a,b
output[16:
0]s;//输出s
outputregflag;//进位
wirepp4,pp3,pp2,pp1;
wiregg4,gg3,gg2,gg1;
wire[15:
0]Cp;
wire[15:
0]p,g;
pgi0(a[15:
0],b[15:
0],p[15:
0],g[15:
0]);
addi1(p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],pp1,gg1);
addi2(p[7],p[6],p[5],p[4],g[7],g[6],g[5],g[4],pp2,gg2);
addi3(p[11],p[10],p[9],p[8],g[11],g[10],g[9],g[8],pp3,gg3);
addi4(p[15],p[14],p[13],p[12],g[15],g[14],g[13],g[12],pp4,gg4);
addi5(pp4,pp3,pp2,pp1,gg4,gg3,gg2,gg1,pp5,gg5);
//调用四位加法器模块
add4l0(p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],1'b0,Cp[3],Cp[2],Cp[1],Cp[0]);
add4l1(p[7],p[6],p[5],p[4],g[7],g[6],g[5],g[4],Cp[3],Cp[7],Cp[6],Cp[5],Cp[4]);
add4l2(p[11],p[10],p[9],p[8],g[11],g[10],g[9],g[8],Cp[7],Cp[11],Cp[10],Cp[9],Cp[8]);
add4l3(p[15],p[14],p[13],p[12],g[15],g[14],g[13],g[12],Cp[11],Cp[15],Cp[14],Cp[13],Cp[12]);
assigns[0]=p[0]^1'b0;//保留位
assigns[1]=p[1]^Cp[0];
assigns[2]=p[2]^Cp[1];
assigns[3]=p[3]^Cp[2];
assigns[4]=p[4]^Cp[3];
assigns[5]=p[5]^Cp[4];
assigns[6]=p[6]^Cp[5];
assigns[7]=p[7]^Cp[6];
assigns[8]=p[8]^Cp[7];
assigns[9]=p[9]^Cp[8];
assigns[10]=p[10]^Cp[9];
assigns[11]=p[11]^Cp[10];
assigns[12]=p[12]^Cp[11];
assigns[13]=p[13]^Cp[12];
assigns[14]=p[14]^Cp[13];
assigns[15]=p[15]^Cp[14];
assigns[16]=pp5|gg5;
//溢出判断模块
always@(a,b,s)
begin
if((a[15]==1&&b[15]==1&&s[15]==0)||(a[15]==0&&b[15]==0&&s[15]==1))
flag=1'b1;
else
flag=1'b0;
end
endmodule
//4位加法器模块
moduleadd4(p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],Co,Cp[3],Cp[2],Cp[1],Cp[0]);
input[3:
0]p,g;
inputCo;
output[3:
0]Cp;
assignCp[0]=g[0]|p[0]&Co;
assignCp[1]=g[1]|p[1]&Cp[0];
assignCp[2]=g[2]|p[2]&Cp[1];
assignCp[3]=g[3]|p[3]&Cp[2];
endmodule
//模块间的进位
moduleadd(p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],pp,gg);
input[3:
0]p,g;
outputpp,gg;
assignpp=p[3]&p[2]&p[1]&p[0];
assigngg=g[3]|(p[3]&(g[2]|p[2]&(g[1]|p[1]&g[0])));
endmodule
//进位信号的产生
modulepg(a,b,p,g);
input[15:
0]a,b;
output[15:
0]p,g;
assignp=a^b;
assigng=a&b;
endmodule
4.1测试程序
通过产生一个随机输入a和b,来验证c=a+b。
//16位加法器的测试文件
`timescale1ns/1ns
`include"./sixteenadder.v"
modulesixteenaddertest;
wire[15:
0]s;
reg[15:
0]a,b;
wireflag;
parametertimes=5;
//随机产生一个数,总共产生6次
initial
begin
a={$random}%65536;
b={$random}%65536;
repeat(times)
begin
#100
a={$random}%65536;
b={$random}%65536;
end
#100$stop;
end
cla16cal161(a,b,s,flag);
endmodule
5.1仿真波形
用mudelsim10.0仿真得到的波形如下所示:
如图a=13604,b=24193s=-27739.s为负数,产生溢出,溢出标位sto=1.当a=-10743,,b=22115.s=11372没有溢出,sto=0.通过这个实验验证了s=a+b,实现了带符号位的加法器。
实验二十六位加减法器
1.1系统设计要求
将加法器和减法器结合到一起,实现带符号位的16位加减法运算,并考虑溢出。
2.1详细设计
在16位加法器的基础上,加上一条判断语句,如果出现减的操作,被减数取反加一,这样就实现了减的运算,用add_sub来表示加减运算符,当add_sub=0时候实现的是减运算,add_sub=1的时候实现的是加运算。
3.1程序
//--------------------16位加减法器------------------------
modulecla16(a,b,s);//定义模块包括a,b,s
input[15:
0]a,b;//输入a,b
output[16:
0]s;//输出s
wirepp4,pp3,pp2,pp1;
wiregg4,gg3,gg2,gg1;
wire[15:
0]Cp;
wire[15:
0]p,g;
pgi0(a[15:
0],b[15:
0],p[15:
0],g[15:
0]);
addi1(p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],pp1,gg1);
addi2(p[7],p[6],p[5],p[4],g[7],g[6],g[5],g[4],pp2,gg2);
addi3(p[11],p[10],p[9],p[8],g[11],g[10],g[9],g[8],pp3,gg3);
addi4(p[15],p[14],p[13],p[12],g[15],g[14],g[13],g[12],pp4,gg4);
addi5(pp4,pp3,pp2,pp1,gg4,gg3,gg2,gg1,pp5,gg5);
add4l0(p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],1'b0,Cp[3],Cp[2],Cp[1],Cp[0]);
add4l1(p[7],p[6],p[5],p[4],g[7],g[6],g[5],g[4],Cp[3],Cp[7],Cp[6],Cp[5],Cp[4]);
add4l2(p[11],p[10],p[9],p[8],g[11],g[10],g[9],g[8],Cp[7],Cp[11],Cp[10],Cp[9],Cp[8]);
add4l3(p[15],p[14],p[13],p[12],g[15],g[14],g[13],g[12],Cp[11],Cp[15],Cp[14],Cp[13],Cp[12]);
assigns[0]=p[0]^1'b0;
assigns[1]=p[1]^Cp[0];
assigns[2]=p[2]^Cp[1];
assigns[3]=p[3]^Cp[2];
assigns[4]=p[4]^Cp[3];
assigns[5]=p[5]^Cp[4];
assigns[6]=p[6]^Cp[5];
assigns[7]=p[7]^Cp[6];
assigns[8]=p[8]^Cp[7];
assigns[9]=p[9]^Cp[8];
assigns[10]=p[10]^Cp[9];
assigns[11]=p[11]^Cp[10];
assigns[12]=p[12]^Cp[11];
assigns[13]=p[13]^Cp[12];
assigns[14]=p[14]^Cp[13];
assigns[15]=p[15]^Cp[14];
assigns[16]=pp5|gg5;
endmodule
moduleadd4(p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],Co,Cp[3],Cp[2],Cp[1],Cp[0]);
input[3:
0]p,g;
inputCo;
output[3:
0]Cp;
assignCp[0]=g[0]|p[0]&Co;
assignCp[1]=g[1]|p[1]&Cp[0];
assignCp[2]=g[2]|p[2]&Cp[1];
assignCp[3]=g[3]|p[3]&Cp[2];
endmodule
moduleadd(p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],pp,gg);
input[3:
0]p,g;
outputpp,gg;
assignpp=p[3]&p[2]&
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 用verilog编写16位加法器乘法器自动售货机 1 verilog 编写 16 加法器 乘法器 自动 售货