用verilog编写16位加法器乘法器自动售货机_第1页
用verilog编写16位加法器乘法器自动售货机_第2页
用verilog编写16位加法器乘法器自动售货机_第3页
用verilog编写16位加法器乘法器自动售货机_第4页
用verilog编写16位加法器乘法器自动售货机_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Verilog课程实验报告实验1十六位超前进位加法器1.1系统设计要求用超前进位加法器实现一个有符号位的16位加法器,并且考虑溢出的情况2.1详细设计根据超前进位加法器的原理Co=G|(P&Ci)S=P人Ci设计出4位加法器的子模块,然后通过4个4位加法器的相连来得到十六位的加法器。原理如下图所示。溢出用flag=0表不。PoGiPoGiP2G2P3G3Ci,01co,0J1co,1""ICo,2""HCo,3-Jfa-JFA-JFA_PoGiPoGiP2G2P3G3Idea:If(P0andP1andP2andP3=1)thenCo3=C0,e

2、lse“kill”oragenerate3.1程序/16位超前进位加法器modulecla16(a,b,s,flag);/含有a,b,输出s,进位flag的模块input15:0a,b;/输入a,boutput16:0s;/输出soutputregflag;/进位wirepp4,pp3,pp2,pp1;wiregg4,gg3,gg2,gg1;wire15:0Cp;wire15:0p,g;pgi0(a15:0,b15:0,p15:0,g15:0);addi1(p3,p2,p1,p0,g3,g2,g1,g0,pp1,gg1);addi2(p7,p6,p5,p4,g7,g6,g5,g4,pp2,gg

3、2);addi3(p11,p10,p9,p8,g11,g10,g9,g8,pp3,gg3);addi4(p15,p14,p13,p12,g15,g14,g13,g12,pp4,gg4);addi5(pp4,pp3,pp2,pp1,gg4,gg3,gg2,gg1,pp5,gg5);调用四位加法器模块add4l0(p3,p2,p1,p0,g3,g2,g1,g0,1'b0,Cp3,Cp2,Cp1,Cp0);add4l1(p7,p6,p5,p4,g7,g6,g5,g4,Cp3,Cp7,Cp6,Cp5,Cp4);add4l2(p11,p10,p9,p8,g11,g10,g9,g8,Cp7,Cp1

4、1,Cp10,Cp9,Cp8);add4l3(p15,p14,p13,p12,g15,g14,g13,g12,Cp11,Cp15,Cp14,Cp13,Cp12);assigns0=p0A1'b0;保留位assigns1=p1ACp0;assigns2=p2ACp1;assigns3=p3FCp2;assigns4=p4ACp3;assigns5=p5FCp4;assigns6=p6FCp5;assigns7=p7FCp6;assigns8=p8FCp7;assigns9=p9FCp8;assigns10=p10ACp9;assigns11=p11ACp10;assigns12=p12A

5、Cp11;assigns13=p13FCp12;assigns14=p14ACp13;assigns15=p15FCp14;assigns16=pp51gg5;溢出判断模块always(a,b,s)beginif(a15=1&&b15=1&&s15=0)|(a15=0&&b15=0&&s15=1)flag=1'b1;elseflag=1'b0;endendmodule/4位加法器模块moduleadd4(p3,p2,p1,p0,g3,g2,g1,g0,Co,Cp3,Cp2,Cp1,Cp0);input3:0p,g;

