按键消抖&&testbench

===等于的意思,他和==的不同就是===不定值X和高阻值Z也比较,全都一样才相等
task语句用法实例
initial
 begin

    reset_task(100);

end

子模块 reset_task
task  reset_task;
input [15:0] resettime;

begin 
   reset=0;
   #resettime;
   reset=1;
end


-------------------------------------------------------------------------------------------------------------
tesebench中的.clk(clk0)  前一个为模块的名字,后一个为testbench中的取得名字,整个testbench中的clk也都叫做clk0了...也可以为其他名字.
fp_verilog i1
(
.clk(clk0),
.fm(fm),
.rst_n(rst_n)
);
注意,模块的输入为脚本的输出,模块的输出为脚本的输入





*************按键防抖****************

rst_n n表示低电平有效
按键的抖动时长大概有20ms




脉冲边沿检测法
具体就是建立2个寄存器,形成二级寄存器。在时钟触发中,首先把被测数据送入第一个寄存器中,然后在下一个时钟上沿到来时,将第一个寄存器中的数据存入第二个寄存器,也就是说第二个寄存器中的数据始终比第一个寄存器晚一个周期,即晚一个数据,然后再将第一个寄存器中的数据取反与第二个寄存器的数据相与,产生的数存入一个新的寄存器里,这样产生的结果是当第一个寄存器中的数据(注意:不是被测数据)由1变为0时(即下降沿),就会在新的寄存器里产生一个高电平,并维持一个周期;
如果是检测上升沿,则是将第二个寄存器取反,然后与第一个寄存器值相与,结果存入新的寄存器中,这样将会在被测数据的上升沿时,新的寄存器里产生一个高电平。
详细的过程写在了代码文件的注释当中.

key_an寄存器的功能是检测第一次的“按下”,是cnt的启动标志位。通过也能滤除干扰信号。模块作用,当寄存器key_rst由1变为0时,led_an的值变为高,并且维持一个时钟周期 .
注意只维持一个时钟周期,所以不耽误后面cnt计数器数到20ms


led_ctrl是确实有按键按下的信号,维持一个时钟周期。

按键消抖两种方法

(1)延时重采样
延时重采样的意思是,当第一次检测到键值由'1'变为'0'时,再延时一段时间(如10ms),再次采样,确认是否仍是'0';若是'0'则认为此时键值为'0',否则,重新执行检测过程。

这个方案在特权同学的《深入浅出玩转FPGA》的p191有例程;

该方案的缺陷:a.如果延时太短,有可能两次采样时都处于抖动时间,因此可能引起误判;

b.如果延时太长,可能检测不出按键变换

(2)持续采样
持续采样的原理是,当检测到按键处于某电平(如'0')时,在之后的N个时钟周期内连续检测此按键的电平,如果一直不变,则读出此按键的电平值(如'0')。
持续采样的优点:a.样本足够多,减少误判的可能性。
b.对于按键按下('1'->'0'),按键释放('0'->'1')都可以检测。

持续采样的缺点:持续检测的时间太长(大于按键按下和释放的时间差),则可能无法检测按键的变换。



///---------------------------------------------/
output led;
reg [3:0]  led; 
正规写法,先申明端口,再申明具体的参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值