用verilog编写16位加法器_乘法器_自动售货机.docx

上传人:wj 文档编号:83414 上传时间:2022-10-02 格式:DOCX 页数:20 大小:111.64KB
下载 相关 举报
用verilog编写16位加法器_乘法器_自动售货机.docx_第1页
第1页 / 共20页
用verilog编写16位加法器_乘法器_自动售货机.docx_第2页
第2页 / 共20页
用verilog编写16位加法器_乘法器_自动售货机.docx_第3页
第3页 / 共20页
用verilog编写16位加法器_乘法器_自动售货机.docx_第4页
第4页 / 共20页
用verilog编写16位加法器_乘法器_自动售货机.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

用verilog编写16位加法器_乘法器_自动售货机.docx

《用verilog编写16位加法器_乘法器_自动售货机.docx》由会员分享,可在线阅读,更多相关《用verilog编写16位加法器_乘法器_自动售货机.docx(20页珍藏版)》请在冰豆网上搜索。

用verilog编写16位加法器_乘法器_自动售货机.docx

-!

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]&

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

当前位置:首页 > 农林牧渔 > 林学

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

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