题解 | #自动贩售机2#
自动贩售机2
https://www.nowcoder.com/practice/298dec1c3dce45c881f3e53e02558828
`timescale 1ns/1ns
module seller2(
input wire clk ,
input wire rst ,
input wire d1 ,
input wire d2 ,
input wire sel ,
output reg out1,
output reg out2,
output reg out3
);
//*************code***********//
parameter idle = 7'b000_0001,
half = 7'b000_0010,
one = 7'b000_0101,
one_half = 7'b000_1000,
two = 7'b001_0000,
two_half = 7'b010_0000,
three = 7'b100_0000;
wire [1:0] pi_money={d2,d1};
reg [6:0] state, next_state;
always@(posedge clk or negedge rst) begin
if(!rst)
state <= idle;
else
state <= next_state;
end
always@(*) begin
if(sel) begin //饮料2,2.5元的
case(state) //d1表示投入0.5元,d2表示投入1元
idle: case(pi_money)
2'b01: next_state = half;
2'b10: next_state = one;
default: next_state = next_state;
endcase
half: case(pi_money)
2'b01: next_state = one;
2'b10: next_state = one_half;
default: next_state = next_state;
endcase
one: case(pi_money)
2'b01: next_state = one_half;
2'b10: next_state = two;
default: next_state = next_state;
endcase
one_half: case(pi_money)
2'b01: next_state = two;
2'b10: next_state = two_half;
default: next_state = next_state;
endcase
two : case(pi_money)
2'b01: next_state = two_half;
2'b10: next_state = three;
default: next_state = next_state;
endcase
two_half: next_state = idle;
three : next_state = idle;
default : next_state = idle;
endcase
end
else begin
case(state)
idle : case(pi_money)
2'b01: next_state = half;
2'b10: next_state = one;
default: next_state = next_state;
endcase
half : case(pi_money)
2'b01: next_state = one;
2'b10: next_state = one_half;
default: next_state = next_state;
endcase
one : case(pi_money)
2'b01: next_state = one_half;
2'b10: next_state = two;
default: next_state = next_state;
endcase
two : next_state = idle;
two_half: next_state = idle;
three : next_state = idle;
default : next_state = idle;
endcase
end
end
//注意:这种三段式输出要看next_state而不是state!
always@(posedge clk or negedge rst) begin
if(!rst) begin
out1 <= 1'b0;
out2 <= 1'b0;
out3 <= 1'b0;
end
else if(sel) begin //饮料2, 2.5元的
out1 <= 1'b0;
if(next_state == two_half) begin
out2 <= 1'b1;
out3 <= 1'b0;
end
else if(next_state == three) begin
out2 <= 1'b1;
out3 <= 1'b1;
end
else begin
out2 <= 1'b0;
out3 <= 1'b0;
end
end
else begin //饮料1, 1.5元的
out2 <= 1'b0;
if(next_state == one_half) begin
out1 <= 1'b1;
out3 <= 1'b0;
end
else if(next_state == two) begin
out1 <= 1'b1;
out3 <= 1'b1;
end
else begin
out1 <= 1'b0;
out3 <= 1'b0;
end
end
end
endmodule

