FPGA 纯硬件俄罗斯方块:Verilog 模块化设计与综合验证

用 Verilog 在 FPGA 上从零实现一个完整的俄罗斯方块游戏——包括七种标准方块(I/O/T/S/Z/J/L)的旋转、左右移动、加速下落、行消除计分和数码管实时显示,全部硬件逻辑无需 CPU 参与。
一、模块化硬件架构
游戏逻辑被拆分为五个独立模块,各司其职、通过 Wrapper 统一协调:
- Keydebounce(按键消抖):用计数器过滤机械按键抖动,输出稳定按键状态
- Bitmap(网格管理):维护 32×16 位网格,处理方块下落、触底固定、行消除检测和满行计分
- BlockController(方块控制):生成随机方块、响应上下左右操作、执行旋转(4×4 位矩阵重排)
- Segwrapper(数码管驱动):状态机轮询 4 位数码管,动态刷新分数显示
- Wrapper(顶层调度):管理游戏状态(暂停/速度)、分发按键事件、生成下落节拍信号

二、关键设计细节
方块旋转:纯位操作
俄罗斯方块的旋转本质是 4×4 矩阵的顺时针转置。没有用查找表,直接用位重排实现:
// 4×4 方块顺时针旋转 90°
cur_blk_data <= {cur_blk_data[12], cur_blk_data[8], cur_blk_data[4], cur_blk_data[0],
cur_blk_data[13], cur_blk_data[9], cur_blk_data[5], cur_blk_data[1],
cur_blk_data[14], cur_blk_data[10], cur_blk_data[6], cur_blk_data[2],
cur_blk_data[15], cur_blk_data[11], cur_blk_data[7], cur_blk_data[3]};双层网格:动态方块 + 静态底图
Bitmap 模块维护两层网格:bitmap_l(当前下落方块的动态层)和 bitmap_h(已固定的静态层)。显示时两层做 OR 合并,触底时 bitmap_l 并入 bitmap_h:
reg [15:0] bitmap_h [31:0]; // 静态层:已固定的方块
reg [15:0] bitmap_l [31:0]; // 动态层:当前正在下落的方块
// 触底检测:bitmap_l 与 bitmap_h 的每一行按位与
assign cur_blk_act = (bitmap_l[31] == 16'b0) &&
((bitmap_h[1]&bitmap_l[0])==0) &&
((bitmap_h[2]&bitmap_l[1])==0) && ... ;计分系统:满行检测
用 32 路并行比较器检测满行数,一次性消行计分——消 1 行 1 分,消 4 行(Tetris)8 分:
assign full_row_num = (bitmap_h[0]==16'hffff) + (bitmap_h[1]==16'hffff) + ... (bitmap_h[31]==16'hffff);
case(full_row_num)
3'd1: game_score_r <= game_score_r + 1;
3'd2: game_score_r <= game_score_r + 2;
3'd3: game_score_r <= game_score_r + 4;
3'd4: game_score_r <= game_score_r + 8; // Tetris!
endcase

三、从仿真到综合
所有五个模块均通过了 ModelSim 功能仿真——按键消抖、方块移动旋转、触底固定、行消除计分、数码管扫描显示,全部验证无误。随后在 Vivado 中完成综合与布局布线,成功生成比特流文件。
这个项目的特别之处在于:没有 CPU、没有操作系统——游戏的所有逻辑(状态机、碰撞检测、计分)都由纯粹的组合逻辑和时序逻辑电路实现。这是从软件思维到硬件思维的一次完整转变。
Comments