新闻中心

EEPW首页 > 嵌入式系统 > 牛人业话 > 【从零开始走进FPGA】非同于MCU的独立按键消抖动

【从零开始走进FPGA】非同于MCU的独立按键消抖动

作者: 时间:2015-03-02 来源:网络 收藏
编者按: 进入电子,无处不用到按键, FPGA中的按键消抖动更是非同一般,并针对不同情况有相应的对策。

  3. 中的

本文引用地址:https://www.eepw.com.cn/article/270304.htm

  对于中的消抖动,很多教科书上都没有讲述。但Bingo觉得这个很有必要。对于信号稳定性以及准确性分析,按键信号必须有一个稳定的脉冲,不然对系统稳定性有很大的干扰。

  此处Bingo用两种方法对动分析。其中第一种是通过状态机的使用直接移植以上的代码,这个思想在FPGA状态机中很重要。第二种,通过循环n次计数的方法来确认是否真的被按下,这种方法很实用在FPGA这种高速并行器件中。

  (1)利用状态机移植

  此模块由Bingo无数次修改测试最后成型的代码,在功能上可适配n个按键,在思想上利用单片机采用了单片机消抖动的思想。具体代码实现过程请有需要的自行分析,本模块移植方便,Verilog代码如下所示:

  /*************************************************

  * Module Name : key_scan_jitter.v

  * Engineer : Crazy Bingo

  * Target Device : EP2C8Q208C8

  * Tool versions : Quartus II 11.0

  * Create Date : 2011-6-26

  * Revision : v1.0

  * Description :

  **************************************************/

  module key_scan_jitter

  #(

  parameter KEY_WIDTH = 2

  )

  (

  input clk,

  input rst_n,

  input [KEY_WIDTH-1:0] key_data,

  output key_flag,

  output reg [KEY_WIDTH-1:0] key_value

  );

  reg [19:0] cnt; //delay_5ms(249999)

  reg [2:0] state;

  //-----------------------------------

  always @(posedge clk or negedge rst_n)

  begin

  if(!rst_n)

  cnt <= 20'd0;

  else

  begin

  cnt <= cnt + 1'b1;

  if(cnt == 20'd249999)

  cnt <= 20'd0;

  end

  end

  //-----------------------------------

  reg key_flag_r;

  reg [KEY_WIDTH-1:0] key_data_r;

  always@(posedge clk or negedge rst_n)

  begin

  if(!rst_n)

  begin

  key_flag_r <= 1'b0;

  key_value <= {KEY_WIDTH{1'b0}};

  end

  else if(cnt == 20'd249999) //Delay_5ms

  begin

  case(state)

  0:

  begin

  if(key_data != {KEY_WIDTH{1'b1}})

  state <= 1;

  else

  state <= 0;

  end

  1:

  begin

  if(key_data != {KEY_WIDTH{1'b1}})

  state <= 2;

  else

  state <= 0;

  end

  2:

  begin

  key_flag_r <= 1'b1;

  key_value <= key_data; //lock the key_value

  state <= 3;

  end

  3:

  begin

  key_flag_r <= 1'b0; //read the key_value

  if(key_data == {KEY_WIDTH{1'b1}})

  state <= 4;

  else

  state <= 3;

  end

  4:

  begin

  if(key_data == {KEY_WIDTH{1'b1}})

  state <= 0;

  else

  state <= 4;

  end

  endcase

  end

  end

  //---------------------------------------

  //Capture the falling endge of the key_flag

  reg key_flag_r0,key_flag_r1;

  always@(posedge clk or negedge rst_n)

  begin

  if(!rst_n)

  begin

  key_flag_r0 <= 0;

  key_flag_r1 <= 0;

  end

  else

  begin

  key_flag_r0 <= key_flag_r;

  key_flag_r1 <= key_flag_r0;

  end

  end

  assign key_flag = key_flag_r1 & ~key_flag_r0;

  endmodule

  信号线说明如下:

  clk

  系统最高时钟

  rst_n

  系统复位信号

  Key_data

  按键信号(可根据需要配置为n位)

  Key_flag

  按键确认信号

  Key_vaule

  按键返回值

  雷同上述按键消抖动的状态,此模块可以模拟成一下5个状态,见state machine:


wps_clip_image-28120

fpga相关文章:fpga是什么




关键词: FPGA MCU 按键消抖

评论


相关推荐

技术专区

关闭