名称:贪吃蛇游戏DE1SOC开发板VGA贪食蛇游戏VHDL
软件:Quartus II
语言:VHDL
代码功能:
经典贪食蛇游戏VGA
要求:
1、实现经典的贪食蛇游戏
2、通过4个按键控制蛇的方向
3、果实可以随机产生
4、每吃到一次果实,加一分,且蛇变长
5、使用VGA显示游戏图像
本代码采用分模块设计,包括
蛇控制模块
随机信号产生模块(果实)
计分模块
导航状态机模块
通用计数器模块
VGA控制模块
主状态机模块
本代码已在DE1-SOC开发板验证,其他开发板可以修改管脚适配,开发板如下:
工程文件:
代码编译:
RTL图
管脚分配
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
代码下载:
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; use ieee.std_logic_arith.all; --贪食蛇游戏 ENTITY Snake IS PORT ( PUSH_BUTTONS : IN STD_LOGIC_VECTOR(3 DOWNTO 0);--方向键 CLOCK : IN STD_LOGIC;--50M RESET : IN STD_LOGIC;--haigh reset COLOUR_OUT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--332位--RGB颜色 VGA_CLK : OUT STD_LOGIC;--VGA时钟 VGA_BLANK_N : OUT STD_LOGIC;--VGA颜色信号有效控制信号,高电平有效 HS : OUT STD_LOGIC;--行同步信号 VS : OUT STD_LOGIC--场同步信号 ); END Snake; ARCHITECTURE behave OF Snake IS --蛇控制模块 COMPONENT SnakeControl IS PORT ( CLK : IN STD_LOGIC; GAMECLOCK : IN STD_LOGIC; ADDRH : IN STD_LOGIC_VECTOR(9 DOWNTO 0); ADDRV : IN STD_LOGIC_VECTOR(8 DOWNTO 0); COLOUR : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); REACHED_TARGET : OUT STD_LOGIC; MASTER_STATE : IN STD_LOGIC_VECTOR(1 DOWNTO 0); NAVIGATION_STATE : IN STD_LOGIC_VECTOR(1 DOWNTO 0); RAND_ADDRH : IN STD_LOGIC_VECTOR(7 DOWNTO 0); RAND_ADDRV : IN STD_LOGIC_VECTOR(6 DOWNTO 0); SCORE : IN STD_LOGIC_VECTOR(3 DOWNTO 0); SUICIDE : OUT STD_LOGIC ); END COMPONENT; --随机信号产生模块(果实) COMPONENT RandomWrapper IS PORT ( CLK : IN STD_LOGIC; RESET : IN STD_LOGIC; NEXT_apple : IN STD_LOGIC; MASTER_STATE : IN STD_LOGIC_VECTOR(1 DOWNTO 0); HORIZONTAL : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); VERTICAL : OUT STD_LOGIC_VECTOR(6 DOWNTO 0) ); END COMPONENT; --计分模块 COMPONENT ScoreCounter IS PORT ( RESET : IN STD_LOGIC; GAMECLOCK : IN STD_LOGIC; REACHED_TARGET : IN STD_LOGIC; CURRENT_SCORE : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END COMPONENT; --导航状态机模块 COMPONENT NavigationStateMachine IS PORT ( RESET : IN STD_LOGIC; CLOCK : IN STD_LOGIC; PUSH_BUTTONS : IN STD_LOGIC_VECTOR(3 DOWNTO 0); STATE_OUT : OUT STD_LOGIC_VECTOR(1 DOWNTO 0) ); END COMPONENT; --通用计数器模块 COMPONENT GenericCounter IS GENERIC ( COUNTER_WIDTH : INTEGER := 4; COUNTER_MAX : INTEGER := 9 ); PORT ( CLK : IN STD_LOGIC; RESET : IN STD_LOGIC; ENABLE_IN : IN STD_LOGIC; TRIGG_OUT : OUT STD_LOGIC; COUNT : OUT STD_LOGIC_VECTOR(COUNTER_WIDTH - 1 DOWNTO 0) ); END COMPONENT; --VGA控制模块 COMPONENT VGAWrapper IS PORT ( CLK : IN STD_LOGIC; MASTER_STATE : IN STD_LOGIC_VECTOR(1 DOWNTO 0); ADDRH : OUT STD_LOGIC_VECTOR(9 DOWNTO 0); ADDRV : OUT STD_LOGIC_VECTOR(8 DOWNTO 0); CIN : IN STD_LOGIC_VECTOR(7 DOWNTO 0); COUT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); VGA_CLK : OUT STD_LOGIC; VGA_BLANK_N : OUT STD_LOGIC; HS : OUT STD_LOGIC; VS : OUT STD_LOGIC ); END COMPONENT; --主状态机模块 COMPONENT MasterStateMachine IS PORT ( RESET : IN STD_LOGIC; CLOCK : IN STD_LOGIC; PUSH_BUTTONS : IN STD_LOGIC_VECTOR(3 DOWNTO 0); SCORE_IN : IN STD_LOGIC_VECTOR(3 DOWNTO 0); STATE_OUT : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); SUICIDE_IN : IN STD_LOGIC ); END COMPONENT; SIGNAL MasterState : STD_LOGIC_VECTOR(1 DOWNTO 0):="00"; SIGNAL NavState : STD_LOGIC_VECTOR(1 DOWNTO 0):=(others =>'0'); SIGNAL RandomAddrH : STD_LOGIC_VECTOR(7 DOWNTO 0):=(others =>'0'); SIGNAL RandomAddrV : STD_LOGIC_VECTOR(6 DOWNTO 0):=(others =>'0'); SIGNAL AddrH : STD_LOGIC_VECTOR(9 DOWNTO 0):=(others =>'0'); SIGNAL AddrV : STD_LOGIC_VECTOR(8 DOWNTO 0):=(others =>'0'); SIGNAL Colour : STD_LOGIC_VECTOR(7 DOWNTO 0):=(others =>'0'); SIGNAL ReachedTarget : STD_LOGIC:='0'; SIGNAL Score : STD_LOGIC_VECTOR(3 DOWNTO 0):=(others =>'0'); SIGNAL Gameclock : STD_LOGIC:='0'; SIGNAL Suicide : STD_LOGIC:='0'; SIGNAL COLOUR_OUT_buf : STD_LOGIC_VECTOR(7 DOWNTO 0):=(others =>'0'); SIGNAL HS_buf : STD_LOGIC:='0'; SIGNAL VS_buf : STD_LOGIC:='0'; SIGNAL NOT_PUSH_BUTTONS : STD_LOGIC_VECTOR(3 DOWNTO 0):=(others =>'0'); BEGIN --控制输出 COLOUR_OUT <= COLOUR_OUT_buf; HS <= HS_buf; VS <= VS_buf; NOT_PUSH_BUTTONS<= not PUSH_BUTTONS;--按键低电平有效转换为高电平有效 --调用主状态机模块 MasterSTM : MasterStateMachine PORT MAP ( RESET => RESET, CLOCK => CLOCK, PUSH_BUTTONS => NOT_PUSH_BUTTONS, SCORE_IN => Score, STATE_OUT => MasterState, SUICIDE_IN => Suicide ); --调用导航状态机模块 NavSTM : NavigationStateMachine PORT MAP ( RESET => RESET, CLOCK => Gameclock, PUSH_BUTTONS => NOT_PUSH_BUTTONS, STATE_OUT => NavState ); --调用随机信号产生模块(果实) RNDMWrp : RandomWrapper PORT MAP ( CLK => CLOCK, RESET => RESET, NEXT_apple => ReachedTarget, MASTER_STATE => MasterState, HORIZONTAL => RandomAddrH, VERTICAL => RandomAddrV ); --调用通用计数器模块 GameSpeed : GenericCounter GENERIC MAP ( COUNTER_WIDTH => 22, COUNTER_MAX => 4166667 ) PORT MAP ( CLK => CLOCK, RESET => '0', ENABLE_IN => '1', TRIGG_OUT => Gameclock ); --调用蛇控制模块 SnakeCtl : SnakeControl PORT MAP ( CLK => CLOCK, GAMECLOCK => Gameclock, ADDRH => AddrH, ADDRV => AddrV, COLOUR => Colour, REACHED_TARGET => ReachedTarget, MASTER_STATE => MasterState, NAVIGATION_STATE => NavState, RAND_ADDRH => RandomAddrH, RAND_ADDRV => RandomAddrV, SCORE => Score, SUICIDE => Suicide ); --调用VGA控制模块 VGAWrp : VGAWrapper PORT MAP ( CLK => CLOCK, MASTER_STATE => MasterState, ADDRH => AddrH, ADDRV => AddrV, CIN => Colour, COUT => COLOUR_OUT_buf, VGA_BLANK_N => VGA_BLANK_N, VGA_CLK => VGA_CLK, HS => HS_buf, VS => VS_buf ); --调用计分模块 ScoreCnt : ScoreCounter PORT MAP ( RESET => RESET, GAMECLOCK => Gameclock, REACHED_TARGET => ReachedTarget, CURRENT_SCORE => Score ); END behave;