一、模块框图的绘制
输入信号四个,分别是:时钟信号、复位信号、投币0.5元以及投币一元;
输出信号两个:出可乐信号和找零信号。
二、3要素
输入要素:0.5、1;
输出要素:不出可乐/不找零、出可乐/不找零、出可乐/找零;
状态要素:0、0.5、1、1.5、2、2.5、3。
三、状态机的绘制
(这里可乐价格规定为2.5元)首先状态机初始状态为IDLE,投0.5元硬币,状态机从初始状态跳到HALF状态(不出可乐),投1元硬币从初始状态跳转到ONE状态(不出可乐),再来看HALF状态,如果不投币,状态机保持HALF状态,如果投0.5元硬币,状态机从HALF状态跳转到ONE状态(不出可乐),同理投1元硬币,状态机从跳转到ONE_HALF状态(不出可乐),最后说一下从TWO状态开始,如果投0.5元硬币,状态会回到初始状态,然后出可乐,不找零,如果投1元硬币,回到初始状态,出可乐,找零。
通过状态机的绘制,我们可以通过这种方式把我们的波形图也绘制出来
波形图绘制完成后,我们可以进行代码的编写了。
四、代码部分
1、工程代码
`timescale 1ns/1ns
module complex_fsm
(
input wire sys_clk , //系统时钟50MHz
input wire sys_rst_n , //全局复位
input wire pi_money_one , //投币1元
input wire pi_money_half , //投币0.5元
output reg po_money , //po_money为1时表示找零
//po_money为0时表示不找零
output reg po_cola //po_cola为1时出可乐
//po_cola为0时不出可乐
);
//parameter define
//只有五种状态,使用独热码
parameter IDLE = 5'b00001;
parameter HALF = 5'b00010;
parameter ONE = 5'b00100;
parameter ONE_HALF = 5'b01000;
parameter TWO = 5'b10000;
//reg define
reg [4:0] state;
//wire define
wire [1:0] pi_money;
//pi_money:为了减少变量的个数,我们用位拼接把输入的两个1bit信号拼接成1个2bit信号
//投币方式可以为:不投币(00)、投0.5元(01)、投1元(10),每次只投一个币
assign pi_money = {
pi_money_one, pi_money_half};