最近看了特权同学09年录的FPGA视频学习课程,其中讲到第9课——按键消抖实验课程,有些体会、迷茫和感受,记录一下。首先,特权同学介绍了边沿检测法,我也总结学习一下;其次,对特权同学课程中的例子谈一下自己的理解,因为一开始自己丝毫看不懂,在网上搜索到的各种解释都和特权同学说的、注释的没有什么区别,我自己还是没理解透彻,于是自己边仿真、边看rtl视图,边啃代码,终于明白了一些,但竟在网上无人提起自己所想的东西,也许是自己想错了呢,记录下来先。
首先,总结一下边沿检测法。
这个方法一开始在测航天一家单位的FPGA软件时,审代码见到过,当时自己就没理解没吃透,今天特权同学一讲顿时醒悟,看来这个方法在工程实践中经常用到。
边沿检测法的目的就是要检测某一信号或数据从1跳变为0的一拍,最终结果为维持一个clk的高脉冲信号。
边沿检测采用二级寄存器方法实现。例如对data信号进行边沿检测:首先,data被送入reg1中,在下一个clk时,reg1中的数据被存入reg2,即reg2中的数据始终比reg1中的数据晚一个始终。那么,采用reg1中的数据取反,然后和reg2中的数据相与,结果会是:当reg1中的数据由1→0时,与的结果为一个时钟的高脉冲。
示例代码:
reg a;
reg a_r;
always @(posedge clk)
a_r<=a;
wire b=(~a)&a_r;
则b仅会在a由1→0时变为1个clk宽度的高脉冲信号,其余时候均为低电平。
第二,谈谈特权同学按键消抖实验代码。
以下代码为按键消抖实验代码(摘自网络)
//说明:当三个独立按键的某一个被按下后,相应的LED被点亮;
// 再次按下后,LED熄灭,按键控制LED亮灭
module sw_debounce(
clk,rst_n,
sw1_n,sw2_n,sw3_n,
led_d1,led_d2,led_d3
);
input clk; //主时钟信号,50MHz
in