# 题目：记忆训练游戏

⚠️提示：（推荐从功能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
```

✏️功能介绍：实现一个基于LED亮灭序列的记忆训练游戏。系统使用LFSR生成随机序列，通过4位LED显示记忆目标，玩家需通过拨码开关输入记忆结果，系统提供实时反馈和错误提示。

## 功能1：基础序列显示

+ 使用LFSR模块生成8位随机序列，截取高4位作为记忆序列，通过4位LED实时显示（高电平亮，低电平灭）。
+ 每组序列保持0.5秒显示时间。
+ 复位时所有LED熄灭；复位释放后，重新生成并显示新序列。

## 功能2：手动暂停和序列锁定

+ 添加1位微动开关用于控制序列更新；
+ 当检测到微动开关由按下到抬起动作时，随机序列停止更新；
+ 系统保存当前显示的序列作为记忆目标序列；
+ 复位后，保持功能1的复位要求；

## 功能3：序列校验与提示
+ 序列锁定后，记忆目标序列继续显示0.5秒，0.5秒后自动熄灭所有LED（隐藏记忆目标），隐藏后，玩家需凭记忆输入序列。
+ 添加4位拨码开关用于输入记忆序列；
+ 系统将拨码开关输入与保存的记忆目标序列进行比对。完全一致时点亮验证LED，不一致时LED熄灭。
+ 添加1个带译码器的数码管，实时显示错误位数。
+ 显示规则：数码管在序列锁定后即开始显示错误位数，完全正确显示"0"，1位错误显示"1"，2位错误显示"2"，以此类推（最多显示"4"）。