页数:21页文件大小:257.8 KB来源: 硬件描述语言和数字系统设计ppt课件
本课件以一个饮料自动投币售卖机的核心控制电路为实例,从简化需求出发分析输入输出端口信号,绘制投币与找零的状态转移图,给出对应的Verilog描述与状态编码,并编写测试代码完成功能仿真与波形验证。
第12章实例-设计饮料自动投币售卖机的核心控制电路硬件描述语言和数字系统设计
为2.5元。硬币有0.5元和1.0元两种,考虑找零,用Verilog描述其控制电路。
如果检测到op_start=1,开始检测是否有投币,如果有,一次新的售货操作开始;2.在状态S1/S2/S3/S4下,如果检测到cancel_flag=1,则取消操作,状态返回S0,并退回相应的币值;3.在状态S5下,卖出饮料不找零;在状态S6下,卖出饮料并找零;4.在状态S5和S6操作完后,都返回状态S0,等待下一轮新的操作开始;5.只有在S0状态下,hold_ind=0,可以发起新一轮操作,其它状态下都为1;
Verilog描述-softdrinkFSM.vmodulesoftdrinkFSM(clk,rst,op_start,cancel_flag,coin_val,hold_ind,charge_ind,drinktk_ind,charge_val);input clk,rst;input op_start,cancel_flag;input [1:0] coin_val;outputhold_ind,charge_ind,drinktk_ind;output [2:0]charge_val;reg hold_ind,charge_ind, drinktk_ind;reg [2:0] charge_val;reg [2:0] currentstate, nextstate;parameterS0=3'b000; parameter S1=3'b001;parameter S2=3'b010; parameter S3=3'b011;parameter S4=3'b100; parameter S5=3'b101;parameter S6=3'b110;
always @(posedge clk or posedge rst)if (rst)currentstate<= S0; elsecurrentstate <= nextstate; always @ (currentstate or rst or op_start or cancel_flag orcoin_val )if(rst)nextstate=S0; else case (currentstate)S0: if(op_start)if(coin_val==2'b01)nextstate=S1; else if(coin_val==2'b10)nextstate=S2;always @ (currentstate)if (currentstate==S0)hold_ind= 1'b0; elsehold_ind= 1'b1; always @ (currentstate)if ((currentstate == S5 )||(currentstate == S6))drinktk_ind= 1'b1; elsedrinktk_ind= 1'b0; always @ (currentstate orcancel_flag)if(currentstate==S0)charge_ind= 1'b0; elseif(currentstate==S6)charge_ind= 1'b1; else if(cancel_flag)charge_ind= 1'b1; elsecharge_ind= 1'b0;always @ (currentstate orcancel_flag)if(currentstate== S0)charge_val=3'b000; elseif(currentstate== S6)charge_val=3'b001; else if(cancel_flag)begincase (currentstate)S1:charge_val=3'b001; S2:charge_val=3'b010; S3:charge_val=3'b011; S4:charge_val=3'b100; default:charge_val=3'b000; endcaseendelsecharge_val=3'b000; endmodule;测试模块编写modulesoftdrink_testbench; reg rst, clk; reg op_start; reg cancel_flag; reg [1:0] coin_val; wire hold_ind; wire charge_ind; wire drinktk_ind; wire [2:0] charge_val; initial clk=0;always #500 clk=~clk;initialbeginrst=0;op_start=0;cancel_flag=0;coin_val=2'b00;#25rst=1;#25rst=0;//第一次:依次投入一元、一元、一元的硬币,看结果如何?#50op_start=1;#300 coin_val=2'b10;#1000 coin_val=2'b10;#1000coin_val=2'b10;#1000op_start=0;
一元、一元的硬币,看结果又如何?#2000op_start=1;coin_val=2'b01;#1000coin_val=2'b10;#1000coin_val=2'b10;#1000op_start=0;//第三次:依次投入0.5元、一元的硬币,然后取消操作,看结果如何?#2000op_start=1;coin_val=2'b01;#1000coin_val=2'b10;#1000cancel_flag=1'b1;op_start=0;#1000cancel_flag=0;
0.5元、0.5元、0.5元、一元的硬币,看结果如何?#2000op_start=1;coin_val=2'b01;#1000coin_val=2'b01;#1000coin_val=2'b01;#1000coin_val=2'b01;#1000coin_val=2'b10;#1000op_start=0;#1000000$stop;end
硬币,然后取消操作
下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}