用verilog编写16位加法器乘法器自动售货机文档格式.docx

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

用verilog编写16位加法器乘法器自动售货机文档格式.docx

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

用verilog编写16位加法器乘法器自动售货机文档格式.docx

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;

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

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:

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

//模块间的进位

moduleadd(p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],pp,gg);

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])));

//进位信号的产生

modulepg(a,b,p,g);

output[15:

assignp=a^b;

assigng=a&

b;

endmodule

4.1测试程序

通过产生一个随机输入a和b,来验证c=a+b。

//16位加法器的测试文件

`timescale1ns/1ns

`include"

./sixteenadder.v"

modulesixteenaddertest;

wire[15:

reg[15:

0]a,b;

wireflag;

parametertimes=5;

//随机产生一个数,总共产生6次

initial

begin

a={$random}%65536;

b={$random}%65536;

repeat(times)

#100

#100$stop;

cla16cal161(a,b,s,flag);

5.1仿真波形

用mudelsim10.0仿真得到的波形如下所示:

如图a=13604,b=24193s=-27739.s为负数,产生溢出,溢出标位sto=1.当a=-10743,,b=22115.s=11372没有溢出,sto=0.通过这个实验验证了s=a+b,实现了带符号位的加法器。

实验二十六位加减法器

将加法器和减法器结合到一起,实现带符号位的16位加减法运算,并考虑溢出。

在16位加法器的基础上,加上一条判断语句,如果出现减的操作,被减数取反加一,这样就实现了减的运算,用add_sub来表示加减运算符,当add_sub=0时候实现的是减运算,add_sub=1的时候实现的是加运算。

//--------------------16位加减法器------------------------

modulecla16(a,b,s);

//定义模块包括a,b,s

//输出s

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

当前位置:首页 > 法律文书 > 调解书

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

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