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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2837|回复: 6

[求助] 求助FPGA按键消抖的输出问题

[复制链接]
发表于 2012-3-25 16:57:54 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 赵侯261 于 2012-3-25 19:57 编辑

请教一下大家,能不能告诉我一下,当有按键按下时,只会在按键按下的一瞬间闪一下?非常感谢

module my_button(module my_button(                clk,rst_n,
                but1,
                led1
                );

input clk;
input rst_n;
input but1;
output led1;

reg but1_r;
reg but1_r_n;
reg[19:0] cout_r;
reg ker;
reg ker_n;
reg d1;

wire but1_r_o;
wire ker_i;
wire ker_o;
/*******************************/
//检测按键输入端口的下降沿
always @ (posedge clk or negedge rst_n)
begin
        if(!rst_n)
                but1_r <= 1'b1;
        else
                but1_r <= but1;
end

always @ (posedge clk or negedge rst_n)
begin
        if(!rst_n)
                but1_r_n <= 1'b1;
        else
                but1_r_n <= but1_r;
end

assign but1_r_o = but1_r_n & ( ~but1_r );
/*******************************/

/*******************************/
//按键消抖,输出消抖以后的波形,本段最后一行为测试输出
always @ (posedge clk or negedge rst_n)
begin
        if(!rst_n)
                cout_r <= 20'h0;
        else if(but1_r_o)
                cout_r <= 20'h0;
        else
                cout_r <= cout_r + 1'b1;
end

assign ker_i = (cout_r == 20'hfffff) ? 1'b1 : 1'b0;

always @ (posedge clk or negedge rst_n)
begin
        if(!rst_n)
                ker <= 1'b1;
        else if(ker_i)
                ker <= but1;
end


//assign led1 = ker;
/*******************************/

/*******************************/
//检测消抖后信号的下降沿
always @ (posedge clk or negedge rst_n)
begin
        if(!rst_n)
                ker_n <= 1'b1;
        else if(ker_i)
                ker_n <= ker;
end

//assign led1 = ker_n;
/*******************************/

/*******************************/
//控制信号灯的亮与不亮,当检测到下降沿时,灯得状态取反
assign ker_o = ker_n & (~ker);

always @ (posedge clk or negedge rst_n)
begin
        if(!rst_n)
                d1 <= 1'b1;
        else if(ker_o)
        begin
                #1;
                d1 <= ~d1;
        end
end

assign led1 = d1;
/*******************************/
endmodule
 楼主| 发表于 2012-3-25 17:53:28 | 显示全部楼层
为什么不能一直输出亮
发表于 2012-3-25 19:50:50 | 显示全部楼层
自己仿真就能看出来。
你的代码一堆的问题。
”assign but1_r_o = but1_r_n & ( ~but1_r );“这个检测的是上升沿吧;
//按键消抖,输出消抖以后的波形,本段最后一行为测试输出
always @ (posedge clk or negedge rst_n)
begin
        if(!rst_n)
                cout_r <= 20'h0;
        else if(but1_r_o)
                cout_r <= 20'h0;
        else
                cout_r <= cout_r + 1'b1;
end

assign ker_i = (cout_r == 20'hfffff) ? 1'b1 : 1'b0;

always @ (posedge clk or negedge rst_n)
begin
        if(!rst_n)
                ker <= 1'b1;
        else if(ker_i)
                ker <= but1;
end


//assign led1 = ker;
没看出来是干啥用的,
cout的控制应该是有问题的。是不是按键无效时应该计数到某个值后停下来?
 楼主| 发表于 2012-3-26 10:01:19 | 显示全部楼层
回复 3# yongfenr

如果输入为
but1_r:   1110011
~but1_r: 0001100
but1_r_o:   1110011
相与:       0001000

检测的是下降沿啊。

我的设计思想是:让端口一直采样,每20ms锁存一次,当采到下降沿时重新从零计数,当道20ms时再采一次,若为低则采取动作。
 楼主| 发表于 2012-3-26 10:05:06 | 显示全部楼层
回复 3# yongfenr


   关于仿真的问题,我是一个菜鸟,刚学FPGA,就仿真过一个例子,自己写的代码不知道该怎么仿真,这个按键消抖的程序我没有仿真,就加入了几个测试点,测试了一下有输出,比如最后一段前面有个测试点,在开发板上是有结果的。按下一个键等到释放的时候灯才会灭,但是最后一段的输出不知道为什么有问题。
发表于 2012-3-26 11:58:19 | 显示全部楼层
assign ker_i = (cout_r == 20'hfffff) ? 1'b1 : 1'b0;
下一个clk ker_i就该为0了吧
 楼主| 发表于 2012-3-26 14:09:35 | 显示全部楼层
回复 6# SKILLER


   ker_i是在cout_r计数到1024x1024以后,即计满100万次以后保持一个时钟周期的高电平,作为下一步锁存信号的控制。就在cout_r==20'hfffff的时候为1,其他时间都为0的。请问一下我最后一段的输出有什么问题没有啊?为什么只是会闪一下,既然闪了一下说明还是检测到有下降沿的啊!可是为什么不能一直保持呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

X

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

GMT+8, 2025-6-7 03:47 , Processed in 0.023224 second(s), 9 queries , Gzip On, MemCached On.

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