首页计算机计算机工程硬件描述语言和数字系统设计 12 第12章 自动售货机.pptx

12 第12章 自动售货机.pptx

页数:21页文件大小:257.8 KB来源: 硬件描述语言和数字系统设计ppt课件

本课件以一个饮料自动投币售卖机的核心控制电路为实例,从简化需求出发分析输入输出端口信号,绘制投币与找零的状态转移图,给出对应的Verilog描述与状态编码,并编写测试代码完成功能仿真与波形验证。

第12章饮料自动投币售卖机设计章节封面,标示本章以状态机实现投币与找零控制
要求:简化考虑,假设饮料只有一种价格内容页,硬币有0.5元和1.0元两种,考虑找零,用Verilog描述其控制电路
设计步骤分解:12.1分析输入输出端口信状态转移图,设计步骤分解:12.1分析输入输出端口信号12.2状态转移图12.3根据状态转移图进行Verilog语言
查看本课件的文字版(共 21 页,供检索与复制)

第1页:第12章饮料自动投币售卖机设计

第12章实例-设计饮料自动投币售卖机的核心控制电路硬件描述语言和数字系统设计

第2页:要求:简化考虑,假设饮料只有一种价格

为2.5元。硬币有0.5元和1.0元两种,考虑找零,用Verilog描述其控制电路。

第3页:设计步骤分解:12.1分析输入输出端口信

设计步骤分解
12.1分析输入输出端口信号12.2状态转移图12.3根据状态转移图进行Verilog语言描述12.4测试代码编写,仿真12.5 FPGA实现

第4页:分析输入输出端口信号

输入信号
clk,rst;输入信号:操作开始: op_start;//定义1开始操作输入信号:投币币值: coin_val;//定义2’b01表示0.5元;2’b10表示1元输入信号:取消操作指示: cancel_flag;//定义1为取消操作输出信号:机器是否占用: hold_ind;//定义0为不占用,可以使用输出信号:取饮料信号: drinktk_ind;//定义1为取饮料输出信号:找零与退币标志信号: charge_ind;//定义1为找零输出信号:找零与退币币值:charge_val;//定义3’b001表示找0.5元;3’b010表示找1元;// 3’b011表示找1.5元; 3’b100表示找2.0元;

第5页:状态转移图

设计步骤
2.状态转移图a)状态确定:S0:初始态;S1:已投币0.5元;S2:已投币1.0元;S3:已投币1.5元;S4:已投币2.0元;S5:已投币2.5元;S6:已投币3.0元;

第6页:状态说明:S0:初始态

;S1
已投币0.5元;S2:已投币1.0元;S3:已投币1.5元;S4:已投币2.0元;S5:已投币2.5元;S6:已投币3.0元;S0S1S2S3S4S6S5Coin_val=2’b01Coin_val=2’b01Coin_val=2’b10Coin_val=2’b10Coin_val=2’b01Coin_val=2’b10Coin_val=2’b01Coin_val=2’b10Coin_val=2’b01Coin_val=2’b10drinktk_ind=1;charge_ind =0drinktk_ind=0;charge_ind =0drinktk_ind=1;charge_ind =1drinktk_ind=0;charge_ind =0drinktk_ind=0;charge_ind =0drinktk_ind=0;charge_ind =0hold_ind=0

第7页:说明:1.在S0状态下

如果检测到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;

第8页:根据状态转移图进行Verilog语言描述

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;

第9页:售卖机状态时序逻辑

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;

第10页:S1状态转移分支

S1
if(cancel_flag)nextstate=S0;else if(coin_val==2'b01)nextstate=S2;else if(coin_val==2'b10)nextstate=S3;S2: if(cancel_flag)nextstate=S0;else if(coin_val==2'b01)nextstate=S3;else if(coin_val==2'b10)nextstate=S4;S3: if(cancel_flag)nextstate=S0;else if(coin_val==2'b01)nextstate=S4;else if(coin_val==2'b10)nextstate=S5;

第11页:S4状态转移分支

S4
if(cancel_flag)nextstate=S0;else if(coin_val==2'b01)nextstate=S5;else if(coin_val==2'b10)nextstate=S6;S5:nextstate=S0;S6:nextstate=S0;default:nextstate=S0;endcase

第12页:currentstate 时序逻辑示例

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;

第13页:currentstate(续1)

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;

第14页:测试代码编写

测试模块编写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;

第15页:Verilog代码示例

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;

第16页://第二次:依次投入0.5元

一元、一元的硬币,看结果又如何?#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;

第17页://第四次:依次投入0.5元

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

第18页:测试代码编写(续1)

仿真波形//第一次
依次投入一元、一元、一元的硬币

第19页://第二次:依次投入0.5元(续1)

//第二次
依次投入0.5元、一元、一元的硬币

第20页://第三次:依次投入0.5元、一元的

硬币,然后取消操作

第21页://第四次:依次投入0.5元(续1)

//第四次
依次投入0.5元、0.5元、0.5元、0.5元、一元的硬币
顶部目录