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

基于VHDL的老虎机游戏机Quartus睿智开发板

12/23 14:36
813
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

# 基于VHDL的老虎机游戏机

## 简介

这是一个使用VHDL语言实现的老虎机游戏,可在FPGA开发板上运行。游戏通过三个七段数码管显示滚动的数字,玩家通过按键控制数字的停止,当三个数字相同时即为获胜。

详细功能:

 

用三位数码管显示0~7之间的数码,按下按钮,三个数码管循环显示,抬起按钮,显示停

止,当显示内容相同时为赢。

1.三个数码管循环显示的速度不同;

2.停止时的延迟时间也要不同;

*3.如果赢了游戏时,要有数码管或LED的花样显示或声音提示

 

### 主要功能

-**数字滚动**:按下按键后,三个数码管以不同速度循环显示0-7的数字。

-**按键控制**:松开按键后,三个数码管会依次延迟停止。

-**胜利判断**:当三个数码管显示的数字相同时,玩家获胜。

-**胜利提示**:获胜后会通过蜂鸣器发出声音提示。

-**作弊模式**:带有一个作弊开关,开启后可以保证获胜。

## 设计

### 软件与语言

-**软件**:Quartus II

-**语言**:VHDL

 

 

 

 

 

### 代码实现思路

项目采用自顶向下的模块化设计方法,将整个系统分为按键控制、数据显示、蜂鸣器控制和按键消抖等几个核心模块。

1.  **顶层模块 (`tiger_game.vhd`)**:作为设计的顶层,负责例化并连接各个子模块,实现模块间的信号交互。

2.  **数据控制模块 (`data_ctrl.vhd`)**:这是设计的核心,通过一个状态机来管理游戏流程。它处理按键输入,控制数字的滚动和停止,并包含一个作弊功能,在特定条件下强制让三个数字相同。

3.  **显示模块 (`display.vhd`)**:负责驱动三个七段数码管。它接收来自数据控制模块的三个数字,并通过动态扫描的方式将它们显示出来。

4.  **蜂鸣器控制模块 (`BEEP_ctrl.vhd`)**:在游戏胜利时(即三个数字相同且游戏状态为结束时),驱动蜂鸣器发出提示音。

5.  **按键消抖模块 (`key_jitter.vhd`)**:用于消除按键抖动,确保系统接收到稳定、单一的按键信号。

### 代码结构

-`tiger_game.vhd`: 顶层文件,连接了板级IO和各个子模块。

-`data_ctrl.vhd`: 游戏逻辑控制模块,包含状态机,负责生成和控制三个随机数。

-`display.vhd`: 数码管显示驱动模块,将三个数字动态显示在三个数码管上。

-`key_jitter.vhd`: 按键消抖模块,为系统提供稳定的按键信号。

-`BEEP_ctrl.vhd`: 蜂鸣器控制模块,在获胜时发出声音。

演示视频:

本代码已在以下开发板验证:

 

 

 

 

 

 

 

 

 

 

1、工程文件

 

2、程序文件

 

 

3、程序编译

 

4、RTL图

 

5、管脚分配

 

6、仿真图

 

整体仿真图

 

控制模块

 

蜂鸣器模块

 

数码管显示模块

 

部分代码展示

 

 

LIBRARY ieee;
   USE ieee.std_logic_1164.all;
--老虎机游戏
--用三位数码管显示0~7之间的数码,按下按钮,三个数码管循环显示,抬起按钮,显示停
--止,当显示内容相同时为赢。 
--1.三个数码管循环显示的速度不同; 
--2.停止时的延迟时间也要不同; 
--*3.如果赢了游戏时,要有数码管或LED的花样显示或声音提示(有作弊开关)
ENTITY tiger_game IS
   PORT (
      clk_in  : IN STD_LOGIC;--50MHz
      rst_n   : IN STD_LOGIC;--复位
      key     : IN STD_LOGIC;--输入按键--S1
SW0     : IN STD_LOGIC;--作弊按键--拨码
LED2    : OUT STD_LOGIC;--作弊指示灯
      bit_select             : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--数码管位选
      seg_select             : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--数码管段选
      BEEP    : OUT STD_LOGIC--赢了提示
   );
END tiger_game;
ARCHITECTURE behave OF tiger_game IS
--按键控制
   COMPONENT data_ctrl IS
      PORT (
         clk_in  : IN STD_LOGIC;
         rst_n   : IN STD_LOGIC;
         key     : IN STD_LOGIC;
   SW0     : IN STD_LOGIC;--作弊按键
   LED2    : OUT STD_LOGIC;--作弊指示灯
         current_state : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
         data_1  : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
         data_2  : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
         data_3  : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
      );
   END COMPONENT;
   
   ----赢了提示
   COMPONENT BEEP_ctrl IS
      PORT (
         clk_in  : IN STD_LOGIC;
         rst_n   : IN STD_LOGIC;
         current_state : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
         data_1  : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
         data_2  : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
         data_3  : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
         BEEP    : OUT STD_LOGIC
      );
   END COMPONENT;
   
--显示模块
COMPONENT display IS
   PORT (
      clk                    : IN STD_LOGIC;
 data_1  : IN STD_LOGIC_VECTOR(3 DOWNTO 0);--数字1
 data_2    : IN STD_LOGIC_VECTOR(3 DOWNTO 0);--数字2
 data_3  : IN STD_LOGIC_VECTOR(3 DOWNTO 0);--数字3
      
      bit_select             : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--数码管位选
      seg_select             : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)--数码管段选
   );
END COMPONENT;
   
   
   SIGNAL data_1        : STD_LOGIC_VECTOR(3 DOWNTO 0);
   SIGNAL data_2        : STD_LOGIC_VECTOR(3 DOWNTO 0);
   SIGNAL data_3        : STD_LOGIC_VECTOR(3 DOWNTO 0);
   SIGNAL current_state : STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
--按键控制
   i_data_ctrl : data_ctrl
      PORT MAP (
         clk_in         => clk_in,--50MHz
         rst_n          => rst_n,--复位
         key            => key,--输入按键
   SW0            =>SW0 ,--作弊按键
   LED2           =>LED2 ,--作弊指示灯
         current_state  => current_state,--当前状态
         data_1         => data_1,--数字1
         data_2         => data_2,--数字2
         data_3         => data_3--数字3
      );
   
   
   
--数码管显示模块
   i_display : display
      PORT MAP (
         clk     => clk_in,
         data_1  => data_1,--数字1
         data_2  => data_2,--数字2
         data_3  => data_3,--数字3
         bit_select    => bit_select,--数码管位选
         seg_select    => seg_select --数码管段选
      );
   
   
   ----赢了提示
   i_BEEP_ctrl : BEEP_ctrl
      PORT MAP (
         clk_in         => clk_in,--50MH
         rst_n          => rst_n,--复位
         current_state  => current_state,--当前状态
         data_1         => data_1,--数字1
         data_2         => data_2,--数字2
         data_3         => data_3,--数字3
         BEEP           => BEEP ----赢了提示
      );
   
END behave;

 

源代码获取(付费下载)

 

 

 

相关推荐