• 方案介绍
  • 相关推荐
申请入驻 产业图谱

拔河游戏控制Verilog VIVADO

09/22 08:46
346
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

项目概述

名称:拔河游戏控制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

代码下载(付费可见):

相关推荐