题解 | #游戏机计费程序#
游戏机计费程序
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

