現(xiàn)在小孩子玩的最多的玩具就是手機(jī)了,不禁感慨,我們小時候都是咋過來的,有個游戲機(jī),可以玩?zhèn)€貪吃蛇、俄羅斯方塊就不錯了。可以自己設(shè)計個貪吃蛇游戲玩玩,重溫童年的經(jīng)典,也讓現(xiàn)在小孩子知道,珍惜當(dāng)下美好的生活。
功能實現(xiàn)說明:
此游戲較為簡單,沒有設(shè)置多余障礙物,只設(shè)置了四周的墻壁,貪食蛇所吃的蘋果隨機(jī)刷新,當(dāng)蛇裝上墻壁或者自己的身體,游戲結(jié)束。
此游戲使用五個按鍵,利用Basys3上的按鈕,四個方向鍵,一個重新開始游戲按鈕,一個操作開關(guān)。使用7位數(shù)碼管進(jìn)行計分,每吃到一個蘋果分?jǐn)?shù)+1。使用VGA顯示游戲界面。
DIY動手指南:
Step1:材料準(zhǔn)備
硬件:
Basys3開發(fā)板
VGA連接線及VGA顯示器一臺
軟件平臺:Vivado2016.4
Step2:系統(tǒng)框架
系統(tǒng)主要由6部分組成,分別是按鍵輸入模塊、控制模塊、數(shù)據(jù)路徑模塊、隨機(jī)生成 模塊、VGA顯示模塊和數(shù)碼管顯示模塊。
Step3:程序設(shè)計
上圖是本程序的RTL級視圖。
下面我們對于各個模塊進(jìn)行分析。
1.鍵盤掃描
我們一共設(shè)置了五個按鍵,分別執(zhí)行up,down,left,right,restart這五個功能。
以up_key_press為例,介紹消抖的算法。
在每個時鐘高電平時并行執(zhí)行以下兩條語句
up_key_press<=0;
up_key_last<=0;
當(dāng)有按鍵按下時,每100ms(cnt=5_0000) last=up,last輸出比up滯后一個周期,若up_key_last==0&&up==1,則說明按鍵按下,press輸出置1。
2.控制模塊
當(dāng)打開開始開關(guān)并按下任意一個方向鍵時,游戲開始,當(dāng)游戲結(jié)束時閃爍5下,重新開始游戲。
3.數(shù)據(jù)路徑模塊
cube_x,cube_y表示一整條蛇身體各節(jié)的格坐標(biāo)。is_exist有16位,即蛇體最長為16*1格,每一位對應(yīng)一個格,1為該格顯示,0則不顯示(圖中虛框)。每吃下一個蘋果蛇長度增加1,相應(yīng)exist位置變?yōu)?。
蛇每次移動,對應(yīng)的cube[x] = cube[x+1],即后一位的身子會移動到前一位的位置,蛇頭根據(jù)按下的按鈕來判斷是撞到了墻,還是撞到了身子,還是移動到了下一個位置。
當(dāng)蛇頭和蘋果重合時,生成一個增加身長的信號,并在計數(shù)器上+1。
4.隨機(jī)生成模塊
采用偽隨機(jī)數(shù)的產(chǎn)生方法,比較笨拙。
每個時鐘周期random_num都在變,而我們吃下蘋果的時刻卻因走法、按鍵的時間等有所不同,所以不同時刻吃下蘋果后下一個蘋果出現(xiàn)的地方近似隨機(jī)~
5.VGA顯示模塊
使用640*480分辨率,需要分頻為25MHz的時鐘信號。
6.數(shù)碼管顯示模塊
當(dāng)有增長身長信號產(chǎn)生時,分?jǐn)?shù)也對應(yīng)增加,數(shù)碼管動態(tài)掃描顯示分?jǐn)?shù)。
Step4:演示