简析

输入:money[9:0], set, boost
输出:remain, yellow, red

工作模式
set==1时,进行投币,money会添加到余额remain上。boost==0是普通模式,每个时钟周期消耗1元;boost==0是畅玩模式,每个时钟周期消耗2元。当余额不足时停止计费(余额小于对应模式的要求)。

    always@(posedge clk or negedge rst_n) begin
        if(~rst_n)
            remain <= 0;
        else if(boost)
            remain <= set     ? remain+money:
                      remain<2? remain:
                      remain-2;
        else
            remain <= set     ? remain+money:
                      remain<1? remain:
                      remain-1;
    end
       

指示灯
黄灯yellow在余额小于10元时亮起,余额归零时灭掉;红灯red在余额不足时亮起。

    always@(posedge clk or negedge rst_n) begin
        if(~rst_n) begin
            yellow <= 0;
            red    <= 0;
        end
        else begin
            yellow <= remain<10&&remain;
            red    <= boost? remain<2: remain<1;
        end
    end

代码

`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
);
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n) begin
            yellow <= 0;
            red    <= 0;
        end
        else begin
            yellow <= remain<10&&remain;
            red    <= boost? remain<2: remain<1;
        end
    end
    
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n) 
            remain <= 0;
        else if(boost)
            remain <= set     ? remain+money:
                      remain<2? remain: 
                      remain-2;
        else
            remain <= set     ? remain+money:
                      remain<1? remain: 
                      remain-1;
    end
endmodule