输入序列连续的序列检测_牛客题霸_牛客网序列检测VL25 输入序列连续的序列检测已做请编写一个序列检测模块检测输入信号a是否满足01110001序列当信号满足该序列给出指示信号match。模块的接口信号图如下模块的时序图如下请使用Verilog HDL实现以上功能并编写testbench验证模块的功能输入描述clk系统时钟信号rst_n异步复位信号低电平有效a单比特信号待检测的数据输出描述match当输入信号a满足目标序列该信号为1其余时刻该信号为0状态机实现timescale 1ns/1ns module sequence_detect( input clk, input rst_n, input a, output reg match ); reg[3:0] present_state,next_state; parameter s04b0000,s14b0001,s24b0010,s34b0011,s44b0100,s54b0101,s64b0110,s74b0111,s84b1000; //寄存器 always(posedge clk or negedge rst_n) begin if(!rst_n) present_states0; else present_statenext_state; end //状态转移 always(*) begin case(present_state) s0:if(a0) next_states1; else next_states0; s1:if(a1) next_states2; else next_states1; s2:if(a1) next_states3; else next_states1; s3:if(a1) next_states4; else next_states1; s4:if(a0) next_states5; else next_states0; s5:if(a0) next_states6; else next_states2; s6:if(a0) next_states7; else next_states2; s7:if(a1) next_states8; else next_states1; s8:if(a1) next_states3; else next_states1; default: next_states0; endcase end //输出模块 always (posedge clk or negedge rst_n) begin if (!rst_n) match 1b0; else match (present_state s8); end endmodule或者使用独热码testbenchtimescale 1ns/1ns module testbench(); reg clk, rst_n; reg a; wire match; // 时钟独立生成不会死循环 always #1 clk ~clk; // 激励 结束仿真关键必须有 $finish否则超时 initial begin $dumpfile(out.vcd); $dumpvars(0, testbench); // 初始化 clk 0; rst_n 0; a 0; // 复位 #2; rst_n 1; // 正确序列0 1 1 1 0 0 0 1让状态机走到 s8输出 match #2; a 0; #2; a 1; #2; a 1; #2; a 1; #2; a 0; #2; a 0; #2; a 0; #2; a 1; // 保持一下 #10; // 结束仿真解决超时的核心 $finish; end // 例化 sequence_detect dut( .clk(clk), .rst_n(rst_n), .a(a), .match(match) ); endmodule“移位寄存器 组合逻辑”实现使用一个 8 位移位寄存器shift_reg每个时钟上升沿将输入a移入最低位左移。经过 8 个时钟后寄存器内容即为最近 8 个输入的历史。组合逻辑比较shift_reg是否等于目标序列8b01110001相等时match输出高电平timescale 1ns/1ns module sequence_detect ( input clk, input rst_n, input a, output reg match ); localparam Q8b01110001; reg [7:0] shift_reg; // 移位寄存器 always (posedge clk or negedge rst_n) begin if (!rst_n) shift_reg 8b0; else shift_reg {shift_reg[6:0], a}; // 左移新数据放入 LSB end // 组合逻辑输出匹配信号 always(posedge clk,negedge rst_n) begin if(!rst_n) match1b0; else match (shift_reg Q ); end endmodule计数器状态计数法用一个 4 位计数器cnt0~8表示当前已连续匹配的序列长度。每个时钟根据当前cnt和输入a决定下一cnt本质是简化版的状态机。当cnt 8时输出match 1并依据重叠规则跳转到下一状态。timescale 1ns/1ns module sequence_detect ( input clk, input rst_n, input a, output reg match ); reg [3:0] cnt, next_cnt; // 0~8 // 时序状态更新 always (posedge clk or negedge rst_n) begin if (!rst_n) cnt 4d0; else cnt next_cnt; end // 组合逻辑下一状态 always (*) begin case (cnt) 4d0: next_cnt (a 0) ? 4d1 : 4d0; 4d1: next_cnt (a 1) ? 4d2 : 4d1; 4d2: next_cnt (a 1) ? 4d3 : 4d1; 4d3: next_cnt (a 1) ? 4d4 : 4d1; 4d4: next_cnt (a 0) ? 4d5 : 4d0; 4d5: next_cnt (a 0) ? 4d6 : 4d2; 4d6: next_cnt (a 0) ? 4d7 : 4d2; 4d7: next_cnt (a 1) ? 4d8 : 4d1; 4d8: next_cnt (a 1) ? 4d3 : 4d1; default: next_cnt 4d0; endcase end // 输出 match组合逻辑检测到 cnt8 立即输出 always (posedge clk or negedge rst_n) begin if(!rst_n) match1b0; else match (cnt 4d8); end endmoduleVL26 含有无关项的序列检测已做请编写一个序列检测模块检测输入信号a是否满足011XXX110序列长度为9位数据前三位是011后三位是110中间三位不做要求当信号满足该序列给出指示信号match。程序的接口信号图如下程序的功能时序图如下请使用Verilog HDL实现以上功能并编写testbench验证模块的功能。 要求代码简洁功能完整。输入描述clk系统时钟信号rst_n异步复位信号低电平有效a单比特信号待检测的数据输出描述match当输入信号a满足目标序列该信号为1其余时刻该信号为0移位寄存器实现timescale 1ns/1ns module sequence_detect( input clk, input rst_n, input a, output reg match ); reg[8:0] shift_reg; always(posedge clk or negedge rst_n) begin if(!rst_n) shift_reg9b0; else shift_reg{shift_reg[7:0],a}; end always(posedge clk or negedge rst_n) begin if(!rst_n) match1b0; else match (shift_reg[8:6] 3b011) (shift_reg[2:0] 3b110); end endmodulematch是在shift_reg完整的下一拍拉高的所以用时序逻辑testbenchtimescale 1ns/1ns module testbench(); reg clk,rst_n; reg a; wire match; always #1 clk~clk; initial begin $dumpfile(out.vcd); $dumpvars(0, testbench); clk0;rst_n0;a0; #2 rst_n1; #2 a0; #2 a1; #2 a1; #2 a0; #2 a1; #2 a1; #2 a1; #2 a1; #2 a0; #10 $finish; end sequence_detect dut( .clk(clk), .rst_n(rst_n), .a(a), .match(match) ); endmodule这种采用移位寄存器实现的比较容易若采用状态机需考虑重复序列的比较复杂中间3位xxxVL27 不重叠序列检测已做请编写一个序列检测模块检测输入信号a是否满足011100序列 要求以每六个输入为一组不检测重复序列例如第一位数据不符合则不考虑后五位。一直到第七位数据即下一组信号的第一位开始检测。当信号满足该序列给出指示信号match。当不满足时给出指示信号not_match。模块的接口信号图如下模块的时序图如下请使用Verilog HDL实现以上功能要求使用状态机实现画出状态转化图。并编写testbench验证模块的功能。输入描述clk系统时钟信号rst_n异步复位信号低电平有效a单比特信号待检测的数据输出描述match当输入信号a满足目标序列该信号为1其余时刻该信号为0not_match当输入信号a不满足目标序列该信号为1其余时刻该信号为0用状态机实现timescale 1ns/1ns module sequence_detect( input clk, input rst_n, input data, output reg match, output reg not_match ); localparam s04b0000,s14b0001,s24b0010,s34b0011,s44b0100,s54b0101, f14b0110,f24b0111,f34b1000,f44b1001,f54b1010; reg[3:0] present_state,next_state; // always(posedge clk or negedge rst_n) if(!rst_n) present_states0; else present_statenext_state; // always(*) case(present_state) s0:next_statedata?f1:s1; s1:next_statedata?s2:f2; s2:next_statedata?s3:f3; s3:next_statedata?s4:f4; s4:next_statedata?f5:s5; s5:next_states0; f1:next_statef2; f2:next_statef3; f3:next_statef4; f4:next_statef5; f5:next_states0; default:next_states0; endcase // always(posedge clk or negedge rst_n) if(!rst_n) begin match0; not_match0; end else begin match(present_states5)(data0); not_match((present_states5)(data1)||present_statef5); end endmoduletestbenchtimescale 1ns/1ns module testbench(); reg clk,rst_n; reg data; wire match; wire not_match; initial begin $dumpfile(out.vcd); $dumpvars(0,testbench); clk 0; rst_n 0; data0; #2 rst_n1; #2 data1; #2 data1; #2 data1; #2 data0; #2 data0; // //#2 data0; #3 data1; #2 data0; #2 data0; #2 data1; #2 data1; #10 $finish; end always #1 clk !clk; sequence_detect dut( .clk(clk), .rst_n(rst_n), .data(data), .not_match(not_match), .match(match) ); endmoduleVL28 输入序列不连续的序列检测题目描述请编写一个序列检测模块输入信号端口为data表示数据有效的指示信号端口为data_valid。当data_valid信号为高时表示此刻的输入信号data有效参与序列检测当data_valid为低时data无效抛弃该时刻的输入。当输入序列的有效信号满足0110时拉高序列匹配信号match。模块的接口信号图如下模块的时序图如下请使用状态机实现以上功能画出状态转移图并使用Verilog HDL编写代码实现以上功能并编写testbench验证模块的功能.输入描述clk系统时钟信号rst_n异步复位信号低电平有效data单比特信号待检测的数据data_valid输入信号有效标志当该信号为1时表示输入信号有效输出描述match当输入信号data满足目标序列该信号为1其余时刻该信号为0时序逻辑VL29 信号发生器题目描述请编写一个信号发生器模块根据波形选择信号wave_choise发出相应的波形wave_choice0时发出方波信号wave_choice1时发出锯齿波信号wave_choice2时发出三角波信号。模块的接口信号图如下请使用Verilog HDL实现以上功能并编写testbench验证模块的功能输入描述clk系统时钟信号rst_n异步复位信号低电平有效wave_choise2比特位宽的信号根据该信号的取值不同输出不同的波形信号输出描述wave5比特位宽的信号根据wave_choise的值输出不同波形的信号VL30 数据串转并电路实现串并转换电路输入端输入单bit数据每当本模块接收到6个输入数据后输出端输出拼接后的6bit数据。本模块输入端与上游的采用valid-ready双向握手机制输出端与下游采用valid-only握手机制。数据拼接时先接收到的数据放到data_b的低位。电路的接口如下图所示。valid_a用来指示数据输入data_a的有效性valid_b用来指示数据输出data_b的有效性ready_a用来指示本模块是否准备好接收上游数据本模块中一直拉高clk是时钟信号rst_n是异步复位信号。输入描述input clk ,input rst_n ,input valid_a ,input data_a输出描述output reg ready_a ,output reg valid_b ,output reg [5:0] data_bVL31 数据累加输出实现串行输入数据累加输出输入端输入8bit数据每当模块接收到4个输入数据后输出端输出4个接收到数据的累加结果。输入端和输出端与上下游的交互采用valid-ready双向握手机制。要求上下游均能满速传输时数据传输无气泡不能由于本模块的设计原因产生额外的性能损失。电路的接口如下图所示。valid_a用来指示数据输入data_in的有效性valid_b用来指示数据输出data_out的有效性ready_a用来指示本模块是否准备好接收上游数据ready_b表示下游是否准备好接收本模块的输出数据clk是时钟信号rst_n是异步复位信号。输入描述input clk ,input rst_n ,input [7:0] data_in ,input valid_a ,input ready_b输出描述output ready_a ,output reg valid_b ,output reg [9:0] data_outVL32 非整数倍数据位宽转换24to128实现数据位宽转换电路实现24bit数据输入转换为128bit数据输出。其中先到的数据应置于输出的高bit位。电路的接口如下图所示。valid_in用来指示数据输入data_in的有效性valid_out用来指示数据输出data_out的有效性clk是时钟信号rst_n是异步复位信号。输入描述input clk ,input rst_n ,input valid_in ,input [23:0] data_in输出描述output reg valid_out ,output reg [127:0] data_outVL33 非整数倍数据位宽转换8to12实现数据位宽转换电路实现8bit数据输入转换为12bit数据输出。其中先到的数据应置于输出的高bit位。电路的接口如下图所示。valid_in用来指示数据输入data_in的有效性valid_out用来指示数据输出data_out的有效性clk是时钟信号rst_n是异步复位信号。波形示意图如下输入描述input clk ,input rst_n ,input valid_in ,input [7:0] data_in输出描述output reg valid_out,output reg [11:0] data_outVL34 整数倍数据位宽转换8to16实现数据位宽转换电路实现8bit数据输入转换为16bit数据输出。其中先到的8bit数据应置于输出16bit的高8位。电路的接口如下图所示。valid_in用来指示数据输入data_in的有效性valid_out用来指示数据输出data_out的有效性clk是时钟信号rst_n是异步复位信号输入描述input clk ,input rst_n ,input valid_in ,input [7:0] data_in输出描述output reg valid_out,output reg [15:0] data_outVL35 状态机-非重叠的序列检测设计一个状态机用来检测序列 10111要求1、进行非重叠检测 即101110111 只会被检测通过一次2、寄存器输出且同步输出结果注意rst为低电平复位信号示意图波形示意图输入描述输入信号 clk rst data类型 wire输出描述输出信号 flag类型 regVL36 状态机-重叠序列检测设计一个状态机用来检测序列 1011要求1、进行重叠检测 即10110111 会被检测通过2次2、寄存器输出在序列检测完成下一拍输出检测有效注意rst为低电平复位信号示意图波形示意图输入描述输入信号 clk rst data类型 wire输出描述输出信号 flag类型 regVL37 时钟分频偶数请使用D触发器设计一个同时输出2/4/8分频的50%占空比的时钟分频器注意rst为低电平复位信号示意图波形示意图输入描述输入信号 clk rst类型 wire输出描述输出信号 clk_out2 clk_out4 clk_out8类型 wireVL38 自动贩售机1设计一个自动贩售机输入货币有三种为0.5/1/2元饮料价格是1.5元要求进行找零找零只会支付0.5元。ps:投入的货币会自动经过边沿检测并输出一个在时钟上升沿到1在下降沿到0的脉冲信号注意rst为低电平复位信号示意图d1 0.5元d2 1元d3 2元out1 饮料out2 零钱波形示意图对应的激励源输入描述输入信号 clk rst d1 d2 d3类型 wire输出描述输出信号 out1 [1:0]out2类型 regVL39 自动贩售机2题目描述设计一个自动贩售机输入货币有两种为0.5/1元饮料价格是1.5/2.5元要求进行找零找零只会支付0.5元。ps:1、投入的货币会自动经过边沿检测并输出一个在时钟上升沿到1在下降沿到0的脉冲信号2、此题忽略出饮料后才能切换饮料的问题注意rst为低电平复位信号示意图d1 0.5d2 1sel 选择饮料out1 饮料1out2 饮料2out3 零钱波形示意图输入描述输入信号 clk rst d1 d2 sel类型 wire输出描述输出信号 out1 out2 out3类型 regVL40 占空比50%的奇数分频设计一个同时输出7分频的时钟分频器占空比要求为50%注意rst为低电平复位信号示意图波形示意图输入描述输入信号 clk_in rst类型 wire输出描述输出信号 clk_out7类型 wireVL41 任意小数分频请设计一个可以实现任意小数分频的时钟分频器比如说8.7分频的时钟信号注意rst为低电平复位提示其实本质上是一个简单的数学问题即如何使用最小公倍数得到时钟周期的分别频比。设小数为nn此处以8.7倍分频的时钟周期为例。首先由于不能在硬件上进行小数的运算比如2.1个时钟这种是不现实的也不存在3.3个寄存器小数分频不能做到分频后每个时钟周期都是源时钟的nn倍也无法实现占空比为1/2因此考虑小数分频其实现方式应当为53个clkout时钟周期是10个clkin时钟周期的8.7倍。信号示意图波形示意图输入描述输入信号 clk_in rst类型 wire输出描述输出信号 clk_out类型 wireVL42 无占空比要去的奇数分频题目描述请设计一个同时输出5分频的时钟分频器本题对占空比没有要求注意rst为低电平复位信号示意图波形示意图输入描述输入信号 clk_in rst类型 wire输出描述输出信号 clk_out5类型 wireVL43 根据状态转移写状态机-三段式题目描述如图所示为两种状态机中的一种请根据状态转移图写出代码状态转移线上的0/0等表示的意思是过程中data/flag的值。要求1、 必须使用对应类型的状态机2、 使用三段式描述方法输出判断要求要用到对现态的判断注意rst为低电平复位信号示意图波形示意图输入描述输入信号 clk rst data类型 wire输出描述输出信号 flag类型 regVL44 根据状态转移写状态机-二段式题目描述如图所示为两种状态机中的一种请根据状态转移图写出代码状态转移线上的0/0等表示的意思是过程中data/flag的值。要求1、 必须使用对应类型的状态机2、 使用二段式描述方法注意rst为低电平复位信号示意图波形示意图激励描述如下输入描述输入信号 clk rst data类型 wire输出描述输出信号 flag类型 reg跨时钟域传输VL45 异步FIFO请根据题目中给出的双口RAM代码和接口描述实现异步FIFO要求FIFO位宽和深度参数化可配置。电路的接口如下图所示双口RAM端口说明同步FIFO端口说明双口RAM代码如下可在本题答案中添加并例化此代码。module dual_port_RAM #(parameter DEPTH 16, parameter WIDTH 8)( input wclk ,input wenc ,input [$clog2(DEPTH)-1:0] waddr //深度对2取对数得到地址的位宽。 ,input [WIDTH-1:0] wdata //数据写入 ,input rclk ,input renc ,input [$clog2(DEPTH)-1:0] raddr //深度对2取对数得到地址的位宽。 ,output reg [WIDTH-1:0] rdata //数据输出 ); reg [WIDTH-1:0] RAM_MEM [0:DEPTH-1]; always (posedge wclk) begin if(wenc) RAM_MEM[waddr] wdata; end always (posedge rclk) begin if(renc) rdata RAM_MEM[raddr]; end endmodule输入描述input wclk ,input rclk ,input wrstn ,input rrstn ,input winc ,input rinc ,input [WIDTH-1:0] wdata输出描述output wire wfull ,output wire rempty ,output wire [WIDTH-1:0] rdataVL46 同步FIFO根据题目提供的双口RAM代码和接口描述实现同步FIFO要求FIFO位宽和深度参数化可配置。电路的接口如下图所示。端口说明如下表。双口RAM端口说明同步FIFO端口说明双口RAM代码如下可在答案中添加并例化此代码。module dual_port_RAM #(parameter DEPTH 16, parameter WIDTH 8)( input wclk ,input wenc ,input [$clog2(DEPTH)-1:0] waddr //深度对2取对数得到地址的位宽。 ,input [WIDTH-1:0] wdata //数据写入 ,input rclk ,input renc ,input [$clog2(DEPTH)-1:0] raddr //深度对2取对数得到地址的位宽。 ,output reg [WIDTH-1:0] rdata //数据输出 ); reg [WIDTH-1:0] RAM_MEM [0:DEPTH-1]; always (posedge wclk) begin if(wenc) RAM_MEM[waddr] wdata; end always (posedge rclk) begin if(renc) rdata RAM_MEM[raddr]; end endmodule输入描述input clk ,input rst_n ,input winc ,input rinc ,input [WIDTH-1:0] wdata输出描述output reg wfull ,output reg rempty ,output wire [WIDTH-1:0] rdataVL47 格雷码计数器实现4bit位宽的格雷码计数器。电路的接口如下图所示。输入描述input clk,input rst_n输出描述output reg [3:0] gray_outVL48 多bit MUX同步器在data_en为高期间data_in将保持不变data_en为高至少保持3个B时钟周期。表明当data_en为高时可将数据进行同步。本题中data_in端数据变化频率很低相邻两个数据间的变化至少间隔10个B时钟周期。电路的接口如下图所示。端口说明如下表所示。输入描述input clk_a ,input clk_b ,input arstn ,input brstn ,input [3:0] data_in ,input data_en输出描述output reg [3:0] dataoutVL49 脉冲同步电路从A时钟域提取一个单时钟周期宽度脉冲然后在新的时钟域B建立另一个单时钟宽度的脉冲。A时钟域的频率是B时钟域的10倍A时钟域脉冲之间的间隔很大无需考虑脉冲间隔太小的问题。电路的接口如下图所示。data_in是脉冲输入信号data_out是新的脉冲信号clk_fast是A时钟域时钟信号clk_slow是B时钟域时钟信号rst_n是异步复位信号。输入描述input clk_fast ,input clk_slow ,input rst_n ,input data_in输出描述output dataout计数器VL50 简易秒表请编写一个模块实现简易秒表的功能具有两个输出当输出端口second从1-60循环计数每当second计数到60输出端口minute加一一直到minute60暂停计数。模块的接口信号图如下模块的时序图如下请使用Verilog HDL实现以上功能并编写testbench验证模块的功能输入描述clk系统时钟信号rst_n异步复位信号低电平有效输出描述second6比特位宽秒表的秒读数minute6比特位宽秒表的分读数VL51 可置位计数器请编写一个十六进制计数器模块计数器输出信号递增每次到达0给出指示信号zero当置位信号set 有效时将当前输出置为输入的数值set_num。模块的接口信号图如下模块的时序图如下请使用Verilog HDL实现以上功能并编写testbench验证模块的功能输入描述clk时钟信号rst_n复位信号低电平有效set置位指示信号当该信号有效时表示将输出信号强制置为set_numset_num4比特信号当set信号有效时将该信号的数字赋予输出信号number输出描述zero过零指示信号当number计数到0时该信号为1其余时刻为0number4比特位宽表示计数器的当前读数VL52 加减计数器请编写一个十进制计数器模块当mode信号为1计数器输出信号递增当mode信号为0计数器输出信号递减。每次到达0给出指示信号zero。模块的接口信号图如下模块的时序图如下请使用Verilog HDL实现以上功能并编写testbench验证模块的功能输入描述clk系统时钟信号rst_n复位信号低电平有效mode模式选择信号当该信号为1计数器每个时钟加一为0则每个时钟减一。输出描述number4比特位宽计数器当前输出读数。zero过零指示信号当number为0时该信号为1其他时刻为0.存储器VL53 单端口RAM题目描述设计一个单端口RAM它有 写接口读接口地址接口时钟接口和复位存储宽度是4位深度128。注意rst为低电平复位信号示意图输入描述输入信号 enb, clk, rst addr w_data类型 wire在testbench中clk为周期5ns的时钟rst为低电平复位输出描述输出信号 r_data类型 wireVL54 RAM的简单实现实现一个深度为8位宽为4bit的双端口RAM数据全部初始化为0000。具有两组端口分别用于读数据和写数据读写操作可以同时进行。当读数据指示信号read_en有效时通过读地址信号read_addr读取相应位置的数据read_data并输出当写数据指示信号write_en有效时通过写地址信号write_addr 和写数据write-data向对应位置写入相应的数据。程序的信号接口图如下模块的时序图如下使用Verilog HDL实现以上功能并编写testbench验证。输入描述clk系统时钟信号rst_n异步复位信号低电平有效read_en,write_en单比特信号读/写使能信号表示进行读/写操作read_addr,write_addr8比特位宽的信号表示读/写操作对应的地址write_data4比特位宽的信号在执行写操作时写入RAM的数据输出描述read_data4比特位宽的信号在执行读操作时从RAM中读出的数据综合VL55 Johnson Counter请用Verilog实现4位约翰逊计数器扭环形计数器计数器的循环状态如下。电路的接口如下图所示。输入描述input clk ,input rst_n输出描述output reg [3:0] QVL56 流水线乘法器实现4bit无符号数流水线乘法器设计。电路的接口如下图所示。输入描述input clk ,input rst_n ,input [size-1:0] mul_a ,input [size-1:0] mul_b输出描述output reg [size*2-1:0] mul_outVL57 交通灯要求实现一个交通红绿灯具有红黄绿三个小指示灯和一个行人按钮正常情况下机动车道指示灯按照60时钟周期绿灯5个时钟周期黄灯10个时钟周期红灯循环。当行人按钮按下如果剩余绿灯时间大于10个时钟则缩短为10个时钟小于10个时钟则保持不变。注机动车道的指示灯和人行道指示灯应该是配对的当机动车道的灯为绿或者黄时人行道的灯为红当机动车道的灯为红时人行道的灯为绿为简便起见只考虑机动车道的指示灯。模块的信号接口图如下请使用VerilogHDL语言实现并编写testbench验证功能。输入描述clk系统时钟信号rst_n复位信号低电平有效pass_request行人按钮信号当该信号为1表示按钮按下如果剩余绿灯时间大于10个时钟则缩短为10个时钟小于10个时钟则保持不变。输出描述clock交通灯倒计时读数red该信号为1表示红灯亮为0表示红灯不亮yellow该信号为1表示黄灯亮为0表示黄灯不亮green该信号为1表示黄灯亮为0表示黄灯不亮VL58 游戏机计费程序要求实现一个游戏机计费模块某游戏机具有多个模式价格不同普通模式每分钟1元畅玩模式每分钟收费2元默认情况下为普通模式在boost按键按下之后进入畅玩模式。游戏机采用预付费模式输入端口money的数值为预付费用在set信号有效时将money的数值读入。输出端口remain的数值为剩余费用当费用小于10元时黄色信号灯yellow亮起。当费用不足时红色信号灯red亮起同时关闭电脑。在游戏过程中可以通过set端口续费。每次set信号有效将此时刻money的数值加到remain之中。注在程序中以每个时钟周期代表一分钟每个单位大小表示1元。模块的信号接口图如下请使用VerilogHDL语言实现并编写 testbench 验证功能。输入描述clk系统时钟信号rst_n复位信号低电平有效money10bit位宽的数据表示充值数额当set信号有效时将该信号的数值加到游戏余额remain中set充值信号当信号等于1表示用户充值。boost游戏机模式切换信号为1时表示进入畅玩模式每个时钟扣费2即remain减二为0时表示普通模式remain每个时钟减一。输出描述remain10bit位宽的数据表示余额根据充值数额和游戏模式变化yellow指示灯当remain大于0且小于10时为1。red指示灯当余额不足时为1其余时刻为0。