Step1: 材料准备

硬件:

Basys3开发板

VGA连接线及VGA显示器一台


软件平台:

Vivado2016.4

Step2: 系统框架

系统主要由6部分组成,分别是按键输入模块、控制模块、数据路径模块、随机生成模块、VGA显示模块和数码管显示模块。

Step3: 程序设计

上图1是本程序的RTL级视图。


下面我们对于各个模块进行分析。


1.键盘扫描

我们一共设置了五个按键,分别执行up,down,left,right,restart这五个功能。

以up_key_press为例,介绍消抖的算法。

在每个时钟高电平时并行执行以下两条语句

up_key_press<=0;

up_key_last<=0;

当有按键按下时,每100ms(cnt=5_0000) last=up,last输出比up滞后一个周期,若up_key_last==0&&up==1,则说明按键按下,press输出置1。


2.控制模块(参考图2)

当打开开始开关并按下任意一个方向键时,游戏开始,当游戏结束时闪烁5下,重新开始游戏。


3.数据路径模块(参考图3)

cube_x,cube_y表示一整条蛇身体各节的格坐标。is_exist有16位,即蛇体最长为16*1格,每一位对应一个格,1为该格显示,0则不显示(图中虚框)。每吃下一个苹果蛇长度增加1,相应exist位置变为1。

蛇每次移动,对应的cube[x] = cube[x+1],即后一位的身子会移动到前一位的位置,蛇头根据按下的按钮来判断是撞到了墙,还是撞到了身子,还是移动到了下一个位置。

当蛇头和苹果重合时,生成一个增加身长的信号,并在计数器上+1。


4.随机生成模块

采用伪随机数的产生方法,比较笨拙。

每个时钟周期random_num都在变,而我们吃下苹果的时刻却因走法、按键的时间等有所不同,所以不同时刻吃下苹果后下一个苹果出现的地方近似随机~


5.VGA显示模块

使用640*480分辨率,需要分频为25MHz的时钟信号。


6.数码管显示模块

当有增长身长信号产生时,分数也对应增加,数码管动态扫描显示分数。

Step4: 项目演示

大家可以查看项目首页第一张图中的演示视频。项目的源代码可点击页面左侧“下载代码”按钮下载。


希望能给FPGA入门新手们带来帮助!

评论

  • 个人感觉这个按键去抖写的不好,还有就是贪吃蛇按键不需要去抖,按几次同方向的方向键并没有什么影响

  • 请问看到了可以给个回复吗

  • 请问按键有去抖的作用吗?没看懂

  • if(clk_cnt == 5_0000) begin//1ms clk_cnt <= 0; left_key_last <= left;//按键按下,输入高电平3.3V right_key_last <= right; up_key_last <= up; down_key_last <= down; if(left_key_last == 0 && left == 1) left_key_press <= 1; if(right_key_last == 0 && right == 1) right_k

  • 棒!