题解 | #自动售卖机#
自动售卖机
https://www.nowcoder.com/practice/487953e6d3e3434988e0dd6960b6c9f8
`timescale 1ns/1ns
module sale(
input clk ,
input rst_n ,
input sel ,//sel=0,5$dranks,sel=1,10&=$drinks
input [1:0] din ,//din=1,input 5$,din=2,input 10$
output reg [1:0] drinks_out,//drinks_out=1,output 5$ drinks,drinks_out=2,output 10$ drinks
output reg change_out
);
localparam IDLE = 3'd0;
localparam A1 = 3'd1;
localparam A2 = 3'd2;
localparam B1 = 3'd3;
localparam B2 = 3'd4;
localparam B3 = 3'd5;
reg [2:0] state, nxt_state;
wire [2:0] change = {sel,din};
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
state <= IDLE;
else
state <= nxt_state;
end
always@(*)begin
case(state)
IDLE: begin
case(change)
3'b101:nxt_state <= B1;
3'b110:nxt_state <= B2;
3'b100:nxt_state <= IDLE;
3'b000:nxt_state <= IDLE;
3'b001:nxt_state <= A1;
3'b010:nxt_state <= A2;
default:nxt_state <=IDLE;
endcase
end
B1:begin
case(change)
3'b100:nxt_state <= B1;
3'b101:nxt_state <= B2;
3'b110:nxt_state <= B3;
endcase
end
B2:begin
case(change)
3'b101:nxt_state <= B1;
3'b110:nxt_state <= B2;
default:nxt_state <= IDLE;
endcase
end
B3: begin
case(change)
3'b101:nxt_state <= B1;
3'b110:nxt_state <= B2;
default:nxt_state <= IDLE;
endcase
end
A1: begin
case(change)
3'b001:nxt_state <= A1;
3'b010:nxt_state <= A2;
default:nxt_state <= IDLE;
endcase
end
A2:begin
case(change)
3'b001:nxt_state <= A1;
3'b010:nxt_state <= A2;
default:nxt_state <= IDLE;
endcase
end
endcase
end
always@(*)begin
if(state == B3 ||state == B2)
drinks_out <= 2'b10;
else if(state == A1 || state == A2)
drinks_out <= 2'b01;
else
drinks_out <= 0;
end
always@(*)begin
if(state == B3 || state == A2)
change_out<=1;
else
change_out <= 0;
end
endmodule