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