项目概述
名称:拔河游戏控制Verilog VIVADO
软件:VIVADO
语言:Verilog
代码功能:实现基于FPGA的拔河游戏控制系统,包含按键消抖、游戏状态控制、LED显示控制和数码管显示功能。支持双人对战,通过按键控制LED灯移动方向,实现拔河比赛的模拟,包含计时和计分功能。
代码实现思路:采用模块化设计,顶层模块协调各子模块工作。使用状态机控制游戏流程,包括空闲、开始、左移、右移、胜利等状态。按键经过消抖处理后触发状态转换,LED灯阵列根据状态左右移动,数码管显示游戏时间和双方得分。
代码结构:
- bahe_game.v:顶层模块,实例化各子模块并连接信号
- bahe_ctrl.v:游戏控制核心,实现状态机和游戏逻辑
- display.v:数码管显示控制,处理时间和分数显示
- key_jitter.v:按键消抖模块,消除机械按键抖动
系统架构
```mermaid
graph TB
A[bahe_game.v] --> B[key_jitter.v]
A --> C[bahe_ctrl.v]
A --> D[display.v]
B --> E[按键消抖处理]
C --> F[游戏状态机]
C --> G[LED控制]
C --> H[计时计分]
D --> I[数码管显示]
```
模块功能详解
1. 顶层模块 (bahe_game.v)
作为系统入口,协调各模块工作,提供外部接口包括:
- 时钟和复位信号
- 玩家按键输入
- LED阵列输出
- 数码管显示输出
2. 游戏控制模块 (bahe_ctrl.v)
核心控制逻辑,实现6种游戏状态:
-空闲状态:等待游戏开始
-开始状态:游戏进行中,检测按键输入
-左移状态:玩家1按键,LED向左移动
-右移状态:玩家2按键,LED向右移动
-胜利状态:判断游戏胜负并计分
3. 显示控制模块 (display.v)
负责将游戏数据转换为数码管显示格式:
- 时间显示:分钟和秒钟
- 分数显示:双方得分
- 动态扫描显示技术
4. 按键消抖模块 (key_jitter.v)
消除机械按键的抖动现象,确保按键信号的稳定性。
游戏规则
1. 初始状态LED灯位于中间位置
2. 玩家通过按键控制LED灯移动方向
3. LED灯移动到最左端,玩家1获胜
4. LED灯移动到最右端,玩家2获胜
5. 游戏过程中实时显示时间和得分
技术特点
-时钟频率:100MHz系统时钟
-计时精度:1秒计时精度
-显示方式:15个LED灯阵列 + 4位数码管
-消抖技术:20位计数器实现按键消抖
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
部分代码预览
module bahe_ctrl( input clk_100M,//标准时钟,100MHz input reset_n,//复位信号,低有效 input restart,//裁判控制重新开始 input player_1,//选手1 input player_2,//选手2 output [14:0] led,//15个led output reg [7:0] minute_time,//游戏时间分钟 output reg [7:0] second_time,//游戏时间秒 output reg [7:0] score_1,//选手1分数 output reg [7:0] score_2//选手2分数 ); parameter s_idle=3'd0; parameter s_start=3'd1; parameter s_left_shift=3'd2; parameter s_right_shift=3'd3; parameter s_win_1=3'd4; parameter s_win_2=3'd5; reg [2:0] state=3'd0; reg [14:0] game_led=15'b000000010000000; assign led=game_led; always@(posedge clk_100M) if(!reset_n) state<=s_idle; else case(state) s_idle://复位状态 if(restart) state<=s_start; else state<=s_idle; s_start: if(game_led==15'b100000000000000) state<=s_win_1;//1号赢 else if(game_led==15'b000000000000001) state<=s_win_2;//2号赢 else if(player_1) state<=s_left_shift;//led左移 else if(player_2) state<=s_right_shift;//led右移 else state<=s_start; s_left_shift: state<=s_start;//led左移 s_right_shift: state<=s_start;//led右移 s_win_1: if(restart) state<=s_start;//重新开始 else state<=s_win_1;//1号赢 s_win_2: if(restart) state<=s_start;//重新开始 else state<=s_win_2;//2号赢 default:; endcase
代码下载(付费可见):
824