在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 7273|回复: 12

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

[复制链接]
发表于 2012-7-13 14:58:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
消抖电路.png
上图是按键的消抖电路

下图是仿真波形
wave.png

代码
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




怎么解决啊!!!
 楼主| 发表于 2012-7-13 15:00:34 | 显示全部楼层
代码重新贴过,,,
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
 楼主| 发表于 2012-7-13 15:03:39 | 显示全部楼层
回复 2# W_jacksaon


    是最后的那个reg的问题,,,但就是不知道怎么解决啊
发表于 2012-7-13 16:01:43 | 显示全部楼层
添加条件,使cnt计数到FFFFF后停止计数
发表于 2012-7-14 09:41:47 | 显示全部楼层
你的波形和你的代码是一致的啊!
最主要,你程序的目的是什么?
发表于 2012-7-14 22:22:05 | 显示全部楼层
最后一个REG没有把SW给到它吧,你是想打两拍,但是实际条件不满足啊
 楼主| 发表于 2012-7-15 07:40:50 | 显示全部楼层
这个我后来是通过异步的始终解决的,直接添加了  always @(posedge flg_2),,,,,但是会出现warning,,,内容就是利用reg 来做时钟
发表于 2012-7-15 20:10:42 | 显示全部楼层
没有看代码,看你上面的回复 应该是想采 flg_2的上升沿。

很简单啊,把 flg_2打一拍 得到flg_2_dly 判断   flg_2 == 1'b1 && flg_2_dly == 1'b0 就可以了。
发表于 2012-7-15 21:25:32 | 显示全部楼层
添加条件,使cnt计数到FFFFF后停止计数,并归零,最后一个always改为        
        always @(posedge clk or negedge rst)
                if(!rst)
                        led<=1'b1;
                else
                        if(l_t_r)
                                led<=~led;
试试
 楼主| 发表于 2012-7-18 08:21:46 | 显示全部楼层
好的,,今天试一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-4 11:10 , Processed in 0.034128 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表