![]()
module fsm (
input clk,
input rst_n,
input [4:0] in_money,
output reg [3:0] out_money,
output reg [1:0] out_goods
);
parameter s0 = 2’b00,
s1 = 2’b01,
s2 = 2’b10;
reg [1:0] c_n, n_s;
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
c_s <= s0;
end
else
c_s <= n_s;
end
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
n_s <= s0;
end
else case(n_s)
s0: if(in_money == ‘d5)
n_s <= s1;
else if(in_money == ‘d10)
n_s <= s2;
else if(in_money == ‘d20)
n_s <= s1;
else
n_s <= n_s;
s1: if(in_money == ‘d5)
n_s <= s2;
else if (in_money == ‘d10)
n_s <= s0;
else if(in_money == ‘d20)
n_s <= s2;
else
n_s < n_s;
s2: if (in_money == ‘d5)
n_s <= s0;
else if (in_money == ‘d10)
n_s <= s1;
else if (in_money == ‘d20)
n_s <= s0;
else
n_s <= n_s;
default: n_s <= n_s;
endcase
end
always@( posedge clk or negedge rst_n) begin
if(!rst_n) begin
out_money <= 0;
out_goods <= 0;
end
else case(c_s)
s0: if(in_money == ‘d5) begin
out_money <= 5;
out_goods <= 0;
end
else if(in_money == ‘d10) begin
out_money <= 10;
out_goods <= 0;
end
else if(in_money == ‘d20) begin
out_money <= 5;
out_goods <= 1;
end
else
begin
out_money <= out_money;
out_goods <= out_goods;
end
s1: if(in_money == ‘d5) begin
out_money <= 10;
out_goods <= 0;
end
else if(in_money == ‘d10) begin
out_money <= 0;
out_goods <= 1;
end
else if(in_money == ‘d20) begin
out_money <= 10;
out_goods <= 1;
end
else
begin
out_money <= out_money;
out_goods <= out_goods;
end
s2: if(in_money == ‘d5) begin
out_money <= 0;
out_goods <= 1;
end
else if(in_money == ‘d10) begin
out_money <= 5;
out_goods <= 1;
end
else if(in_money == ‘d20) begin
out_money <= 0;
out_goods <= 2;
end
else
begin
out_money <= out_money;
out_goods <= out_goods;
end
endmodule