简介
这是一个使用VHDL语言实现的老虎机游戏,可在FPGA开发板上运行。游戏通过三个七段数码管显示滚动的数字,玩家通过按键控制数字的停止,当三个数字相同时即为获胜。
主要功能
-**数字滚动**:按下按键后,三个数码管以不同速度循环显示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 ISPORT (clk_in : IN STD_LOGIC;--50MHzrst_n : IN STD_LOGIC;--复位key : IN STD_LOGIC;--输入按键--S1SW0 : 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 ISPORT (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 ISPORT (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 ISPORT (clk : IN STD_LOGIC;data_1 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);--数字1data_2 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);--数字2data_3 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);--数字3bit_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_ctrlPORT MAP (clk_in => clk_in,--50MHzrst_n => rst_n,--复位key => key,--输入按键SW0 =>SW0 ,--作弊按键LED2 =>LED2 ,--作弊指示灯current_state => current_state,--当前状态data_1 => data_1,--数字1data_2 => data_2,--数字2data_3 => data_3--数字3);--数码管显示模块i_display : displayPORT MAP (clk => clk_in,data_1 => data_1,--数字1data_2 => data_2,--数字2data_3 => data_3,--数字3bit_select => bit_select,--数码管位选seg_select => seg_select --数码管段选);----赢了提示i_BEEP_ctrl : BEEP_ctrlPORT MAP (clk_in => clk_in,--50MHrst_n => rst_n,--复位current_state => current_state,--当前状态data_1 => data_1,--数字1data_2 => data_2,--数字2data_3 => data_3,--数字3BEEP => BEEP ----赢了提示);END behave;
493