欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

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

    • 资源ID:19053260       资源大小:116.20KB        全文页数:26页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    1、用verilog编写16位加法器 乘法器 自动售货机Verilog课程实验报告实验1十六位超前进位加法器 用超前进位加法器实现一个有符号位的16位加法器,并且考虑溢出的情况 根据超前进位加法器的原理Co = G | ( P & Ci )S = P Ci设计出4位加法器的子模块,然后通过4个4位加法器的相连来得到十六位的加法器。原理如如下图所示。溢出用flag=0表示。/-16位超前进位加法器-module cla16(a,b,s,flag); /含有a,b,输出s,进位flag的模块input 15:0 a,b;/输入a,boutput 16:0 s; /输出 soutput reg flag

    2、; /进位wire pp4,pp3,pp2,pp1;wire gg4,gg3,gg2,gg1;wire 15:0 Cp;wire 15:0 p,g;pg i0 (a15:0,b15:0,p15:0,g15:0); add i1 (p3,p2,p1,p0,g3,g2,g1,g0,pp1,gg1);add i2 (p7,p6,p5,p4,g7,g6,g5,g4,pp2,gg2);add i3 (p11,p10,p9,p8,g11,g10,g9,g8,pp3,gg3);add i4 (p15,p14,p13,p12,g15,g14,g13,g12,pp4,gg4);add i5 (pp4,pp3,p

    3、p2,pp1,gg4,gg3,gg2,gg1,pp5,gg5);/调用四位加法器模块add4 l0 (p3,p2,p1,p0,g3,g2,g1,g0,1b0,Cp3,Cp2,Cp1,Cp0);add4 l1 (p7,p6,p5,p4,g7,g6,g5,g4,Cp3,Cp7,Cp6,Cp5,Cp4);add4 l2 (p11,p10,p9,p8,g11,g10,g9,g8,Cp7,Cp11,Cp10,Cp9,Cp8);add4 l3 (p15,p14,p13,p12,g15,g14,g13,g12,Cp11,Cp15,Cp14,Cp13,Cp12);assign s0=p01b0; /保存位as

    4、sign s1=p1Cp0;assign s2=p2Cp1;assign s3=p3Cp2;assign s4=p4Cp3;assign s5=p5Cp4;assign s6=p6Cp5;assign s7=p7Cp6;assign s8=p8Cp7;assign s9=p9Cp8;assign s10=p10Cp9;assign s11=p11Cp10;assign s12=p12Cp11;assign s13=p13Cp12;assign s14=p14Cp13;assign s15=p15Cp14;assign s16=pp5|gg5;/溢出判断模块 always(a,b,s) begi

    5、nif (a15=1&b15=1&s15=0)|(a15=0&b15=0&s15=1) flag=1b1; else flag=1b0; endendmodule/4位加法器模块module add4(p3,p2,p1,p0,g3,g2,g1,g0,Co,Cp3,Cp2,Cp1,Cp0); input 3:0p,g;input Co;output 3:0 Cp;assign Cp0=g0|p0&Co;assign Cp1=g1|p1&Cp0;assign Cp2=g2|p2&Cp1;assign Cp3=g3|p3&Cp2;endmodule/模块间的进位module add(p3,p2,p1

    6、,p0,g3,g2,g1,g0,pp,gg); input 3:0p,g;output pp,gg;assign pp=p3&p2&p1&p0;assign gg=g3|(p3&(g2|p2&(g1|p1&g0);endmodule/进位信号的产生module pg(a,b,p,g); input 15:0 a,b;output 15:0 p,g;assign p=ab;assign g=a&b; endmodule通过产生一个随机输入a和b,来验证c=a+b。/16位加法器的测试文件timescale 1ns/1nsinclude./sixteenadder.vmodule sixteena

    7、ddertest; wire 15:0 s; reg 15:0a,b; wire flag; parameter times=5; /随机产生一个数 ,总共产生6次 initial begin a=$random%65536; b=$random%65536; repeat(times) begin #100 a=$random%65536; b=$random%65536; end #100 $stop; end cla16 cal161(a,b,s,flag); endmodule用mudelsim10.0仿真得到的波形如下所示: 如图a=13604,b=24193 s=-27739.s为

    8、负数,产生溢出,溢出标位sto=1.当a=-10743,b=22115.s=11372没有溢出,sto=0.通过这个实验验证了s=a+b,实现了带符号位的加法器。实验二 十六位加减法器 将加法器和减法器结合到一起,实现带符号位的16位加减法运算,并考虑溢出。 在16位加法器的根底上,加上一条判断语句,如果出现减的操作,被减数取反加一,这样就实现了减的运算,用add_sub来表示加减运算符,当add_sub=0时候实现的是减运算,add_sub=1的时候实现的是加运算。/-16位加减法器-module cla16(a,b,s); /定义模块包括a,b,sinput 15:0 a,b;/输入a,b

    9、output 16:0 s; /输出swire pp4,pp3,pp2,pp1;wire gg4,gg3,gg2,gg1;wire 15:0 Cp;wire 15:0 p,g;pg i0 (a15:0,b15:0,p15:0,g15:0);add i1 (p3,p2,p1,p0,g3,g2,g1,g0,pp1,gg1);add i2 (p7,p6,p5,p4,g7,g6,g5,g4,pp2,gg2);add i3 (p11,p10,p9,p8,g11,g10,g9,g8,pp3,gg3);add i4 (p15,p14,p13,p12,g15,g14,g13,g12,pp4,gg4);add

    10、i5 (pp4,pp3,pp2,pp1,gg4,gg3,gg2,gg1,pp5,gg5);add4 l0 (p3,p2,p1,p0,g3,g2,g1,g0,1b0,Cp3,Cp2,Cp1,Cp0);add4 l1 (p7,p6,p5,p4,g7,g6,g5,g4,Cp3,Cp7,Cp6,Cp5,Cp4);add4 l2 (p11,p10,p9,p8,g11,g10,g9,g8,Cp7,Cp11,Cp10,Cp9,Cp8);add4 l3 (p15,p14,p13,p12,g15,g14,g13,g12,Cp11,Cp15,Cp14,Cp13,Cp12);assign s0=p01b0;assi

    11、gn s1=p1Cp0;assign s2=p2Cp1;assign s3=p3Cp2;assign s4=p4Cp3;assign s5=p5Cp4;assign s6=p6Cp5;assign s7=p7Cp6;assign s8=p8Cp7;assign s9=p9Cp8;assign s10=p10Cp9;assign s11=p11Cp10;assign s12=p12Cp11;assign s13=p13Cp12;assign s14=p14Cp13;assign s15=p15Cp14;assign s16=pp5|gg5;endmodulemodule add4(p3,p2,p

    12、1,p0,g3,g2,g1,g0,Co,Cp3,Cp2,Cp1,Cp0); input 3:0p,g;input Co;output 3:0 Cp;assign Cp0=g0|p0&Co;assign Cp1=g1|p1&Cp0;assign Cp2=g2|p2&Cp1;assign Cp3=g3|p3&Cp2;endmodulemodule add(p3,p2,p1,p0,g3,g2,g1,g0,pp,gg); input 3:0p,g;output pp,gg;assign pp=p3&p2&p1&p0;assign gg=g3|(p3&(g2|p2&(g1|p1&g0);endmodul

    13、emodule pg(a,b,p,g); input 15:0 a,b;output 15:0 p,g;assign p=ab;assign g=a&b; endmodule/定义加减法器的模块module addsub(a,b,s,flag,add_sub); input15:0a,b; input add_sub; output 15:0 s; output reg flag; wire 15:0b1; cla16 cla1(a,b1,s); /* always(posedge clk) begin if(add_sub) begin b1=b; b1=b1+1; end else b1=

    14、b; end*/assign b1= (add_sub)? b:(b+1b1);/判断是否为减操作,为减操作的话是取反加一的运算always(a,b,s) /判断是否溢出beginif (a15=1&b15=1&add_sub=1&s15=0)|(a15=0&b15=0&add_sub=1&s15=1) flag=1b1; else flag=1b0; end endmoduletimescale 1ns/1nsinclude./adder_sub.vmodule adder_sub_test; wire 15:0 s; reg 15:0a,b; reg add_sub; wire flag;

    15、 initial /初始化,输入测试的数据 begin a=-16h7851; b=16ha432; add_sub=1; #100 begin a=-16h1233; b=16h3211; add_sub=0; end #100 begin a=16h0232; b=16ha161; add_sub=1; end #100 begin a=16h5632; b=16h04a1; add_sub=0; end #100 begin a=-16h1234; b=16h4525; add_sub=0; end #1000 $stop; end addsub addsub1(a,b,s,flag,a

    16、dd_sub); endmodule用modelsim10.0仿真,得到的结果如下所示: 当a=-30801 b=-23502,add-sub=1,加操作,s溢出,产生溢出信号flag=1.当a=-4659 b=12817 add_sub=0,减操作,输出s=-17476,无溢出,flag=0.当a=562 b=-24223 add_sub=1,加操作,输出s=-23661,无溢出,flag=0.通过以上的结果分析,此程序实现了带符号位的加减法的功能。实验三 十六位的乘法器11系统设计要求 实现16*16位的无符号位的乘法器乘法器的硬件电路原理如下定义16个存放器,用来存储一行乘操作产生的数据

    17、,最后的结果为所有16行相加。/-16位乘法器-module mux(clk,rst_n,en,a,b_in,rdy,mux_out);input clk;/定义时钟input rst_n;/复位信号input en;/使能input15:0 a,b_in;/输入a,b-inoutput rdy;/输出rdy,当结果正确时候为高电平output31:0 mux_out;/乘法输出值reg rdy;/定义中间的17个存放器reg15:0 mux_reg0 ;reg16:0 mux_reg1 ;reg17:0 mux_reg2 ;reg18:0 mux_reg3 ;reg19:0 mux_reg4

    18、 ;reg20:0 mux_reg5 ;reg21:0 mux_reg6 ;reg22:0 mux_reg7 ;reg23:0 mux_reg8 ;reg24:0 mux_reg9 ;reg25:0 mux_reg10 ;reg26:0 mux_reg11 ;reg27:0 mux_reg12 ;reg28:0 mux_reg13 ;reg29:0 mux_reg14 ;reg30:0 mux_reg15 ;reg31:0 mux_reg16 ;always(rst_n or a or b_in or en) /监视4个变量begin if(!rst_n) /复位 begin rdy = 1b

    19、0; mux_reg0 = 16d0; mux_reg1 = 17d0; mux_reg2 = 18d0; mux_reg3 = 19d0; mux_reg4 = 20d0; mux_reg5 = 21d0; mux_reg6 = 22d0; mux_reg7 = 23d0; mux_reg8 = 24d0; mux_reg9 = 25d0; mux_reg10 = 26d0; mux_reg11 = 27d0; mux_reg12 = 28d0; mux_reg13 = 29d0; mux_reg14 = 30d0; mux_reg15 = 31d0; mux_reg16 = 32d0; e

    20、nd / else if(en&rst_n) /开始乘法的运算操作 begin if(a0) mux_reg0 = b_in; else mux_reg0 = 16d0; if(a1) mux_reg1 = b_in,mux_reg160; else mux_reg1 = 17d0; if(a2) mux_reg2 = b_in,mux_reg161:0; else mux_reg2 = 18d0; if(a3) mux_reg3 = b_in,mux_reg162:0; else mux_reg3 = 19d0; if(a4) mux_reg4 = b_in,mux_reg163:0; el

    21、se mux_reg4 = 20d0; if(a5) mux_reg5 = b_in,mux_reg164:0; else mux_reg5 = 21d0; if(a6) mux_reg6 = b_in,mux_reg165:0; else mux_reg6 = 22d0; if(a7) mux_reg7 = b_in,mux_reg166:0; else mux_reg7 = 23d0; if(a8) mux_reg8 = b_in,mux_reg167:0; else mux_reg8 = 24d0; if(a9) mux_reg9 = b_in,mux_reg168:0; else mu

    22、x_reg9 = 25d0; if(a10) mux_reg10 = b_in,mux_reg169:0; else mux_reg10 = 26d0; if(a11) mux_reg11 = b_in,mux_reg1610:0; else mux_reg11 = 27d0; if(a12) mux_reg12 = b_in,mux_reg1611:0; else mux_reg12 = 28d0; if(a13) mux_reg13 = b_in,mux_reg1612:0; else mux_reg13 = 29d0; if(a14) mux_reg14 = b_in,mux_reg16

    23、13:0; else mux_reg14 = 30d0; if(a15) mux_reg15 = b_in,mux_reg1614:0; else mux_reg15 = 31d0; rdy=1; end else begin rdy = 1b0 ; endend/输出结果为所有存放器的和assign mux_out = mux_reg0+mux_reg1+mux_reg2+mux_reg3+mux_reg4+mux_reg5+mux_reg6+mux_reg7+mux_reg8+mux_reg9+mux_reg10+mux_reg11+mux_reg12+mux_reg13+mux_reg1

    24、4+mux_reg15;endmoduletimescale 1ns/1ns;include ./mult.v;module mult_test;reg15:0 a,b_in;wire rdy;wire31:0 mux_out;reg clk,rst_n,en;initialbegin clk=0; forever #50 clk=clk;endinitialbegin rst_n=0; en=0; a=16h1231; b_in=16ha231; #100 begin rst_n=1; en=0; a=16h2137; b_in=16h0142;end #100 begin rst_n=1;

    25、 en=1; a=16h0234; b_in=16h12a7;end #100 begin rst_n=1; en=1; a=16h0012; b_in=16ha261;end #100 begin rst_n=0; en=1; a=16h1112; b_in=16h0879;end #10000 $stop;endmux mux1(.clk(clk),.rst_n(rst_n),.en(en),.a(a),.b_in(b_in),.rdy(rdy),.mux_out(mux_out);endmodule 通过modelsim10.0仿真产生的波形如下所示: 当rst_n=0处于复位状态 输出

    26、mux_out=0,当rst=1并且使能端en=1时候,乘法器工作。当a=564,b=4775,mux_out=2693100,sto=1,实现了乘的操作,验证了电路实现乘法功能。 实验四 自动售货机设计自动售货机投入的金钱有50元,10元,5元,1元四种货币。可供选择的商品有7种类型。投入金钱后选择要买的商品,当投入的钱足够时,显示money_enough。并显示出要买的商品,并且找零,当投入的钱不够的时候,通过复位成初始态。具体的要求如如下图所示: 初始状态下,设投入的money,找零charge,money_enough都为0。投入的四种货币总共有12种情况,用price_all表示。设商品goods有7种,其价格为1,5,10,15,20,30,50,用price表示。Rest为低电平时候,一切初始。在rest为高电平的时候。选择商品,并且投币,当price-all小于price时候,也就是投入的金钱不够,显示money_en


    注意事项

    本文(用verilog编写16位加法器 乘法器 自动售货机.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

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

    收起
    展开