名稱:貪吃蛇游戲DE1SOC開(kāi)發(fā)板VGA貪食蛇游戲VHDL(代碼在文末下載)
軟件:Quartus II
語(yǔ)言:VHDL
代碼功能:
經(jīng)典貪食蛇游戲VGA
要求:
1、實(shí)現(xiàn)經(jīng)典的貪食蛇游戲。
2、通過(guò)4個(gè)按鍵控制蛇的方向。
3、果實(shí)可以隨機(jī)產(chǎn)生。
4、每吃到一次果實(shí),加一分,且蛇變長(zhǎng)。
5、使用VGA顯示游戲圖像。
本代碼采用分模塊設(shè)計(jì),包括:
- 蛇控制模塊
- 隨機(jī)信號(hào)產(chǎn)生模塊(果實(shí))
- 計(jì)分模塊
- 導(dǎo)航狀態(tài)機(jī)模塊
- 通用計(jì)數(shù)器模塊
- VGA控制模塊
- 主狀態(tài)機(jī)模塊
本代碼已在DE1-SOC開(kāi)發(fā)板驗(yàn)證,其他開(kāi)發(fā)板可以修改管腳適配,開(kāi)發(fā)板如下:
工程文件:
代碼編譯:
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時(shí)鐘 VGA_BLANK_N???:?OUT?STD_LOGIC;--VGA顏色信號(hào)有效控制信號(hào),高電平有效 ??????HS????????????:?OUT?STD_LOGIC;--行同步信號(hào) ??????VS????????????:?OUT?STD_LOGIC--場(chǎng)同步信號(hào) ???); 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; ??? --隨機(jī)信號(hào)產(chǎn)生模塊(果實(shí)) ???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; ??? --計(jì)分模塊 ???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; ??? --導(dǎo)航狀態(tài)機(jī)模塊 ???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; ??? --通用計(jì)數(shù)器模塊 ???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; ??? --主狀態(tài)機(jī)模塊 ???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;--按鍵低電平有效轉(zhuǎn)換為高電平有效 ??? ???--調(diào)用主狀態(tài)機(jī)模塊 ???MasterSTM?:?MasterStateMachine ??????PORT?MAP?( ?????????RESET?????????=>?RESET, ?????????CLOCK?????????=>?CLOCK, ?????????PUSH_BUTTONS??=>?NOT_PUSH_BUTTONS, ?????????SCORE_IN??????=>?Score, ?????????STATE_OUT?????=>?MasterState, ?????????SUICIDE_IN????=>?Suicide ??????); ??? ??? ???--調(diào)用導(dǎo)航狀態(tài)機(jī)模塊 ???NavSTM?:?NavigationStateMachine ??????PORT?MAP?( ?????????RESET?????????=>?RESET, ?????????CLOCK?????????=>?Gameclock, ?????????PUSH_BUTTONS??=>?NOT_PUSH_BUTTONS, ?????????STATE_OUT?????=>?NavState ??????); ??? ??? ???--調(diào)用隨機(jī)信號(hào)產(chǎn)生模塊(果實(shí)) ???RNDMWrp?:?RandomWrapper ??????PORT?MAP?( ?????????CLK???????????=>?CLOCK, ?????????RESET?????????=>?RESET, ?NEXT_apple????=>?ReachedTarget, ?????????MASTER_STATE??=>?MasterState, ?????????HORIZONTAL????=>?RandomAddrH, ?????????VERTICAL??????=>?RandomAddrV ??????); ??? ??? ???--調(diào)用通用計(jì)數(shù)器模塊 ???GameSpeed?:?GenericCounter ??????GENERIC?MAP?( ?????????COUNTER_WIDTH??=>?22, ?????????COUNTER_MAX????=>?4166667 ??????) ??????PORT?MAP?( ?????????CLK????????=>?CLOCK, ?????????RESET??????=>?'0', ?????????ENABLE_IN??=>?'1', ?????????TRIGG_OUT??=>?Gameclock ??????); ??? ??? ???--調(diào)用蛇控制模塊 ???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 ??????); ??? ??? ???--調(diào)用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 ??????); ??? ??? ???--調(diào)用計(jì)分模塊 ???ScoreCnt?:?ScoreCounter ??????PORT?MAP?( ?????????RESET???????????=>?RESET, ?????????GAMECLOCK???????=>?Gameclock, ?????????REACHED_TARGET??=>?ReachedTarget, ?????????CURRENT_SCORE???=>?Score ??????); ??? END?behave;
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=246