设计任务:
(1)用4个按键key0-key3对应控制4个小灯LED0-LED3;用触摸按键进行模式切换;用一位数码管显示当前控制模式,两位数码管显示当前得分。
(2)触摸按键没有按下时处于模式1,按下后处于模式2。用模式数码管显示当前的控制模式。
(3)模式1工作方式:当点亮LED0时,若按下对应的控制按键key0,则得分加1,如若按下别的按键,得分不变。每次点亮一个小灯,得分规则相同。当得分累加到15,不再增加,表示本轮游戏胜利。(注:小灯的切换频率可自行调节)
(4)模式2工作方式:随机的点亮小灯,若按下对应的控制按键,则得分加1,如按下别的按键,得分减1。
(5)当得分累加到15,不再增加,表示本轮游戏胜利;当得分减到0,表示本轮游戏失败。
(6)若游戏胜利,可加快小灯的切换频率,再次尝试;若游戏失败,可放慢小灯的切换频率,再次尝试。
设计方案:
通过触控板对两种模式进行切换,未按下触控板时,处于模式一;按下触控板时,处于模式二;若再次按下则切换到模式一。
模式一工作方式:从左往右依次点亮LED。若在LED点亮时按下对应key,得分+1;若按下key与LED灯不对应,得分不变。当得分累加到15时,仍继续按对,则得分清零,进入下一关,蜂鸣提醒且流水灯闪烁频加快。
模式二工作方式:随机点亮LED。若在LED点亮时按下对应key,则得分+1;若按下key与LED灯不对应,得分-1。当得分累加到15时,仍继续按对,得分清0,进入下一关,蜂鸣提醒且流水灯闪烁频率加快;当得分为0时,仍继续按错后,回到上一关,蜂鸣提醒且小灯闪烁频率减慢。
功能模块包括:LED点亮模块;按键防抖模块;得分计数模块;数码管显示模块。
LED点亮模块:
本程序中输入时钟为50MHz,所以一个时钟周期为20ns(1/50MHz)。因此计数器counter 通过对50MHz系统时钟计数,计时到1s,需要累加1s/20ns=50000000次。频率加快和减慢部分由计数模块中输出的计满信号A,减0信号B来进行控制,当A为1时,计时减小0.2s,当B为1时,计时增加0.2s,其设计语句为“TIME-A*push+B*push”。
模式一中LED点亮的设计方案是利用计数器计时,当计时到1s时,让led_control+1,使led_control在四个状态(00,01,10,11)内依次变化,然后利用case条件语句在四种LED灯点亮模式(4’b0001、4’b0010、4’b0100、4’b1000)进行选择,达到从左到右依次点亮LED的效果。
模式二中LED点亮的设计方案是利用伪随机数的产生,当计数器计时到1s时,将伪随机数传输给led达到点亮LED灯的效果。
按键防抖模块:这一模块在CSDN上有很多啦,这里就不在画蛇添足啦。
得分计数模块:
其计数功能分为两种工作方式:模式一和模式二。模式一工作方式:若在LED点亮时按下对应key,DATA+1;若按下key与LED灯不对应,DATA不变。当DATA累加到15时,继续得分,则DATA清零,蜂鸣提醒。模式二工作方式:若在LED点亮时按下对应key,则得分+1;若按下key与LED灯不对应,得分-1。当得分累加到15时,继续按对后,得分清0,蜂鸣提醒;当得分为0时,继续按错后,蜂鸣提醒。故通过使用if_else语句对条件进行判断,来实现上述计数功能。
当touch为“1”时,处于模式一,使用条件语句进行判断。当key_pluse为“1”且对应led灯点亮时,使data加1,否则不变。当data为于15时,对data清0,并给计满信号A赋值为“1”,使蜂鸣器鸣叫,并将计满信号A输出给LED灯点亮模块,实现频率的加快。
当touch为“0”时,处于模式二,使用条件语句进行判断。当只要是key_pluse有效时,就对key_pluse和对应led进行判断。若key_pluse和对应led相等时,使data+1,否则data-1。当data为15时,对data清0,并给计满信号A赋值为“1”,使蜂鸣器鸣叫,并将计满信号A输出给LED灯点亮模块,实现LED闪烁频率加快。当data为0时,给减0信号B赋值为“1”,使蜂鸣器鸣叫,并将减0信号输出给给LED灯点亮模块,实现LED闪烁频率减慢。文章来源:https://www.toymoban.com/news/detail-528602.html
数码显示模块:这一块也有很多资料啦,也就不赘述啦。文章来源地址https://www.toymoban.com/news/detail-528602.html
到了这里,关于基于Verilog HDL的按键控制流水灯即打地鼠小游戏的设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!