设计一个自动饮料售卖机,饮料10分钱,硬币有5分和10分两种,并考虑找零。
假设fen_5表示5分线,fen_10表示10分钱,out表示出饮料,remain表示找零,故状态机需要3个状态,分别为S0(0分)、S1(5分)、S2(10分)
1、FSM跳转图
2、verilog 代码
module vend_machine(
input wire clk,
input wire rst_n,
input wire fen_10,
input wire fen_5,
output wire out,
output wire remain
);
parameter DLY 0.1;
parameter S0 2'b00; //0 fen
parameter S1 2'b01; //5 fen
parameter S2 2'b10; //10 fen
reg [1:0] next_state;
reg [1:0] cur_state;
always @(posedge clk or negedge rst_n) begin
if(~rst_n)
cur_state <= S0;
else
cur_state <= #DLY next_state;
end
always @(fen_10 or fen_5 or cur_state) begin
case(cur_state)
S0: begin
if(~fen_10 & fen_5)
next_state = S1;
else if(fen_10 & ~fen_5)
next_state = S2;
else
next_state = S0;
end
S1: begin
if(~fen_10 & fen_5)
next_state = S2;
else if(fen_10 & ~fen_5)
next_state = S0;
else
next_state = S1;
end
S2: begin
next_state = S0;
end
default: begin
next_state = S0;
end
endcase
end
always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin
out <= 1'b0;
remain <= 1'b0;
end
else begin
if(cur_state == S0) begin
if(fen_10 & ~fen_5) begin
out <= 1'b1;
remain <= 1'b0;
end
else begin
out <= 1'b0;
remain <= 1'b0;
end
end
else if(cur_state == S1) begin
if(~fen_10 & fen_5) begin
out <= 1'b1;
remain <= 1'b0;
end
else if(fen_10 & ~fen_5) begin
out <= 1'b1;
remain <= 1'b1;
end
else begin
out <= 1'b0;
remain <= 1'b0;
end
end
else if(cur_state == S2) begin
if(~fen_10 & ~fen_5) begin
out <= 1'b1;
remain <= 1'b0;
end
else begin
out <= 1'b1;
remain <= 1'b1;
end
end
else begin
out <= 1'b0;
remain <= 1'b0;
end
end
end
endmodule