拔河游戏控制Verilog VIVADO

## 项目概述


**名称**:拔河游戏控制Verilog VIVADO  

**软件**:VIVADO  

**语言**:Verilog  

**代码功能**:实现基于FPGA的拔河游戏控制系统,包含按键消抖、游戏状态控制、LED显示控制和数码管显示功能。支持双人对战,通过按键控制LED灯移动方向,实现拔河比赛的模拟,包含计时和计分功能。


**代码实现思路**:采用模块化设计,顶层模块协调各子模块工作。使用状态机控制游戏流程,包括空闲、开始、左移、右移、胜利等状态。按键经过消抖处理后触发状态转换,LED灯阵列根据状态左右移动,数码管显示游戏时间和双方得分。

拔河.jpg

**代码结构**

- 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

    代码下载(付费可见):





    1、代码文件需要付费后才可见。
    2、支付问题请联系微信公众号客服。
    3、优质Verilog/VHDL代码资源,所见即所得。
    Verilog/VHDL资源下载 » 拔河游戏控制Verilog VIVADO

    注册为本站会员,充值100得150,详情咨询客服

    目前为止共有 *** 位优秀的会员加入! 立刻加入会员