一、按键消抖
1、实验目的
机械式弹片按键,在按下或松开时会有机械抖动,导致在按下或松开时按键的状态不稳定,在快速的变化,在使用按键输入信号时如果采集了抖动时的状态(也可称之为毛刺),会导致工程运行出现不可控的变化,故而我们需要将这段时间的抖动信号给滤除掉,所以需要进行按键消抖。
2、实验要求
编写按键消抖代码,并进行modelsim仿真验证。
3、实验原理
前后抖动时间约为5~10ms,预留20ms做设计,使用计数到N归零的计数器来做时间刻度计时;以20ms的间歇对按键输入信号进行采集,从而避开按键的抖动引起的信号快速变化。
4、实验源码设计
首先建立模块头部输入时钟、复位、按键输入信号和输出按键有效标志信号。
然后使用参数parameter定义系统输入时钟和实际用、仿真用的延时。定义一个计数器用于对按键的保持时间进行计数,如果按键按下,那么计数器开始自加,直到等于或大于设定条件后计数器保持当前值不变,否则计数器清零。
当计数器等于或大于设定条件是,按键有效标志保持置1,直到条件不满足(即释放按键)。
5、仿真文件源码设计及仿真分析
双击Simulation建立仿真文件。
在仿真文件中例化源文件模块,注意在仿真文件头部手动添加时间尺度语句,否则在运行modelsim后会报如下错误。
然后开始编写仿真代码。
仿真开始先对输入复位;
延迟10ns后清除复位;
延迟10ns后按键有效;
延迟30ns后释放按键;
延迟10ns后按键有效;
延迟100ns后释放按键。
完成仿真文件的编写。
仿真文件编写完成后,需要对PDS与modelsim联合仿真进行设置方能正常使用。
打开工程,点击 PDS 的【tools】 菜单下的【Compile Simulation Libraries】。
【Simulator】:第三方仿真工具,目前支持ModelSim和QuestaSim,本教程选择ModelSim;
【Language】:仿真库用的语言;
【Library】:选择 usim 则是 GTP 前仿库,vsim 则是 VOP 后仿库,ALL 则包括这两种仿真库,默认选择 ALL;
【Family】: 指定芯片系列对应的仿真库进行编译,可支持一次编译多个系列,默认选择ALL。
【Compiled Library Location】:编译出来的库的位置,默认是在当前工程下面;可以把编译库放在一个固定位置。
【Simulator Executable Path】:选择 ModelSim 运行路径(ModelSim 安装文件夹下…/…/win64pe)
设置完成后点击 compile,运行编译库会有状态栏显示正在编译。
下面界面是开始进行编译,编译成功后点击 Close 完成编译;
在完成上述所有步骤后,右击 tb 文件,点击Run Behavior Simulation就可以进行联合仿真了。
如下图所示,在第一次按键有效时,计数器计数没有达到设定条件,故按键有效标志没有拉高。
而第二次按键按下时,计数器计数满足了条件,按键有效标志持续拉高直到释放按键后拉低。
通过仿真可以看到按键消抖起到了应有的作用。
如果需要改动仿真文件,改动完毕后不需要关闭modelsim后在PDS中重新Run Behavior Simulation;只需在modelsim的transcript命令输入行输入以下命令语句即可重跑仿真文件:
do {run_behav_compile.tcl}
二、按键控制LED灯
1、实验目的
通过按键控制LED灯的亮灭,测试按键消抖在上板后能否正常工作。
2、实验要求
使用4个按键分别控制4个LED灯的亮灭,按键按下则灯亮,松开则熄灭。
3、实验原理
通过按键消抖后的按键标志信号给LED灯赋值。
4、实验源码设计
定义文件模块的输入和输出。
由于需要对输入的4个按键信号进行消抖处理,故将按键消抖模块例化4次。
模块例化方式如下:
定义一个4位的按键标志信号变量,接到消抖模块的输出上,同时将此信号的自或作为判断条件,4个按键中的一个或多个按下,此变量自或为1,与按键一一对应的LED灯将会点亮,松开对应的按键,对应的LED灯便会熄灭。