微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 在做按键消抖verilog程序时,出现问题,求助

在做按键消抖verilog程序时,出现问题,求助

时间:10-02 整理:3721RD 点击:



上图是按键的消抖电路
下图是仿真波形



代码
module key(
rst,clk,sw,led
);//¶¨ÒåÁË4¸ö¹Ü½Å
input rst,clk,sw;
output led;
reg led;

//±ßÑØ¼ì²â·¨£¬swÊÇ·ñ¾ßÓÐµçÆ½µÄÕý·´×ª
reg v_t;//Õâ¸öÊÇÀ´´æ´¢sw´Î״̬µçƽµÄ¼Ä´æÆ÷
reg v_t_r;//Õâ¸öÊÇÀ´´æ´¢Ê×״̬µçƽµÄ¼Ä´æÆ÷
wire flg;//Õâ¸öÊÇÀ´¼ì²â´æÔÚµçÆ½µÄÕýÏò·´×ªµÄ
always @(posedge clk)//ÔÚÕâ±ß¾ÍÊÇÀ´¼ì²âµçƽµÄ£¬ËùÒÔÊDz»ÐèÒªµÄ,,,ÔÚverilogÖУ¬Ò»¸ö¼Ä´æÆ÷¾ÍÊÇдһ¸öalways
  v_t<=sw;
always @(posedge clk)
  v_t_r<=v_t;
assign flg=v_t_r && (~v_t);//&Otilde;&acirc;&cedil;&ouml;&frac34;&Iacute;&Ecirc;&Ccedil;&Oacute;&Atilde;&Agrave;&acute;&frac14;ì&sup2;&acirc;&micro;&Auml;±ê&Ouml;&frac34;

//&sup2;&cent;&ETH;&ETH;&Ocirc;&Euml;&ETH;&ETH;&micro;&Auml;
//&Iuml;&Ouml;&Ocirc;&Uacute;&frac34;&Iacute;&Agrave;&acute;&Eacute;è&Ouml;&Atilde;&micro;&ccedil;&AElig;&iquest;&Otilde;&eth;&micro;&acute;&micro;&Auml;&Ecirc;±&frac14;&auml;

reg [19:0] cnt;//&Eacute;è&Ouml;&Atilde;&micro;&Auml;&Ecirc;±&frac14;&auml;&Ecirc;&Ccedil;20ms&pound;&not;&pound;&not;&pound;&not;&Euml;ù&Ograve;&Ocirc;&Ocirc;&Uacute;&Otilde;&acirc;±&szlig;&Ecirc;&Ccedil;20&Icirc;&raquo;&micro;&Auml;
always @(posedge clk or negedge rst)
  if (!rst)
   cnt<=20'h0;
  else if(flg)
   cnt <=20'h0;
  else
   cnt<=cnt+1'b1;
//&Euml;ù&Ograve;&Ocirc;&Ocirc;&Uacute;&Ecirc;&yacute;×&Ouml;&micro;&ccedil;&Acirc;·&Ouml;&ETH;&raquo;&sup1;&Ecirc;&Ccedil;&Iuml;&Egrave;&Ograve;&ordf;&frac12;&laquo;&Ecirc;±&ETH;ò&Iuml;&Egrave;&raquo; &sup3;&ouml;&Agrave;&acute;&micro;&Auml;
//&Ocirc;&Uacute;&Otilde;&acirc;±&szlig;&Iacute;ê&sup3;&Eacute;&micro;&Auml;&Ecirc;&Ccedil;&para;&Ocirc;&ordm;&atilde;&Icirc;&Egrave;&ETH;&Aring;&ordm;&Aring;&micro;&Auml;&sup2;&Eacute;&Ntilde;ù
reg l_t;
reg l_t_r;
always @(posedge clk)
  if(cnt ==20'hfffff)
   l_t<=sw;
always @(posedge clk)
  if(cnt ==20'hfffff)
   l_t_r<=l_t;//&Ocirc;&Uacute;&Otilde;&acirc;±&szlig;&raquo;á&sup2;ú&Eacute;úreg?
wire flg_2;
assign flg_2=l_t_r && (~l_t);


always @(posedge clk or negedge rst)
  if(!rst)
//  led_ctrl <=1'b0;
   led<=1'b1;
  else
   if(flg_2)
//   led_ctrl<=~led_ctrl;
//assign led=led_ctrl?1'b1:1'b0;
    led<=~led;
  
/*
always @(posedge flg_2 or negedge rst)
   if (!rst)
    led<=1'b1;
   else
    led<=~led;
*/
  
endmodule


怎么解决啊!

代码重新贴过,,,
module key(
        rst,clk,sw,led
        );
        input rst,clk,sw;
        output led;
        reg led;
       
       
        reg v_t;
        reg v_t_r;
        wire flg;
        always @(posedge clk)
                v_t<=sw;
        always @(posedge clk)
                v_t_r<=v_t;
        assign flg=v_t_r && (~v_t);
        reg [19:0] cnt;
        always @(posedge clk or negedge rst)
                if (!rst)
                        cnt<=20'h0;
                else if(flg)
                        cnt <=20'h0;
                else
                        cnt<=cnt+1'b1;
        reg l_t;
        reg l_t_r;
        always @(posedge clk)
                if(cnt ==20'hfffff)
                        l_t<=sw;
        always @(posedge clk)
                if(cnt ==20'hfffff)
                        l_t_r<=l_t;
        wire flg_2;
        assign flg_2=l_t_r && (~l_t);
       
        always @(posedge clk or negedge rst)
                if(!rst)
                        led<=1'b1;
                else
                        if(flg_2)
                                led<=~led;
               
endmodule



    是最后的那个reg的问题,,,但就是不知道怎么解决啊

添加条件,使cnt计数到FFFFF后停止计数

你的波形和你的代码是一致的啊!
最主要,你程序的目的是什么?

最后一个REG没有把SW给到它吧,你是想打两拍,但是实际条件不满足啊

这个我后来是通过异步的始终解决的,直接添加了  always @(posedge flg_2),,,,,但是会出现warning,,,内容就是利用reg 来做时钟

没有看代码,看你上面的回复 应该是想采 flg_2的上升沿。
很简单啊,把 flg_2打一拍 得到flg_2_dly 判断   flg_2 == 1'b1 && flg_2_dly == 1'b0 就可以了。

添加条件,使cnt计数到FFFFF后停止计数,并归零,最后一个always改为        
        always @(posedge clk or negedge rst)
                if(!rst)
                        led<=1'b1;
                else
                        if(l_t_r)
                                led<=~led;
试试

好的,,今天试一下



    就是按键消抖



    楼上正解,,,我试一下你的方法

always @(posedge clk)
                if(cnt ==20'hfffff)
                        l_t<=sw;
        always @(posedge clk)
                if(cnt ==20'hfffff)
                        l_t_r<=l_t;
第二个always中 把if(cnt ==20'hfffff)这句删掉应该就可以吧,应该是检测相邻两个时钟周期的变化。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top