您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 简单自动售货机VerilogHDL程序
减钱清零投币允许提示退钱允许提示饮料选择提示自动售货机VerilogHDL程序一个简单的自动售卖饮料机的程序。该机器具有投币,显示余额,购买六种饮料,退钱等功能,为了更具实用性,增添了饮料选择允许提示和投币允许提示的功能。具体形容,可投入一元、五元、十元和二十元面值的钱币,显示出当前的余额,并根据当前的余额提示能购买哪些饮料,选择某种饮料,则输出选定的饮料,同时余额减去相应的金钱。若选择退钱,机器就退出所有的钱,余额清零。下图为功能示意图:程序的状态表:money(余额)state(状态)选择提示投币提示退钱提示000选择可以投币无钱可退11可选择1,2可以退钱2或32可选择1,2,3,44而203可选择1~6=204不可再投投币选择饮料退钱余额变化加钱状态变化程序中包含了一个状态机,定义了一个任务(task)和函数(function),用该任务调用了该函数,使用若干分支语句,详见附后源程序和测试程序。附上程序编译仿真图:源程序如下:`defineone3'b001`definefive3'b010`defineten3'b011`definetwenty3'b100moduleautomart(money,state,moneyout,coinable,adrkable,bdrkable,cdrkable,drkout1,drkout2,drkout3,drkout4,drkout5,drkout6,coin,clk,reset,moneyback,choice1,choice2,choice3,choice4,choice5,choice6);input[2:0]coin;//投币输入,分为1、5、10、20元四种输入inputclk,reset,moneyback,choice1,choice2,choice3,choice4,choice5,choice6;//moneyback为退钱输入,choice1~6是饮料选择outputmoneyout,coinable,adrkable,bdrkable,cdrkable,drkout1,drkout2,drkout3,drkout4,drkout5,drkout6;//依次为退钱输出,投币许可提示,饮料选择许可,6种饮料输出output[2:0]state;//状态记录output[7:0]money;//余额显示reg[7:0]money;reg[2:0]state;regmoneyout,coinable,backable,adrkable,bdrkable,cdrkable;parameterA=3'b000,B=3'b001,C=3'b010,D=3'b011,E=4'b100;assigndrkout1=choice1&adrkable;assigndrkout2=choice2&adrkable;assigndrkout3=choice3&bdrkable;assigndrkout4=choice4&bdrkable;assigndrkout5=choice5&cdrkable;assigndrkout6=choice6&cdrkable;always@(posedgeclk)repeat(1)@(posedgeclk)if(!reset)beginstate=A;money=0;moneyout=0;endelsebegincase(state)A:begin//初始状态A,可投币进入别的状态coinable=1;backable=0;adrkable=0;bdrkable=0;cdrkable=0;endB:begin//状态B,只能买1元的饮料,可退钱或投币coinable=1;backable=1;adrkable=1;bdrkable=0;cdrkable=0;endC:begin//状态C,可买1或2元的饮料,退钱或投币coinable=1;backable=1;adrkable=1;bdrkable=1;cdrkable=0;endD:begin//状态D,可买三档价格饮料,可退钱或投币coinable=1;backable=1;adrkable=1;bdrkable=1;cdrkable=1;endE:begin//状态E,可买三档价格饮料,可退钱,不可继续投钱coinable=0;backable=1;adrkable=1;bdrkable=1;cdrkable=1;enddefault:state=A;endcasecondition(money,state,coin,coinable);//调用任务endalways@(negedgedrkout1ornegedgedrkout2)money=money-8'h01;//买1元的饮料,余额减1元always@(negedgedrkout3ornegedgedrkout4)money=money-8'h02;//买2元的饮料,余额减2元always@(negedgedrkout5ornegedgedrkout6)money=money-8'h04;//买4元的饮料,余额减4元always@(negedgemoneyback)beginif(backable)beginmoneyout=1;money=0;//选择退钱,则推出金钱,余额清零endelsemoney=money+0;endtaskcondition;//该任务可以判断余额的改变,状态切换inout[7:0]moneycon;inout[2:0]statecon;input[2:0]coincon;inputcoinablecon;beginif(coinablecon)//允许投币时begincase(coincon)//根据投币面值改变余额,切换状态`one:moneycon=moneycon+8'h01;`five:moneycon=moneycon+8'h05;`ten:moneycon=moneycon+8'h0a;`twenty:moneycon=moneycon+8'h14;default:moneycon=moneycon+0;//无投币则余额不变endcasestatecon=condition_s(moneycon);//调用函数endelseif(moneycon8'h14)//不允许投币时,根据余额变化statecon=condition_s(moneycon);//直接切换状态endendtaskfunction[2:0]condition_s;//根据余额的值切换状态的函数input[7:0]money_s;reg[7:0]money_s;beginif(money_s==0)condition_s=A;elseif(money_s==8'h01)condition_s=B;elseif(money_s==8'h02||money_s==8'h03)condition_s=C;elseif(money_s=8'h04&&money_s8'h14)condition_s=D;elsecondition_s=E;endendfunctionendmodule测试程序如下:`timescale100ns/1ns`defineclk_cycle50moduletest;regmoneyback,choice1,choice2,choice3,choice4,choice5,choice6;reg[2:0]coin;regclk,reset;wire[7:0]money;wire[2:0]state;wiremoneyout,coinable,adrkable,bdrkable,cdrkable,drkout1,drkout2,drkout3,drkout4,drkout5,drkout6;parameterone=3'b001,five=3'b010,ten=3'b011,twenty=3'b100;always#`clk_cycleclk=~clk;initialbegincoin=0;moneyback=0;clk=0;choice1=0;choice2=0;choice3=0;choice4=0;choice5=0;choice6=0;reset=1;#10reset=0;#200reset=1;#400coin=one;//投币1元,#220coin=0;#200coin=one;//投1元,余额2元#220coin=0;#200coin=five;//投5元,余额7元#220coin=0;#200coin=twenty;//投20元,余27#220coin=0;#200choice1=1;//买1元饮料,余26#220choice1=0;#200choice3=1;//买2元饮料,余24#220choice3=0;#200choice4=1;//买2元饮料,余22#220choice4=0;#200choice5=1;//买4元饮料,余18#220choice5=0;#200choice6=1;//买4元饮料,余14#220choice6=0;#200choice6=1;//买4元饮料,余10#220choice6=0;#200choice6=1;//买4元饮料,余6#220choice6=0;#200choice6=1;//买4元饮料,余2#220choice6=0;#200coin=five;//投5元,余7#220coin=0;#200moneyback=1;//退钱#220moneyback=0;endautomartm(.money(money),.state(state),.moneyout(moneyout),.coinable(coinable),.adrkable(adrkable),.bdrkable(bdrkable),.cdrkable(cdrkable),.drkout1(drkout1),.drkout2(drkout2),.drkout3(drkout3),.drkout4(drkout4),.drkout5(drkout5),.drkout6(drkout6),.coin(coin),.clk(clk),.reset(reset),.moneyback(moneyback),.choice1(choice1),.choice2(choice2),.choice3(choice3),.choice4(choice4),.choice5(choice5),.choice6(choice6));endmodule
本文标题:简单自动售货机VerilogHDL程序
链接地址:https://www.777doc.com/doc-1890612 .html