6、inputCo;output3:0Cp;assignCp0=g0|p0&Co;assignCp1=g1|p1&Cp0;assignCp2=g2|p2&Cp1;assignCp3=g3|p3&Cp2;endmodule/模块间的进位moduleadd(p3,p2,p1,p0,g3,g2,g1,g0,pp,gg);input3:0p,g;outputpp,gg;assignpp=p3&p2&p1&p0;assigngg=g3|(p3&(g2|p2&(g1|p1&g0);endmodule/进位信号的产生modulepg

7、(a,b,p,g);input15:0a,b;output15:0p,g;assignp=aAb;assigng=a&b;endmodule4.1测试程序通过产生一个随机输入a和b,来验证c=a+b。/16位加法器的测试文件'timescale1ns/1ns'include"./sixteenadder.v"modulesixteenaddertest;wire15:0s;reg15:0a,b;wireflag;parametertimes=5;随机产生一个数,总共产生6次initialbegina=$random%65536;b=$random%6

8、5536;repeat(times)begin#100a=$random%65536;b=$random%65536;end#100$stop;endcla16cal161(a,b,s,flag);endmodule5.1仿真波形用mudelsim10.0仿真得到的波形如下所示:/sixteenaddertE&t/a/sixtetnaddertest/b/sixte4M/sixtMruddertest/.31501-262275274StO如图a=13604,b=24193s=-27739.s为负数,产生溢出,溢出标位sto=1.当a=-10743,b=22115.s=11372没有溢

9、出,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,sinput15:0a,b;/输入a,boutput16:0s;输出swirepp4,pp3,pp2,pp1;

10、wiregg4,gg3,gg2,gg1;wire15:0Cp;wire15:0p,g;pgi0(a15:0,b15:0,p15:0,g15:0);addi1(p3,p2,p1,p0,g3,g2,g1,g0,pp1,gg1);addi2(p7,p6,p5,p4,g7,g6,g5,g4,pp2,gg2);addi3(p11,p10,p9,p8,g11,g10,g9,g8,pp3,gg3);addi4(p15,p14,p13,p12,g15,g14,g13,g12,pp4,gg4);addi5(pp4,pp3,pp2,pp1,gg4,gg3,gg2,gg1,pp5,gg5);add4l0(p3,p2

11、,p1,p0,g3,g2,g1,g0,1'b0,Cp3,Cp2,Cp1,Cp0);add4l1(p7,p6,p5,p4,g7,g6,g5,g4,Cp3,Cp7,Cp6,Cp5,Cp4);add4l2(p11,p10,p9,p8,g11,g10,g9,g8,Cp7,Cp11,Cp10,Cp9,Cp8);add4l3(p15,p14,p13,p12,g15,g14,g13,g12,Cp11,Cp15,Cp14,Cp13,Cp12);assigns0=p0A1'b0;assigns1=p1ACp0;assigns2=p2ACp1;assigns3=p3ACp2;assigns4=p4

12、ACp3;assigns5=p5ACp4;assigns6=p6ACp5;assigns7=p7ACp6;assigns8=p8ACp7;assigns9=p9ACp8;assigns10=p10FCp9;assigns11=p11FCp10;assigns12=p12ACp11;assigns13=p13FCp12;assigns14=p14ACp13;assigns15=p15FCp14;assigns16=pp51gg5;endmodulemoduleadd4(p3,p2,p1,p0,g3,g2,g1,g0,Co,Cp3,Cp2,Cp1,Cp0);input3:0p,g;inputCo;

13、output3:0Cp;assignCp0=g0|p0&Co;assignCp1=g1|p1&Cp0;assignCp2=g2|p2&Cp1;assignCp3=g3|p3&Cp2;endmodulemoduleadd(p3,p2,p1,p0,g3,g2,g1,g0,pp,gg);input3:0p,g;outputpp,gg;assignpp=p3&p2&p1&p0;assigngg=g3|(p3&(g2|p2&(g1|p1&g0);endmodulemodulepg(a,b,p,g);input15:0a,b;

14、output15:0p,g;assignp=aAb;assigng=a&b;endmodule定义加减法器的模块moduleaddsub(a,b,s,flag,add_sub);input15:0a,b;inputadd_sub;output15:0s;outputregflag;wire15:0b1;cla16cla1(a,b1,s);/*always(posedgeclk)beginif(add_sub)beginb1=b;b1=b1+1;endelseb1=b;end*/assignb1=(add_sub)?b:(b+1'b1);/判断是否为减操作,为减操作的话是取反加一

15、的运算always(a,b,s)/判断是否溢出beginif(a15=1&&b15=1&&add_sub=1&&s15=0)|(a15=0&&b15=0&&add_sub=1&&s15=1)flag=1'b1;elseflag=1'b0;endendmodule4.1测试程序'timescale1ns/1ns'include"./adder_sub.v"moduleadder_sub_test;wire15:0s;reg15:0a,b;regadd

16、_sub;wireflag;initial初始化,输入测试的数据begina=-16'h7851;b=16'ha432;add_sub=1;#100begina=-16'h1233;b=16'h3211;add_sub=0;end#100begina=16'h0232;b=16'ha161;add_sub=1;end#100begina=16'h5632;b=16'h04a1;add_sub=0;end#100begina=-16'h1234;b=16'h4525;add_sub=0;end#1000$stop;e

17、ndaddsubaddsub1(a,b,s,flag,add_sub);endmodule5.1仿真结果用modelsim10.0仿真,得到的结果如下所示:当a=-30801b=-23502,add-sub=1,加操作,s溢出,产生溢出信号flag=1.当a=-4659b=12817add_sub=0,减操作,输出s=-17476,无溢出,flag=0.当a=562b=-24223add_sub=1,力口操作,输出s=-23661,无溢出,flag=0.通过以上的结果分析,此程序实现了带符号位的加减法的功能。实验三十六位的乘法器11系统设计要求实现16*16位的无符号位的乘法器2.1详细设计乘

18、法器的硬件电路原理如下UHACiiiicalPath1CriticalPath2CriicFilParkIXp2定义16个寄存器,用来存储一行乘操作产生的数据,最后的结果为所有16行相加。3.1程序/16位乘法器modulemux(clk,rst_n,en,a,b_in,rdy,mux_out);inputclk;/定义时钟inputrst_n;/复位信号inputen;/使能input15:0a,b_in;/输入a,b-inoutputrdy;/输出rdy,当结果正确时候为高电平output31:0mux_out;/乘法输出值regrdy;定义中间的17个寄存器reg15:0mux_reg0

19、;reg16:0mux_reg1;reg17:0mux_reg2;reg18:0mux_reg3;reg19:0mux_reg4;reg20:0mux_reg5;reg21:0mux_reg6;reg22:0mux_reg7;reg23:0mux_reg8;reg24:0mux_reg9;reg25:0mux_reg10;reg26:0mux_reg11;reg27:0mux_reg12;reg28:0mux_reg13;reg29:0mux_reg14;reg30:0mux_reg15;reg31:0mux_reg16;always(rst_noraorb_inoren)/监视4个变量beg

20、inif(!rst_n)复位beginrdy<=1'b0;mux_reg0=16'd0;mux_reg1=17'd0;mux_reg2=18'd0;mux_reg3=19'd0;mux_reg4=20'd0;mux_reg5=21'd0;mux_reg6=22'd0;mux_reg7=23'd0;mux_reg8=24'd0;mux_reg9=25'd0;mux_reg10=26'd0;mux_reg11=27'd0;mux_reg12=28'd0;mux_reg13=29&#

21、39;d0;mux_reg14=30'd0;mux_reg15=31'd0;mux_reg16=32'd0;end/elseif(en&&rst_n)/开始乘法的运算操作beginif(a0)mux_reg0<=b_in;elsemux_reg0<=16'd0;if(a1)mux_reg1<=b_in,mux_reg160;elsemux_reg1<=17'd0;if(a2)mux_reg2<=b_in,mux_reg161:0;elsemux_reg2<=18'd0;if(a3)mux_reg

22、3<=b_in,mux_reg162:0;elsemux_reg3<=19'd0;if(a4)mux_reg4<=b_in,mux_reg163:0;elsemux_reg4<=20'd0;if(a5)mux_reg5<=b_in,mux_reg164:0;elsemux_reg5<=21'd0;if(a6)mux_reg6<=b_in,mux_reg165:0;elsemux_reg6<=22'd0;if(a7)mux_reg7<=b_in,mux_reg166:0;elsemux_reg7<=23&

23、#39;d0;if(a8)mux_reg8<=b_in,mux_reg167:0;elsemux_reg8<=24'd0;if(a9)mux_reg9<=b_in,mux_reg168:0;elsemux_reg9<=25'd0;if(a10)mux_reg10<=b_in,mux_reg169:0;elsemux_reg10<=26'd0;if(a11)mux_reg11<=b_in,mux_reg1610:0;elsemux_reg11<=27'd0;if(a12)mux_reg12<=b_in,mux_

24、reg1611:0;elsemux_reg12<=28'd0;if(a13)mux_reg13<=b_in,mux_reg1612:0;elsemux_reg13<=29'd0;if(a14)mux_reg14<=b_in,mux_reg1613:0;elsemux_reg14<=30'd0;if(a15)mux_reg15<=b_in,mux_reg1614:0;elsemux_reg15<=31'd0;rdy<=1;endelsebeginrdy<=1'b0;endend输出结果为所有寄存器的和a

25、ssignmux_outmux_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_reg14+mux_reg15;endmodule4.1测试程序'timescale1ns/1ns;'include"./mult.v"modulemult_test;reg15:0a,b_in;wirerdy;wire31:0mux_out;regclk,rst_n,e

26、n;initialbeginclk=0;forever#50clk=-clk;endinitialbeginrst_n=0;en=0;a=16'h1231;b_in=16'ha231;#100beginrst_n=1;en=0;a=16'h2137;b_in=16'h0142;end#100beginrst_n=1;en=1;a=16'h0234;b_in=16'h12a7;end#100beginrst_n=1;en=1;a=16'h0012;b_in=16'ha261;end#100beginrst_n=0;en=1;a=16

27、'h1112;b_in=16'h0879;end#10000$stop;endmuxmux1(.clk(clk),.rst_n(rst_n),.en(en),.a(a),.b_in(b_in),.rdy(rdy),.mux_out(mux_out);endmodule5.1仿真波形通过modelsim10.0仿真产生的波形如下所示:/mult_test/dk1.*/muljtes讲st_n01114370S503la.4皿二2169415213224775'156910巨>6931001748242Arwlt_ttstAdysto当rst_n=0处于复位状态输出m

28、ux_out=0,当rst=1并且使能端en=1时候,乘法器工作。当a=564,b=4775,mux_out=2693100,sto=1,实现了乘的操作,验证了电路实现乘法功能。实验四自动售货机设计1.1系统设计要求自动售货机投入的金钱有50元,10元,5元,1元四种货币。可供选择的商品有7种类型。投入金钱后选择要买的商品,当投入的钱足够时,显示money_enougho并显示出要买的商品,并且找零,当投入的钱不够的时候,通过复位成初始态。具体的要求如下图所示:r£ST7kind士ofinML心词nF2.1详细设计初始状态下,设投入的money,找零charge,money_enou

29、gh都为0。投入的四种货币总共有12种情况,用price_all表示。设商品goods有7种,其价格为1,5,10,15,20,30,50,用price表示。Rest为低电平时候,一切初始。在rest为高电平的时候。选择商品,并且投币,当price-all小于price时候,也就是投入的金钱不够,显示money_enough为0,回初始状态。当pirce_all大于price时候,输出选择的商品goods。并且找零。其状态转换图如下:所投的金颤小于商品价格Moneyn123456789101112Price_all1510502201001151155560Selln1234567price1

30、510152030503.1程序/自动售货机代码moduleauto_sell(clk,sell,rest,money,charge,goods,money_enough)inputclk,rest;input3:0money;投入的金钱有12种input2:0sell;/7种商品output7:0charge;/找零output2:0goods;/表示选择的商品outputmoney_enough;/钱足够的信号regmoney_enough;reg2:0goods;reg7:0charge;reg7:0price,price_all;always(posedgeclkornegedgere

31、st)beginif(!rest)begincharge<=8'd0;goods<=3'd0;money_enough<=1'b0;price<=8'd0;price_all<=8'd0;endelsebegincase(money)/4种面值总共12种选择4'b0001:beginprice_all<=8'd1;end4'b0010:beginprice_all<=8'd5;end4'b0011:beginprice_all<=8'd10;end4'

32、b0100:beginprice_all<=8'd50;end4'b0101:beginprice_all<=8'd2;end4'b0110:beginprice_all<=8'd20;end4'b0111:beginprice_all<=8'd100;end4'b1000:beginprice_all<=8'd11;end4'b1001:beginprice_all<=8'd51;end4'b1010:beginprice_all<=8'd15;e

33、nd4'b1011:beginprice_all<=8'd55;end4'b1100:beginprice_all<=8'd60;enddefault:beginprice_all<=8'd0;endendcasecase(sell)/7种商品3'b001:beginprice<=8'd1;end3'b010:beginprice<=8'd5;end3'b011:beginprice<=8'd10;end3'b100:beginprice<=8'd1

34、5;end3'b101:beginprice<=8'd20;end3'b110:beginprice<=8'd30;end3'b111:beginprice<=8'd50;enddefault:beginprice<=8'd0;endendcaseif(price_all<price)如果投入的钱不够beginprice<=8'd0;money_enough<=1'b0;goods<=3'd0;charge<=8'd0;endelse/投入的钱足够begincharge<=price_all-price;money_enough<=1'b1;case(price)/用goods显示货物被卖出1:begingoods<=4'b000

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论