module vent (
input wire clk,
input wire rst_n,
input wire [1:0]in_money,
output reg [2:0]out_money,
output reg out_cola
);
parameter IDLE = 4'b0000,
S0 = 4'b0001,
S1 = 4'b0011,
S2 = 4'b0010,
S3 = 4'b0110,
S4 = 4'b0111,
S5 = 4'b0101,
S6 = 4'b0100;
reg [31:0]state;
//状态转移,可乐价格为3.5元
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
state <= IDLE;
end
else case (state)
IDLE:begin
if (in_money == 2'b00) begin
state <= S0;
end
else if (in_money == 2'd01) begin
state <= S1;
end
else if (in_money == 2'd11) begin
state <= IDLE;
end
else begin
state <= state;
end
end
S0:begin
if (in_money == 2'b00) begin
state <= S1;
end
else if (in_money == 2'd01) begin
state <= S2;
end
else if (in_money == 2'd11) begin
state <= IDLE;
end
else begin
state <= state;
end
end
S1:begin
if (in_money == 2'b00) begin
state <= S2;
end
else if (in_money == 2'd01) begin
state <= S3;
end
else if (in_money == 2'd11) begin
state <= IDLE;
end
else begin
state <= state;
end
end
S2:begin
if (in_money == 2'b00) begin
state <= S3;
end
else if (in_money == 2'd01) begin
state <= S4;
end
else if (in_money == 2'd11) begin
state <= IDLE;
end
else begin
state <= state;
end
end
S3:begin
if (in_money == 2'b00) begin
state <= S4;
end
else if (in_money == 2'd01) begin
state <= S5;
end
else if (in_money == 2'd11) begin
state <= IDLE;
end
else begin
state <= state;
end
end
S4:begin
if (in_money == 2'b00) begin
state <= S5;
end
else if (in_money == 2'd01) begin
state <= S6;
end
else if (in_money == 2'd11) begin
state <= IDLE;
end
else begin
state <= state;
end
end
S5:begin
if (in_money == 2'b00) begin
state <= S6;
end
else if (in_money == 2'd01) begin
state <= S6;
end
else if (in_money == 2'd11) begin
state <= IDLE;
end
else begin
state <= state;
end
end
S6:begin
if (in_money == 2'b00) begin
state <= S0;
end
else if (in_money == 2'd01) begin
state <= S1;
end
else if (in_money == 2'd11) begin
state <= IDLE;
end
else begin
state <= state;
end
end
default: state <= IDLE;
endcase
end
//结果输出
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
out_money <= 3'd0;//有7种退钱可能,用3位表示
out_cola <= 1'b0;
end
else case (state)
IDLE:begin
if (in_money == 2'b00) begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
else if (in_money == 2'd01) begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
else if (in_money == 2'd11) begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
else begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
end
S0:begin
if (in_money == 2'b00) begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
else if (in_money == 2'd01) begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
else if (in_money == 2'd11) begin
out_money <= 3'd1;//退0.5
out_cola <= 1'b0;
end
else begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
end
S1:begin
if (in_money == 2'b00) begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
else if (in_money == 2'd01) begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
else if (in_money == 2'd11) begin
out_money <= 3'd2;//退1
out_cola <= 1'b0;
end
else begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
end
S2:begin
if (in_money == 2'b00) begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
else if (in_money == 2'd01) begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
else if (in_money == 2'd11) begin
out_money <= 3'd3;//退1.5
out_cola <= 1'b0;
end
else begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
end
S3:begin
if (in_money == 2'b00) begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
else if (in_money == 2'd01) begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
else if (in_money == 2'd11) begin
out_money <= 3'd4;//退2
out_cola <= 1'b0;
end
else begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
end
S4:begin
if (in_money == 2'b00) begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
else if (in_money == 2'd01) begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
else if (in_money == 2'd11) begin
out_money <= 3'd5;//退2.5
out_cola <= 1'b0;
end
else begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
end
S5:begin
if (in_money == 2'b00) begin
out_money <= 3'd0;
out_cola <= 1'b1;
end
else if (in_money == 2'd01) begin
out_money <= 3'd1;//退0.5
out_cola <= 1'b1;
end
else if (in_money == 2'd11) begin
out_money <= 3'd6;//退3
out_cola <= 1'b0;
end
else begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
end
S6:begin
if (in_money == 2'b00) begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
else if (in_money == 2'd01) begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
else if (in_money == 2'd11) begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
else begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
end
default: begin
out_money <= 3'd0;
out_cola <= 1'b0;
end
endcase
end
endmodule