一、snake.v模块的输入信号和输出信号

 二、蛇身速度控制

蛇身速度控制可以用一个计数器实现,计数器计满的这个值代表蛇身移动的时间间隔,计数器满则蛇身进行移动。

根据SW[2:0]选择速度。速度分三个档,0.5s移动一次、0.25s移动一次和0.125s移动一次。

 当难度选择界面出现的时候,通过SW[2:0]三个开关进行速度的选择:

 

三、蛇吃到食物及长度增加

cube_x,cube_y表示一整条蛇身体各节的格坐标。第一节代表蛇头。

获取蛇头坐标:

蛇和食物的初始位置的代码:

 

 当蛇头和食物(苹果)重合时,代表蛇吃掉了一个食物,并生成一个增加身长的信号add_cube(这个在apple_generate.v模块中有讲解)。每吃下一个食物(苹果)蛇长度增加1,相应exist位置变为1。is_exist有16位,即蛇体最长为16*1格,每一位对应一个格,1为该格显示,0则不显示(图中虚框)。

 

每次add_cube信号被拉高,显示体长的变量cube_num增加一位,"is_exixt[cube_num]<=1",让第cube_num位"被显示出来":

四、蛇撞墙或撞自身

撞墙的判断:

将蛇头的坐标跟墙壁的坐标进行比较,重合则说明撞墙。

 

撞自身的判断:

 当蛇头的坐标跟身体的某一节坐标相同,代表蛇咬到了自己。

五、蛇身整体移动路径

蛇身和蛇头一起移动。

蛇头根据按下的按钮来判断是撞到了墙,还是撞到了身子,还是移动到了下一个位置。

蛇身每次移动,后一位的身子会移动到前一位的位置(比如第0个块的坐标赋给第1块,第1块的坐标赋给第2块......)。

 

对应的代码如下:

 

六、蛇身方向控制(状态机)

参考笔记:友晶科技FPGA开发板实现贪吃蛇游戏(八)——游戏控制之状态机设计 DE10-STANDARD、DE1-SOC、DE2-115

key0-key3控制着蛇 的方向: 上下左右, 因为不管是DE2-115  DE1-SOC DE10-Standard  这三个板子的按键 都是有硬件去抖动的, 所以我们不需要额外添加去抖动电路的设计,直接将key 的值拿来使用。

七、蛇色块显示

 当像素坐标pos_x[9:4]和pos_y[9:4]与蛇的坐标吻合时,VGA显示器显示蛇身,蛇头等。

不过这样显示的蛇身是一整块的,蛇的每一节没有分开,不好分辨当前蛇到底长到多少节, 所以接下来,我们来做个记号,让蛇的每一节第一个像素和第一个像素下面的一个像素显示黑色,这样就会看起来有个缺口:

 

八、snake.v完整代码

 

 

 

 

 

 阅读相关:

友晶科技FPGA开发板实现贪吃蛇游戏(九)——蛇身控制 DE10-STANDARD、DE1-SOC、DE2-115 - Doreen的FPGA自留地 - 博客园 (cnblogs.com)

 友晶科技FPGA开发板实现贪吃蛇游戏(八)——游戏控制之状态机设计 DE10-STANDARD、DE1-SOC、DE2-115 - Doreen的FPGA自留地 - 博客园 (cnblogs.com)

友晶科技FPGA开发板实现贪吃蛇游戏(七)食物(苹果)的产生 DE10-STANDARD、DE1-SOC、DE2-115 - Doreen的FPGA自留地 - 博客园 (cnblogs.com)

友晶科技FPGA开发板实现贪吃蛇游戏(六)VGA 驱动模图片块显示 DE10-STANDARD、DE1-SOC、DE2-115 - Doreen的FPGA自留地 - 博客园 (cnblogs.com)

友晶科技FPGA开发板实现贪吃蛇游戏(五)VGA 驱动模块字符显示 DE10-STANDARD、DE1-SOC、DE2-115 - Doreen的FPGA自留地 - 博客园 (cnblogs.com)

友晶科技FPGA开发板实现贪吃蛇游戏(四)VGA 驱动模块色块显示 DE10-STANDARD、DE1-SOC、DE2-115 - Doreen的FPGA自留地 - 博客园 (cnblogs.com)

友晶科技FPGA开发板实现贪吃蛇游戏(三)记分模块 DE10-STANDARD、DE1-SOC、DE2-115 - Doreen的FPGA自留地 - 博客园 (cnblogs.com)

友晶科技FPGA开发板实现贪吃蛇游戏(二)数码管驱动模块 DE10-STANDARD、DE1-SOC、DE2-115 - Doreen的FPGA自留地 - 博客园 (cnblogs.com)

友晶科技FPGA开发板实现贪吃蛇游戏(一)——整体描述 DE10-Standard、DE1-SOC、DE2-115 - Doreen的FPGA自留地 - 博客园 (cnblogs.com)