一、键控流水灯
1、实验目的
掌握流水灯的原理,学会使用循环移位和拼接操作。
2、实验要求
使用4个按键控制切换4种流水灯进行显示。
3、实验原理
在verilog中,“{}”( 大括号)的第一个特殊作用为位拼接。{a,b}相当于将a和b拼接为一个整体,并且是高位为a,低位为b。
当led输出为4’b0001时,第一个led点亮;经过1秒钟,输出4’b0010时,第二个led点亮;经过1秒钟,输出4’b0100时,第三个led点亮;经过1秒钟,输出4’b1000时,第四个led点亮;经过1秒钟,输出4’b0001时,第一个led点亮······按照上述的过程周而复始,就形成了流水灯。
不难发现,led的输出,一直为3个0,1个1。并且1的位置每1秒钟移动一次,从头到尾,然后又到头。这种现象可以利用移位的思想进行实现。即:led[3]<=led[2]; led[2]<=led[1]; led[1]<=led[0]; led[0]<=led[3];如果将被赋值的组成一个整体,那就是led,赋值的组成一个整体就是{led[2:0], led[3]}。
以上是流水灯的工作原理。如果想要通过按键控制切换不同流水灯的显示,我们可以使用状态机来实现,每一个状态中实现一种流水灯。
4、实验源码设计
将按键消抖模块例化在本设计文件中。
在按键消抖模块中,由于按键时长满足要求后,按键标志信号会在按键未释放的情况下持续拉高,但是在本此设计中,一次按键按下(如按下持续1s或者更多时间)后我们只取按键标志信号的一个有效周期,所以我们通过使用移位寄存器抓取按键消抖模块输出的按键标志信号的上升沿的方式来取这一个有效周期。如下所示的move_flag即为最终输出按键有效信号。
定义一个计数器用于流水灯移位效果的产生。当计数器在自加的过程中满足条件或者有按键按下时清零。
定义一个状态变量,用于不同流水灯显示状态的切换,每当按键按下,状态会自加(即实现不同流水灯的顺序切换),当state等于3时再次按下按键后,state会回到显示第一种流水灯的状态。