李 營(yíng),呂兆承,施 勇
俄羅斯方塊游戲是一款難易程度適中、操作方便的游戲,深受人們喜歡.常見(jiàn)的俄羅斯方塊硬件游戲多由專(zhuān)用集成芯片或者單片機(jī)設(shè)計(jì)實(shí)現(xiàn),而FPGA芯片具有高速并行計(jì)算、可編程,實(shí)現(xiàn)的游戲系統(tǒng)功能易拓展等特點(diǎn),鑒于此本文根據(jù)VGA時(shí)序顯示原理和俄羅斯方塊游戲工作原理,在QuartusⅡ13.1環(huán)境下利用Verilog硬件描述語(yǔ)言和層次化建模思想設(shè)計(jì)實(shí)現(xiàn)硬件俄羅斯方塊游戲系統(tǒng)[1].
本文俄羅斯方塊游戲系統(tǒng)選用Altera公司Cyclone V系列的5CSXFC6D6F31C6芯片設(shè)計(jì)實(shí)現(xiàn)相應(yīng)功能,由VGA顯示器、FPGA芯片等構(gòu)成.俄羅斯方塊游戲的規(guī)則是當(dāng)游戲開(kāi)始初始化后,隨機(jī)產(chǎn)生一個(gè)方塊,當(dāng)其下落過(guò)程中根據(jù)不同按鍵進(jìn)行操作,比如當(dāng)點(diǎn)擊旋轉(zhuǎn)按鈕時(shí)將方塊旋轉(zhuǎn),點(diǎn)擊LEFT_KEY時(shí)向左移動(dòng),一旦下落到底并且滿(mǎn)行時(shí)消除該行,當(dāng)最新方塊掉落行置頂時(shí)游戲結(jié)束.具體的游戲算法流程圖如圖1所示[2].
圖1 俄羅斯方塊游戲算法流程圖
采用自頂向下層次化建模思想設(shè)計(jì)實(shí)現(xiàn)俄羅斯方塊系統(tǒng)各功能模塊.系統(tǒng)的功能框圖如圖2所示.由圖2可知,系統(tǒng)底層包含:按鍵輸入處理模塊(key.v)、方塊移動(dòng)控制模塊(game_control.v)、數(shù)據(jù)路徑模塊(datapath.v)、游戲界面輸出模塊(merge.v)、VGA時(shí)序控制模塊(vga_top)[3].
圖2 系統(tǒng)設(shè)計(jì)思路和實(shí)現(xiàn)功能框圖
該模塊的功能是對(duì)輸入系統(tǒng)的各種控制信號(hào)進(jìn)行上升沿檢測(cè)及消抖,其接口框圖如圖3所示,圖中輸入按鍵UP_KEY、LEFT_KEY、RIGHT_KEY、DOWN_KEY分別用來(lái)控制方塊旋轉(zhuǎn)、方塊向左、向右、向下移動(dòng)[4],其對(duì)應(yīng)消抖后輸出信號(hào)為rotate、left、right、down.若UP_KEY按下1次,方塊旋轉(zhuǎn)1次,其他按鍵功能類(lèi)似,此處不再列出.
圖3 按鍵輸入處理模塊接口框圖
該模塊的功能是:①根據(jù)游戲規(guī)則定義了10個(gè)狀態(tài),并采用有限狀態(tài)機(jī)設(shè)計(jì)實(shí)現(xiàn)[5].②接收按鍵輸入處理模塊信號(hào),將其控制輸出后送至數(shù)據(jù)路徑模塊.
該模塊的狀態(tài)遷移圖如圖4所示.各狀態(tài)的含義如下:
圖4 系統(tǒng)狀態(tài)遷移圖
①空閑狀態(tài)S_idle:點(diǎn)擊系統(tǒng)復(fù)位按鍵rst_n后進(jìn)入該狀態(tài).
②新的俄羅斯方塊產(chǎn)生狀態(tài)S_new.
③保持狀態(tài)S_hold:在該狀態(tài)中計(jì)時(shí)到固定時(shí)間后,轉(zhuǎn)到下移狀態(tài)S_down狀態(tài);或者根據(jù)不同輸入信號(hào)指令轉(zhuǎn)到下移或者移動(dòng)狀態(tài).
④下移狀態(tài)S_down:判斷當(dāng)前俄羅斯方塊能否下移一格.若是則轉(zhuǎn)到S_remove_1狀態(tài),否則轉(zhuǎn)到S_shift狀態(tài).
⑤移動(dòng)狀態(tài)判斷S_move:判斷當(dāng)前俄羅斯方塊是否能夠按照按鍵信號(hào)進(jìn)行移動(dòng),若是轉(zhuǎn)到S_shift狀態(tài),若不是轉(zhuǎn)到S_remove_1狀態(tài).
⑥更新方塊坐標(biāo)狀態(tài)S_shift:更新俄羅斯方塊的坐標(biāo)信息,返回S_hold狀態(tài).
⑦更新屏幕狀態(tài)S_remove_1.
⑧消除行判斷狀態(tài)S_remove_2:重復(fù)判斷,若無(wú)可消除的行跳轉(zhuǎn)S_isdie狀態(tài).
⑨游戲結(jié)束判斷狀態(tài)S_isdie:若結(jié)束跳轉(zhuǎn)到S_stop,否則跳轉(zhuǎn)到S_new.
⑩清除屏幕狀態(tài)S_stop.
該模塊主要功能是:根據(jù)方塊移動(dòng)控制模塊給出的信號(hào),對(duì)方塊當(dāng)前的狀態(tài)進(jìn)行判斷,更新游戲背景[6].具體功能如下:
(1)游戲背景定義.背景R是24行10列的寄存器組,負(fù)責(zé)保存非活動(dòng)方塊坐標(biāo)(①所有之前下落的方塊;②下落后方塊消除之后的結(jié)果).背景R中任一位置,如方塊存在,則該位置為1,否則為0.
(2)數(shù)據(jù)交換.完成本模塊與方塊移動(dòng)控制模塊game_control間的控制.
(3)方塊模型定義.定義了七種形狀方塊模型,如圖5所示,圖中陰影部分為固定點(diǎn),即方塊旋轉(zhuǎn)時(shí)不變的格點(diǎn).
圖5 方塊模型示意圖
(4)方塊運(yùn)動(dòng).指活動(dòng)方塊的運(yùn)動(dòng),所謂活動(dòng)方塊為當(dāng)前下落中的方塊,通過(guò)活動(dòng)方塊坐標(biāo)表示.俄羅斯方塊的運(yùn)動(dòng)包括4種:①方塊隨機(jī)產(chǎn)生;②方塊旋轉(zhuǎn)、下落、向左、向右四種移動(dòng)方式;③方塊停止與消除由S_remove1和S_remove2兩個(gè)狀態(tài)完成.④死亡判定.該模塊的接口框圖如圖6所示,圖中各端口含義如下:
圖6 數(shù)據(jù)路徑模塊接口框圖
輸入端口.信號(hào)MOVE、DOWN、DIE、SHIFT、REMOVE_1、REMOVE_2、NEW、STOP、AUTODOWN、KEYBOARD等信號(hào)均連接方塊移動(dòng)控制模塊相應(yīng)輸出.
輸出端口.信號(hào)n、m指向當(dāng)前活動(dòng)方塊固定點(diǎn)位置.信號(hào)BLOCK[6:0]指方塊類(lèi)型,由7位編碼構(gòu)成.信號(hào)MOVE_ABLE、SHIFT_FINISH、DOWN_ABLE、REMOVE_2_FINISH分別連接方塊移動(dòng)控制模塊相應(yīng)信號(hào).M_OUT[239:0]指活動(dòng)和非活動(dòng)方塊數(shù)據(jù)在背景數(shù)據(jù)輸出.
該模塊主要完成游戲界面最終輸出功能,其接口框圖如圖7所示.圖中各端口的含義如下:游戲界面背景ROW為20行,COL為10列,即非活動(dòng)矩陣數(shù)據(jù)data_in[239:0],活動(dòng)方塊形狀數(shù)據(jù)shape[6:0],活動(dòng)方塊的固定點(diǎn)位置坐標(biāo)是x_pos[3:0]和y_pos[3:0],最終游戲界面數(shù)據(jù)data_out[ROW*COL-1:0],即data_out[199:0].
圖7 游戲輸出界面模塊接口框圖
該模塊的功能是接收游戲界面輸出模塊數(shù)據(jù),將結(jié)果通過(guò)VGA接口在顯示屏端顯示[7].其接口框圖如圖8所示.
圖8 VGA驅(qū)動(dòng)控制模塊接口框圖
圖中各端口的含義如下:
輸入端口.num[199:0]連接游戲輸出界面模塊的data_out[199:0]信號(hào).
輸出端口.紅色、綠色、藍(lán)色三基色信號(hào)分別指OUTRed[3:0]、OUTGreen[3:0]、OUTBlue[3:0].hsync_r和vsync_r分別是行、場(chǎng)同步 信 號(hào).圖 中VGA_BLANKn、VGA_SYNCn、DAC_CLK均是 其DE2-115的VGA驅(qū)動(dòng) 所需的3根 線(xiàn),其中VGA_BLANKn和VGA_SYNCn分別設(shè)置為1和0,DAC_CLK連接25MHz驅(qū)動(dòng)時(shí)鐘.
將上述各模塊連接完成后構(gòu)成頂層模塊,其核心代碼如下:
系統(tǒng)設(shè)計(jì)完成后生成的RTL圖如圖9所示,由圖可知各個(gè)功能模塊與圖2系統(tǒng)設(shè)計(jì)思路和功能框圖一致[1],說(shuō)明系統(tǒng)設(shè)計(jì)思路正確.
圖9 系統(tǒng)RTL圖
FPGA作為處理器讀取DE10開(kāi)發(fā)板鍵盤(pán)發(fā)送的按鍵信息后,通過(guò)VGA接口顯示俄羅斯方塊游戲運(yùn)行界面.系統(tǒng)通過(guò)start按鍵控制游戲開(kāi)始,通過(guò)其他四個(gè)按鍵分別控制方塊旋轉(zhuǎn)、向下、向左、向右移動(dòng).結(jié)果達(dá)到了系統(tǒng)設(shè)計(jì)要求,其硬件顯示效果如圖10所示[8].
圖10 硬件顯示效果圖
在640*480@60Hz的VGA分辨率下,基于Cyclone V系列 的5CSXFC6D6F31C6 FPGA芯片進(jìn)行了俄羅斯方塊系統(tǒng)硬件驗(yàn)證.文章提出的俄羅斯方塊游戲系統(tǒng)設(shè)計(jì)思路是利用FPGA芯片開(kāi)發(fā)游戲的有效嘗試,相對(duì)于傳統(tǒng)的硬件游戲系統(tǒng),本系統(tǒng)功能更易拓展,如添加PS2鍵盤(pán)、LCD液晶顯示等設(shè)備,系統(tǒng)有一定的工業(yè)應(yīng)用前景[9].
通化師范學(xué)院學(xué)報(bào)2022年2期