FPGA学习之基于MicroBlaze软核的推箱子游戏设计

来源:互联网 发布:网络快车功能 编辑:程序博客网 时间:2024/06/06 01:38

有不足或错误的地方还请大家指正

有一段时间没有做fpga的项目了,趁现在还有一丝丝映像,把之前做的一款推箱子小游戏项目写在这里。

经典的推箱子是一个来自日本的古老游戏,目的是在训练你的逻辑思考能力。在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。本次项目就是设计这样一款游戏。

硬件平台采用SPARTAN3,为了显示游戏界面,外接一块3.3v的12864液晶屏。由于推箱子逻辑相对比较复杂,用vhdl实现比较困难,因此我选择搭建一个MicroBlaze软核,简单来说,就是可以用C语言编程了。关于MicroBlaze软核这里不做进一步介绍,参考这里可以直接进行配置。本来以为按照这个过程配置会很简单,但在实际操作的过程中,遇到莫名其妙的问题:MicroBlaze例化元件与其他元件连线时,MicroBlaze例化元件的接口便会失去电气效果,出现无法通过代码控制硬件端口高低电平的现象。经过一段时间的摸索,发现在进行例化的过程中,不能对已经建好的管脚改动,否则会导致该管脚不可用。所以在例化管脚的过程中,必须在初始过程一次例化成功,不可以在后期添加,很蛋疼啊。。。


上图是系统整体的框架,由控制器、三态门和MicroBlaze软核例化得到的lcd12864器件组成。其中,控制器部分主要完成辅助功能,比如使用拨码开关进行选关操作、采用数码管显示当前关卡、用led进行倒计时操作以及按键输入来控制游戏人物的移动等等。三态门是数电里一个重要的模块,当端口进行输入时,需要将其输出设置为高阻态。因为液晶屏需要读写数据,所以这里采用三态门这一中间级。

entity three_state_gate isPort ( clk : in STD_LOGIC;data_in : in STD_LOGIC_VECTOR (7 downto 0);data_out : out STD_LOGIC_VECTOR (7 downto 0);data_inout : inout STD_LOGIC_VECTOR (7 downto 0);we : in STD_LOGIC_VECTOR(0 downto 0));end three_state_gate;architecture Behavioral of three_state_gate isbeginprocess(clk,we)beginif(clk'event and clk = '1') thenif(we = "1") thendata_inout <= data_in;  elsedata_out <= data_inout;data_inout <= "ZZZZZZZZ";end if;end if;end process;end Behavioral;
核心部分就是12864模块,这块通过C语言实现复杂的逻辑判断,以及液晶屏的显示控制,对于液晶屏的操作这里也不做介绍,网上有很多资料,这里用8x8的像素区域作为一个图形块,利用控制不同像素点01两种状态,构成人物、墙、箱子以及空地等元素,从而完成整个地图的显示。当捕获到按键输入时,更改相应位置的元素,从而更新地图,达到动态显示的效果。

不难看出,圆圈代表目标点,方块代表箱子。

整个工程文件戳这儿

原创粉丝点击