首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

独立按键消抖FPGA模块

独立按键消抖FPGA模块

  • module keyxiaodou (
  •      input clk,//the freq or clk is 50M
  •      input rst,//use key3 for rst button
  •      input key1,key2,//use key1 to light led,use key2 to turn off led
  •      output led);
  •      //--------------------------------------------------
  •      reg [1:0] key_r;//the first time check the key
  •      always @ (posedge clk or negedge rst)
  •          if (!rst) key_r <= 2'b11;
  •          else    key_r <= {key2,key1};
  •      reg [1:0] key_rb;
  •      always @ (posedge clk or negedge rst)
  •          if (!rst) key_rb <= 2'b11;
  •          else    key_rb <= key_r;
  •      wire [1:0] key_an = key_rb & (~key_r);//if the key[?] is pressed,key_an[?] become 1'b1
  •      //--------------------------------------------------
  •      reg [19:0] cnt;//divice the freq 1/50m*2^20=20ms
  •      always @ (posedge clk or negedge rst)
  •          if (!rst) cnt <= 20'd0;
  •          else if (key_an) cnt <= 20'd0;
  •          else    cnt <= cnt+1'b1;
  •      //--------------------------------------------------
  •      reg [1:0] keyn_r;//the second time check the key
  •      always @ (posedge clk or negedge rst)
  •          if (!rst) keyn_r <= 2'b11;
  •          else if(cnt ==20'hfffff) keyn_r <= {key2,key1};//relay 20ms for debounce
  •      reg [1:0] keyn_rb;
  •      always @ (posedge clk or negedge rst)
  •          if (!rst) keyn_rb <= 2'b11;
  •          else    keyn_rb <= keyn_r;
  •      wire [1:0] key_p = keyn_rb & (~keyn_r);
  •      //--------------------------------------------------
  •     reg led_r;
  •      always @ (posedge clk or negedge rst)
  •          if (!rst) led_r <= 1'b0;
  •          else if (key_p[0]) led_r <= 1'b1;
  •          else if (key_p[1]) led_r <= 1'b0;
  •      assign led=~led_r;
  • endmodule
继承事业,薪火相传
返回列表