zoukankan      html  css  js  c++  java
  • 手动按键复位程序(包含按键消抖)

    手动按键复位程序(包含按键消抖)

     1 //这是一个按键复位程序
     2 module stable_key(
     3     i_clkin,
     4     i_inKey,
     5     o_outKey
     6  );
     7 
     8 input i_clkin;
     9 input i_inKey;
    10 output o_outKey;
    11 
    12 reg key=1;
    13 reg key_get = 1;     //key输出指示信号
    14 reg [20:0]  cntK = 0;
    15 reg o_outKey_r = 1;
    16 
    17 always@(posedge i_clkin)
    18     if(key != i_inKey)                  //首先判断i_inKey信号是否有电平变化,
    19         begin                           //如果有电平变化,计数器和输出信号指示信号复位
    20             cntK <= 0;
    21             key_get <= 0;               //按键消抖
    22         end
    23     else if(cntK == 1999999)
    24         begin
    25             o_outKey_r <= key;
    26             cntK <= 0;
    27             key_get <= 1;
    28         end
    29     else if(key_get == 0)
    30         begin
    31             cntK <= cntK + 21'b1;
    32         end
    33 
    34     key <= i_inKey;
    35 
    36 
    37 assign o_outKey = o_outKey_r;
    38 endmodule

    程序解释:按键信号从i_inKey端口输入,复位信号o_outKey端口输出。 reg key=1; reg o_outKey_r = 1;都保持高电平,若i_inKey接收到低电平信号,

    则会触发 key != i_inKey,同时,在always块语句末尾将i_inKey输入的电平信号用reg key存储,在以后的时钟周期中,由于key_get == 0一直都触发cnK进行计数。

    当计数满足1999999时候,产生复位信号,计数器归0和key_get = 1,代表接收到了按键输入信号。

    消抖:当按键按下后,i_inKey会发生电平变化,但由于按键的抖动,使得计数器在1999999内,i_inKey的电平信号再次发生跳变,则会触发 key != i_inKey 语句,使得计数器归0,key_get也为0,代表没有接收到按键信号。

  • 相关阅读:
    luogu p1268 树的重量——构造,真正考验编程能力
    luogu p2330[SCOI05] 繁忙的都市——瓶颈生成树
    生成树的个数——基尔霍夫定理(Matrix-Tree Theorem)
    子序列最大和
    有关pascal的填充语句小技巧
    P2320 [HNOI2006]鬼谷子的钱袋
    DP专题——括号序列
    简单的迷宫(bfs)noj1793
    G:献给阿尔吉侬的花束(可能超时)
    ytu 2335: 0-1背包问题
  • 原文地址:https://www.cnblogs.com/chensimin1990/p/7273710.html
Copyright © 2011-2022 走看看