简介
这是一个使用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?IS? ?PORT (? ? ? clk_in ?:?IN?STD_LOGIC;--50MHz? ? ? rst_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?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);--数字1data_2 ? ?:?IN?STD_LOGIC_VECTOR(3?DOWNTO?0);--数字2data_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;
307