自动售卖机 饮料15元,钱有5,10,20三种,考虑找零

 

 

 

 

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

 

posted @ 2021-09-09 10:33  Q强  阅读(299)  评论(0)    收藏  举报