漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
漢諾塔遊戲規則簡單,對外部要求不高,不僅能增強思維能力,而且能提高智力,在休閒中使自己得到真正的長進。
使用Verilog HDL 以及VHDL語言,運用FPGA中的VGA顯示原理以及鍵盤控制原理,開發漢諾塔簡易遊戲,力爭使程式短小精悍,簡潔明瞭,遊戲介面美觀,容易操作,功能豐富,趣味性強。
首先,需要為這個遊戲建立一個「地圖」,確定底座、塔、圓盤以及確認點的位置,這個地圖實際就是一個座標系,為了方便,我們使用了固定(640*480)的地圖。分析計算後,通過畫素點的座標確認好每個元素的位置以及所有可能出現的情況。比如,一個指定區域本來顯示一個圓盤,然而當人為控制其向上、向下、向左或向右移動後,就要轉換成空地,各個狀態之間的轉移關係並不複雜,在這裡不再一一贅述。
其次,需要記錄每一個圓盤的當前座標和鍵盤的資訊,因為地圖上每塊區域的改變都是由鍵盤控制圓盤的移動引起的,故而需要記錄其位置。除此之外,還需要一個控制點用來指定當前需要移動圓盤所在塔的位置。
最後,我們考慮了整個介面如何被顯示出來。實際上這個問題非常簡單,只要顯示模組將指定的座標資料讀出來,將不同的顏色分配到指定的區域,轉換成VGA訊號,並在顯示器的相應位置顯示出來就可以了。
經過以上分析,整個遊戲的邏輯結構已經基本上清晰了,下面我們將根據這個來進行系統的設計。
1.詳細設計程式
輸入輸出訊號:
2.功能描述
接收濾波鍵盤產生的資料,提取掃描碼,對接收來的資料區分是通碼還是斷碼,並向訊號轉換模組傳送。
3.模組封裝
1.詳細設計程式
輸入輸出訊號:
2.功能描述
接受訊號輸入模組傳送來的鍵盤通碼或斷碼,對其判斷當前操作是向左?向?向上?還是向下?將操作訊號轉換為訊號kb(「1」表示鍵盤向上,「2」表示鍵盤向下,「3」表示鍵盤向左,「4」表示鍵盤向右),並將訊號kb傳送給核心控制模組。
3.模組封裝
1.詳細設計程式
輸入輸出訊號:
2.功能描述
接收的訊號kb判斷鍵盤的操作(上下左右),根據當前操作改變指定圓盤的位置,並將位置訊號傳遞給VGA顯示模組。
3.模組封裝
1.詳細設計程式
輸入輸出訊號:
圓盤顯示程式:
begin
if ((xpos>=pointx1)&&(xpos<=pointx2)&&(ypos>=pointy1)&&(ypos<=pointy2)) begin//圓點
r=pointr;
g=pointg;
b=pointb;
end
else if ((xpos>=towerax1)&&(xpos<=towerax2)&&(ypos>=toweray1)&&(ypos<=toweray2)) begin//塔a
r=towerar;
g=towerag;
b=towerab;
end
else if ((xpos>=towerbx1)&&(xpos<=towerbx2)&&(ypos>=towerby1)&&(ypos<=towerby2)) begin//塔b
r=towerbr;
g=towerbg;
b=towerbb;
end
else if ((xpos>=towercx1)&&(xpos<=towercx2)&&(ypos>=towercy1)&&(ypos<=towercy2)) begin//塔c
r=towercr;
g=towercg;
b=towercb;
end
else if ((xpos>=28)&&(xpos<=612)&&(ypos>=420)&&(ypos<=480)) begin//底座
r=fundr;
g=fundg;
b=fundb;
end
else if ((xpos>=145)&&(xpos<=161)&&(ypos>=80)&&(ypos<=420)) begin//l柱子
r=fundr;
g=fundg;
b=fundb;
end
else if ((xpos>=310)&&(xpos<=326)&&(ypos>=80)&&(ypos<=420)) begin//m柱子
r=fundr;
g=fundg;
b=fundb;
end
else if ((xpos>=478)&&(xpos<=494)&&(ypos>=80)&&(ypos<=420)) begin//r柱子
r=fundr;
g=fundg;
b=fundb;
end
else begin//背景全黑
r=8'b00000000;
g=8'b00000000;
b=8'b00000000;
end
end
2.功能描述
從核心控制模組接收圓盤的位置訊號,利用VGA顯示影象原理轉為RGB三色的訊號以及畫素點座標,連線顯示器顯示當前狀態。
3.模組封裝