从零开始学习紫光同创FPGA——PGL22G开发板之按键消抖(二) - FPGA开发者技术社区 - 电子技术william hill官网 - 广受欢迎的专业电子william hill官网 - 威廉希尔官方网站
分享 收藏 返回

从零开始学习紫光同创FPGA——PGL22G开发板之按键消抖(二)

一、按键消抖

1、实验目的

机械式弹片按键,在按下或松开时会有机械抖动,导致在按下或松开时按键的状态不稳定,在快速的变化,在使用按键输入信号时如果采集了抖动时的状态(也可称之为毛刺),会导致工程运行出现不可控的变化,故而我们需要将这段时间的抖动信号给滤除掉,所以需要进行按键消抖。

2、实验要求

编写按键消抖代码,并进行modelsim仿真验证。

3、实验原理

前后抖动时间约为5~10ms,预留20ms做设计,使用计数到N归零的计数器来做时间刻度计时;以20ms的间歇对按键输入信号进行采集,从而避开按键的抖动引起的信号快速变化。
image.png
image.png

4、实验源码设计

首先建立模块头部输入时钟、复位、按键输入信号和输出按键有效标志信号。
image.png

然后使用参数parameter定义系统输入时钟和实际用、仿真用的延时。定义一个计数器用于对按键的保持时间进行计数,如果按键按下,那么计数器开始自加,直到等于或大于设定条件后计数器保持当前值不变,否则计数器清零。
image.png

当计数器等于或大于设定条件是,按键有效标志保持置1,直到条件不满足(即释放按键)。
image.png

5、仿真文件源码设计及仿真分析

双击Simulation建立仿真文件。
image.png

在仿真文件中例化源文件模块,注意在仿真文件头部手动添加时间尺度语句,否则在运行modelsim后会报如下错误。
image.png

然后开始编写仿真代码。

仿真开始先对输入复位;

延迟10ns后清除复位;

延迟10ns后按键有效;

延迟30ns后释放按键;

延迟10ns后按键有效;

延迟100ns后释放按键。

完成仿真文件的编写。
image.png

仿真文件编写完成后,需要对PDS与modelsim联合仿真进行设置方能正常使用。

打开工程,点击 PDS 的【tools】 菜单下的【Compile Simulation Libraries】。
image.png
image.png

【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 完成编译;
image.png

在完成上述所有步骤后,右击 tb 文件,点击Run Behavior Simulation就可以进行联合仿真了。
image.png

如下图所示,在第一次按键有效时,计数器计数没有达到设定条件,故按键有效标志没有拉高。

而第二次按键按下时,计数器计数满足了条件,按键有效标志持续拉高直到释放按键后拉低。

通过仿真可以看到按键消抖起到了应有的作用。
image.png

如果需要改动仿真文件,改动完毕后不需要关闭modelsim后在PDS中重新Run Behavior Simulation;只需在modelsim的transcript命令输入行输入以下命令语句即可重跑仿真文件:

do {run_behav_compile.tcl}

二、按键控制LED灯

1、实验目的

通过按键控制LED灯的亮灭,测试按键消抖在上板后能否正常工作。

2、实验要求

使用4个按键分别控制4个LED灯的亮灭,按键按下则灯亮,松开则熄灭。

3、实验原理

通过按键消抖后的按键标志信号给LED灯赋值。

4、实验源码设计

定义文件模块的输入和输出。
image.png

由于需要对输入的4个按键信号进行消抖处理,故将按键消抖模块例化4次。

模块例化方式如下:
image.png
image.png

定义一个4位的按键标志信号变量,接到消抖模块的输出上,同时将此信号的自或作为判断条件,4个按键中的一个或多个按下,此变量自或为1,与按键一一对应的LED灯将会点亮,松开对应的按键,对应的LED灯便会熄灭。
image.png

更多回帖

×
发帖