# 题目：节奏大师

⚠️提示：（推荐从功能1开始逐步实现，每一个功能个人独立验证正确后备份一个可用版本，再增量开发下一功能，确保验收时可以明确判断完成了哪些功能，每个同学只有一次验收机会，验收后视为结束考试。）

在SystemVerilog中，你可以使用线性反馈移位寄存器（LFSR）来实现一个随机数生成器。以下是一个简单的LFSR实现，它使用了always块来在时钟边沿更新寄存器的值，并使用了异或运算来生成新的位。

```Verilog
module LFSR_random_generator(
    input wire clk,// 时钟模块1M
    input wire reset,
    output wire [7:0] random_out
    );

// LFSR的反馈多项式为 x^8 + x^6 + x^5 + x^4 + 1
    reg [7:0] lfsr;
    always_ff @(posedge clk or posedge reset) begin
        if (reset) begin
            // 当复位信号为高时，将LFSR重置
            lfsr <= 8'b1;
        end else begin
            // 计算新的LFSR值
            lfsr <= {lfsr[6:0], lfsr[7] ^ lfsr[5] ^ lfsr[4] ^ lfsr[3]};
        end
    end

// 将LFSR的值输出作为随机数
assign random_out = lfsr;
endmodule
```

✏️功能介绍：实现一个基于节奏敲击的音乐游戏。系统使用LFSR生成随机序列，通过单个LED按固定节奏闪烁显示随机状态，玩家需要在LED点亮的正确时间窗口内按下微动开关进行击打。

## 功能1：基础序列显示

+ 使用LFSR模块生成8位随机序列。
+ 截取最高位作为待敲击的节拍显示信号（通过1位LED以2秒间隔动态显示）。
+ LED显示规则：LFSR最高位为'1'时LED点亮，为'0'时LED熄灭。
+ 每2秒更新一次LFSR状态并刷新LED显示。
+ 复位时LED强制熄灭；复位释放后开始随机节奏显示。

## 功能2：实时击中检测与提示

+ 添加1个微动开关作为击打输入设备；
+ 击中判定条件：当LED处于点亮状态时，检测到微动开关由按下到抬起动作视为击中；
+ 添加1个LED作为击中提示灯，当在该节奏区间内击中时，指示灯亮起，当切换到下一个节奏时，该LED熄灭，等待节奏被击中时再次亮起。
+ 复位时提示灯熄灭。

## 功能3：计分器
+ 增加第1个带译码器的数码管作为得分显示；
+ 得分范围：计分器遵循0-9循环计数规则，达到9分后循环回0重新计分；复位时得分清零（数码管显示"0"）；
+ 根据击中时机进行智能评级：Good（0-1秒内击中）：加1分；Perfect（1-2秒内击中）：加2分；未在2秒窗口期内击中或LED熄灭时击中：不计分；



