Step1: 系统结构,各模块连接图如下

Push_Box_CTL: 游戏控制模块,控制游戏状态的转变。 Push_Box_Key: 按键输入消抖和延迟处理模块 Push_Box_window: 游戏各环节界面显示及是否可以移动的冲突处理。 Push_Box_Move: 人和箱子移动位置更新模块 Push_Box_RAM: 游戏初始界面的数据存储 Push_Box_VGA: vga 显示的接口标准设置及显示驱动模块

Step2: Push_Box_CTL 模块

采用有限状态机 FSM(Finite State Machine),控制各环节的状态转变。 当 game_start 信号给出后,进入 Initial 初始界面。Start 每次按下会有 一个 cycle 的高电平信号,从而控制 initial 状态向 level_select 状态的改变, 及每个关卡的重新开始。进入 level_select 界面后,通过 select 的值,控制进 入哪一关卡。每一关结束后,拉高相应的 level_end 信号,进入下一关卡。所有 关卡结束后,进入 game_end 状态

Step3: Push_Box_RAM 和 Push_Box_Key 模块

Push_Box_RAM :
存储初始化界面的数据,当游戏开始后,在控制端有效的条件下,用 40M 的显示时钟 依次读取 RAM 中的值,赋给 GRB 的输出端。 RAM 一共可以存储 512 个数据,每个数据 1bit。 根据颜色需求,GRB 信号有选择的扩增和输出 RAM 中存储的数据。
Push_Box_Key:
程序中通过寄存器对系统时钟计数分频,产生 1M 的时钟,去延时读取按键 值。当检测到按键按下时,延时 1M 时钟周期,如果按键依旧按下,则认为出现 了按键上升沿。由此,可以经过延时避开抖动区,实现按键消抖

Step4: Push_Box_window

把界面显示需要的坐标值传给相应模块,人和箱子的初始化只占两个时钟周 期,在这两个周期里,初始化数据传给移动模块。墙和终点不需要移动,只需要 把二者的值直接传送给显示模块。 同时,始终监控人、箱子、墙和终点的位置,处理碰撞逻辑,判断人是否能 移动,以及所有箱子是否到达了终点。
采用组合逻辑判断各种碰撞条件。判断人是否能移动:人撞到墙的指示信号, 人撞到箱子的指示信号,箱子撞到墙的指示信号,箱子撞到箱子的指示信号。在 每个方向上,分别判断这些组合电路的高低电平值。人能移动的逻辑是 People_en = ~ (people_touch_wall && (people_touch_box && (box_touch_wall || box_touch_box) ) ) ; 箱子能移动的逻辑是 Box_en_up = people_en && ( people_x =box_x ) && (people_y = box_y – y_step) 并同时监控本关是否已经通过,通过的条件是所有的箱子都移动到了终点。

Step5: Push_Box_Move 和 Push_Box_VGA模块

Push_Box_Move :
搭建多级选择器电路,当接收到位置初始化信号或者 key_start 时,人和箱 子的初始中心坐标值被赋给当前值。初始化结束后,检测 key_up, key_down, key_left, key_right 的值,来控制人和箱子位置上的移动。 每次按键按下,人往相应方向移动一格。
Push_Box_VGA :
分辨率取 800*600,时序循环时钟采用 40M,由分频模块的 IP 产生。
VGA 接口及控制时序如下图所示,场同步信号 VSYNC 在每帧数据开始的时候
产生一个固定宽度的低脉冲,行同步信号 HSYNC 在每行开始的时候产生一个固定
宽度的低脉冲,数据在设定的行和列交汇处有效

评论