汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
汉诺塔游戏规则简单,对外部要求不高,不仅能增强思维能力,而且能提高智力,在休闲中使自己得到真正的长进。
使用Verilog HDL 以及VHDL语言,运用FPGA中的VGA显示原理以及键盘控制原理,开发汉诺塔简易游戏,力争使程序短小精悍,简洁明了,游戏界面美观,容易操作,功能丰富,趣味性强。
首先,需要为这个游戏建立一个“地图”,确定底座、塔、圆盘以及确认点的位置,这个地图实际就是一个坐标系,为了方便,我们使用了固定(640*480)的地图。分析计算后,通过像素点的坐标确认好每个元素的位置以及所有可能出现的情况。比如,一个指定区域本来显示一个圆盘,然而当人为控制其向上、向下、向左或向右移动后,就要转换成空地,各个状态之间的转移关系并不复杂,在这里不再一一赘述。
1模块控制
其次,需要记录每一个圆盘的当前坐标和键盘的信息,因为地图上每块区域的改变都是由键盘控制圆盘的移动引起的,故而需要记录其位置。除此之外,还需要一个控制点用来指定当前需要移动圆盘所在塔的位置。
2VGA显示控制
最后,我们考虑了整个界面如何被显示出来。实际上这个问题非常简单,只要显示模块将指定的坐标数据读出来,将不同的颜色分配到指定的区域,转换成VGA信号,并在显示器的相应位置显示出来就可以了。
经过以上分析,整个游戏的逻辑结构已经基本上清晰了,下面我们将根据这个来进行系统的设计。
1.详细设计程序
输入输出信号:
2.功能描述
接收滤波键盘产生的数据,提取扫描码,对接收来的数据区分是通码还是断码,并向信号转换模块传送。
3.模块封装
信号转换模块
1.详细设计程序
输入输出信号:
2.功能描述
接受信号输入模块传送来的键盘通码或断码,对其判断当前操作是向左?向?向上?还是向下?将操作信号转换为信号kb(“1”表示键盘向上,“2”表示键盘向下,“3”表示键盘向左,“4”表示键盘向右),并将信号kb传送给核心控制模块。
3.模块封装
3.2.3核心控制模块
1.详细设计程序
输入输出信号:
2.功能描述
接收的信号kb判断键盘的操作(上下左右),根据当前操作改变指定圆盘的位置,并将位置信号传递给VGA显示模块。
3.模块封装
VGA显示模块
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.模块封装