题解 | #游戏机计费程序#
游戏机计费程序
https://www.nowcoder.com/practice/50188fb7e23b4eee86f8c463c8284f5e
`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) remain<=0; else begin if(set)remain<=money+remain; else begin if(remain==0 | (remain==1&boost)) remain<=0; else begin if(boost) remain<=remain-2; else remain<=remain-1; end end end end reg [2:0]cs,ns; parameter idle=0,s0=1,s1=2,s2=3,s3=4; always@(posedge clk or negedge rst_n)begin if(!rst_n)cs<=idle; else cs<=ns; end always@(*)begin if(!rst_n)ns=idle; else begin case(cs) idle:begin if(remain>=10)ns=s0; else if(remain==1 & boost)ns=s3; else if(remain>0 & remain<10)ns=s1; else ns=idle; end s0:begin if(remain>=10)ns=s0; else if(remain>0 & remain<10)ns=s1; end s1:begin if(remain>=10)ns=s0; else if(remain==0)ns=s2; else if(remain==1 & boost)ns=s3; else ns=s1; end s2:begin ns=idle; end s3: ns=idle; endcase end end always@(posedge clk or negedge rst_n)begin if(!rst_n)begin yellow<=0; red<=0; end else begin case(ns) idle:begin yellow<=0; red<=1; end s0:begin yellow<=0; red<=0; end s1:begin yellow<=1; red<=0; end s2:begin yellow<=0; red<=1; end s3:begin yellow<=1; red<=1; end endcase end end endmodule