题解 | #游戏机计费程序#
游戏机计费程序
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,//切换为畅玩模式,boost==0为普通模式,boost==1为畅玩模式
output reg[9:0]remain,//剩余费用
output reg yellow,//剩余费用小于10元
output reg red//费用不足,关闭电脑
);
//黄灯
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
yellow <= 1'b0;
else if(remain < 10&&remain)
yellow <= 1'b1;
else
yellow <= yellow;
end
//红灯
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
red <= 1'b0;
else if((boost==0&&remain < 10'b1)||(boost==1&&remain < 10'd2))
red <= 1'b1;
else
red <= 1'b0;
end
//剩余费用
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
remain <= 10'b0;
else if(set)
remain <= remain + money;
else if(boost == 0)
remain <= remain - 1;
else if(boost == 1)
remain <= remain - 2;
else
remain <= remain;
end
endmodule
module game_count
(
input rst_n, //异位复位信号,低电平有效
input clk, //时钟信号
input [9:0]money,//预付费用
input set,//续费
input boost,//切换为畅玩模式,boost==0为普通模式,boost==1为畅玩模式
output reg[9:0]remain,//剩余费用
output reg yellow,//剩余费用小于10元
output reg red//费用不足,关闭电脑
);
//黄灯
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
yellow <= 1'b0;
else if(remain < 10&&remain)
yellow <= 1'b1;
else
yellow <= yellow;
end
//红灯
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
red <= 1'b0;
else if((boost==0&&remain < 10'b1)||(boost==1&&remain < 10'd2))
red <= 1'b1;
else
red <= 1'b0;
end
//剩余费用
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
remain <= 10'b0;
else if(set)
remain <= remain + money;
else if(boost == 0)
remain <= remain - 1;
else if(boost == 1)
remain <= remain - 2;
else
remain <= remain;
end
endmodule
`timescale 1ns/1ns module game_count ( input rst_n, //异位复位信号,低电平有效 input clk, //时钟信号 input [9:0]money,//预付费用 input set,//续费 input boost,//切换为畅玩模式,boost==0为普通模式,boost==1为畅玩模式 output reg[9:0]remain,//剩余费用 output reg yellow,//剩余费用小于10元 output reg red//费用不足,关闭电脑 ); //黄灯 always@(posedge clk or negedge rst_n) begin if(!rst_n) yellow <= 1'b0; else if(remain < 10&&remain) yellow <= 1'b1; else yellow <= yellow; end //红灯 always@(posedge clk or negedge rst_n) begin if(!rst_n) red <= 1'b0; else if((boost==0&&remain < 10'b1)||(boost==1&&remain < 10'd2)) red <= 1'b1; else red <= 1'b0; end //剩余费用 always@(posedge clk or negedge rst_n) begin if(!rst_n) remain <= 10'b0; else if(set) remain <= remain + money; else if(boost == 0) remain <= remain - 1; else if(boost == 1) remain <= remain - 2; else remain <= remain; end endmodule