//设计一个自动饮料售卖机,共有两种饮料,其中饮料 A 每个 10 分钱,饮料 B 每个 5 分钱
//硬币有 5 分和 10 分两种,并考虑找零。
//要求用状态机实现,定义状态,画出状态转移图,并用 Verilog 完整描述该识别模块。
//sel为1.表示选择饮料A,sel为0,表示选择饮料B。//输入2'b01--表示5分钱,2'b10--表示10分钱。
//d_in表示投入钱的数量,d_out高表示输出饮料,d_c表示找零。
module sel_fsm (
input clk,
input rst,
input sel,
input [1:0]d_in,
output reg d_out,
output reg [1:0]d_c
);
reg [1:0]state,nextstate;
parameter s0=2'b00;
parameter s1=2'b01;
parameter s2=2'b10;
always @(posedge clk or negedge rst) begin
if(!rst) begin
state <= s0;
end
else begin
state <= nextstate;
end
end
always @(state or sel or d_in) begin
nextstate = 2'bxx;
case (state)
s0: begin
if(d_in==2'b01 && sel == 1'b1) begin
nextstate = s1;
{d_c,d_out} = 3'b0;
end
else if(d_in == 2'b10 && sel == 1'b1) begin
nextstate = s0;
{d_c,d_out} = 3'b001;
end
else if(d_in == 2'b01 && sel == 1'b0)begin
nextstate = s0;
{d_c,d_out} = 3'b001;
end
else if(d_in == 2'b10 && sel == 1'b0)begin
nextstate = s0;
{d_c,d_out} = 3'b011;
end
else begin
nextstate = s0;
{d_c,d_out} = 3'b0;
end
end
s1:begin
if(d_in == 2'b01 && sel == 1'b1) begin
nextstate = s0;
{d_c,d_out} = 3'b001;
end
else if (d_in == 2'b10 && sel == 1'b1) begin
nextstate = s0;
{d_c,d_out} = 3'b011;
end
else if(sel == 1'b0)begin
nextstate = s0;
{d_c,d_out} = 3'b001;
end
else begin
nextstate = s1;
end
end
default: nextstate = s0;
endcase
end
endmodule
`timescale 1ns/1ps
module test_tb;
reg clk;
reg rst;
reg sel;
reg [1:0]d_in;
wire d_out;
wire [1:0]d_c;
sel_fsm u1(
.clk(clk),
.rst(rst),
.sel(sel),
.d_in(d_in),
.d_out(d_out),
.d_c(d_c)
);
initial begin
clk = 1'b1;
rst = 1'b0;
#7;
rst = 1'b1;
end
always #5 clk = ~clk;
initial begin
#10;
sel = 1'b1;
d_in = 2'b01;
#10 d_in = 2'b01;
#10 d_in = 2'b01;
#10 d_in = 2'b01;
#10 d_in = 2'b10;
#10 d_in = 2'b00;
#10 d_in = 2'b01;
#10 sel = 1'b0;
#10 d_in = 2'b01;
#10 d_in = 2'b00;
#10 d_in = 2'b10;
#10 d_in = 2'b00;
#10;
end
endmodule
![]()