`timescale 1ns/1ns
module game_count
(
input rst_n, //异位复位信号,低电平有效
input clk, //时钟信号
input [9:0]money,
input set,
input boost,
output reg[9:0]remain,
output reg yellow,
output reg red
);
parameter IDLE = 2'd0;
parameter normal = 2'd1;
parameter upgrade = 2'd2;
parameter over = 2'd3;
reg [1:0] state,nstate;
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
state <= IDLE;
end
else begin
state <= nstate;
end
end
always @(*)(1444584) begin
case(state)
IDLE : begin
nstate = (money != 10'd0) ? normal : IDLE;
end
normal : begin
nstate = (remain == 10'd1) ? over :
(boost == 1'b1) ? upgrade : normal;
end
upgrade : begin
nstate = (remain == 10'd2) ? over : upgrade;
end
over : begin
if(set)
nstate = (money == 10'd0) ? over : IDLE;
else
nstate = over;
end
default : begin
nstate = IDLE;
end
endcase
end
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
remain <= 10'd0;
end
else if(set) begin
remain <= remain + money;
end
else begin
case(nstate)
IDLE : remain <= remain;
normal : remain <= remain - 1'd1;
upgrade : remain <= remain - 2'd2;
over : remain <= 10'd0;
default : remain <= 10'd0;
endcase
end
end
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
yellow <= 1'd0;
red <= 1'd0;
end
else begin
case(state)
IDLE: begin
yellow <= (remain > 10'd1 && remain < 10'd11) ? 1'b1 : 1'b0;
red <= (remain == 10'd0) ? 1'b1 : 1'b0;
end
normal: begin
yellow <= (remain > 10'd1 && remain < 10'd11) ? 1'b1 : 1'b0;
red <= (remain == 10'd1) ? 1'b1 : 1'b0;
end
upgrade: begin
yellow <= (remain > 10'd2 && remain < 10'd12) ? 1'b1 : 1'b0;
red <= (remain == 10'd2) ? 1'b1 : 1'b0;
end
over : begin
yellow <= 1'b0;
red <= 1'b1;
end
default : begin
yellow <= 1'b0;
red <= 1'b0;
end
endcase
end
end
endmodule