一、实验目的
1 设计 8 种彩灯效果,可通过按键切换。
2 选择一个按键作为控制输入,按下一次换一种显示效果,在 8 种效果中循环。
二、实验要求
1、实验平台:MES2KG 开发板;
2、按键输入由 K1 输入,LED 输出为 LD1~LD4。
三、实验原理
实现框架如下:
1、顶层实现按键切换 LED 的彩灯状态;
2、需要设计一个输入控制模块及一个输出控制模块;
这个实验带大家将多个模块整合成为一个工程,涉及到的知识点有子模块设计、模块例化;子模块的设计主要是依据功能定位,确定输入输出,再做具体的设计;模块例化方式如下:
a. 按键控制模块功能
接收按键输入信号。统计按键按下次数,由于彩灯模式是 8 种,计数统计范围是 0~7 循环,将计数结果传递给 LD 控制模块;根据需求输入信号有:时钟,按键;输出信号有:彩灯控制信号;内部功能处理:
<1>内部需要对按键信号做消抖处理;
<2>按键触发计数器(计数值输出)改变继而调整彩灯的状态;
b. 按键消抖
消抖目的
机械式弹片按键,在按下或松开时会有机械抖动,导致在按下或松开时按键的状态不稳定,在快速的变化,在使用按键输入信号时如果采集了抖动时的状态,会导致工程运行出现不可控的变化,故而我们需要将这段时间的抖动信号给滤除掉,故此实验称之为按键消抖;
实验原理
前后抖动时间约为 5~10ms,前后抖动共在 20ms,以最大 20ms 做设计,使用计数到 N 归零的计数器来做时间刻度计时;以20ms 的间歇对按键输入信号进行采集,从而避开按键的抖动引起的信号快速变化;
设计 1 个 20bit 的计数器,其计数最大值为:N = 20’hC3500 = 20’d800000最大计数值时,计时为:t= N*T = N/f = 800000/40M = 20ms;注:对于计数器完成计时功能在 LED 灯控制中已有详细讲解,需要关注输入时钟频率以及目标计时时长,从而得到计数器的计数范围;
此种方法有一定误触发概率出现,大家可在此基础上做补充完善;思路如下
(扩展实现):
这个 module 的设计中新增加一种语法:parameter ;在 verilog 中 parameter是对常量进行定义,将parameter定义放在module的接口中是可进行模块传递,传递方式请看后面模块例化;
LED 控制模块功能
8 种流水灯模式有按键传递过来的计数控制切换,每一个 LED 的显示状态完整后进入下一模式初始化。根据需求可得到如下信息:
输入信号:时钟,彩灯模式控制信号; 出信号:12bit 位宽的 LED 控制信号;功能处理注意事项:彩灯状态切换点,不同状态的切换时如何初始化;
四、实验源码设计(完整源码查看 demo 源文件)
1.顶层文件源码
2.按键控制模块
3.按键消抖
4.LED 控制模块
五、实验现象
上电后下载完固件,默认 LD1~LD4 流水,每按下一次 KEY1,彩灯状态切换一次,总共 8 种状态可供循环切换;