这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 消斗按键疑问

共12条 1/2 1 2 跳转至

消斗按键疑问

助工
2013-07-10 22:51:43     打赏

module KeyTop(led_out,sys_clk,sys_rsn,key_in);
input sys_clk,sys_rsn;
input key_in;
output reg led_out;

wire key_scan;
wire key_low;
reg [19:0] delay_cnt;
reg key_Sample;
reg key_Sample_r;
reg key_rst;
reg key_rst_r;

//判断是否有按键按下
always @ (posedge sys_clk or negedge sys_rsn)
begin
if(!sys_rsn)
key_Sample<=1'd1;
else
key_Sample<=key_in;
end

always @ (posedge sys_clk or negedge sys_rsn)
begin
if(!sys_rsn)
key_Sample_r<=1'd1;
else
key_Sample_r<=key_Sample;
end

assign key_scan= (~key_Sample) & key_Sample_r;

//20ms延时
always @ (posedge sys_clk or negedge sys_rsn)
begin
if(!sys_rsn)
delay_cnt <= 20'h0;
else if(key_scan)
delay_cnt <= 20'h0;
else
delay_cnt <= delay_cnt + 1;
end
//延时时间到,判断此时装态
always @ (posedge sys_clk or negedge sys_rsn)
begin
if(!sys_rsn)
key_rst <= 1'd1;
else if(delay_cnt==20'hfffff)
key_rst <= key_in;
end

always @ (posedge sys_clk or negedge sys_rsn)
begin
if(!sys_rsn)
key_rst_r <= 1'd1;
else
key_rst_r <= key_rst;
end

assign key_low=key_rst_r & (~key_rst);

always @ (posedge sys_clk or negedge sys_rsn)
begin
if(!sys_rsn)
led_out <= 1'd1;
else if(key_low)
led_out <= ~led_out;
else
led_out<=led_out;
end

endmodule

这个是教程里的程序,我敲了一遍。验证了一下!但是我有一点疑问还不清楚请大神赐教!

一开始检测到按钮下降沿,然后开始延时计时,时间到了之后应该按键电平是稳定的了,这个时候不就是需要判断是否按键还处在低电平不就好了么。电平稳定后这个assign key_low=key_rst_r & (~key_rst)里面的key_rst_r和key_rst不应该都是0么?那结果 key_low不就等于0 么,那就不应该翻转啊。

初学者,百思不得其解。望解大师答!




关键词: 消斗     按键    

院士
2013-07-11 00:51:18     打赏
2楼

楼主说的方法可以,在ARM下延时消抖的方法就是检测低电平,而非边沿。

关于逻辑关系,我觉得楼主再仔细一些分析,实验结果为正确的,只能说明楼主的分析是错误的。



助工
2013-07-11 08:51:07     打赏
3楼

谢谢!我也希望大侠指出我分析的错误之处,谢谢


院士
2013-07-11 08:53:09     打赏
4楼
谁再给看看

助工
2013-07-11 09:13:01     打赏
5楼

高工
2013-07-11 09:41:58     打赏
6楼

我来给你解释一下吧,这是FPGA中一种常用的思想,边沿检测,非常常用,你要理解key_rst_r和key_rst的关系,要理解下面的程序,

always @ (posedge sys_clk or negedge sys_rsn)
begin
if(!sys_rsn)
key_rst_r <= 1'd1;
else
key_rst_r <= key_rst;
end
当前状态下key_rst为0,key_rst_r就一定为0吗?这个画个波形图就十分的清晰了。上面的程序描述的是一个什么数字电路?如果你能搞明白以上两个问题,你的疑问也就迎刃而解了。百度搜搜多了解下边沿检测的思想吧。我不直接告诉你答案,告诉你思路,还是自己想明白了比较好,一旦想明白了,你就掌握边沿检测的思想了。


工程师
2013-07-11 09:57:57     打赏
7楼
赞回复,给个思路和解决方法,让楼主自己去搜索学习。这样学到的东西是自己的。论坛里的伸手党太多了,有个简单问题就上来问,就要答案不问为什么。这样提高不了的~~~~

高工
2013-07-11 10:10:06     打赏
8楼

其实楼主理解的也很到位了,对于楼主的的疑问,我再解释下,正如楼主所说,

一开始检测到按钮下降沿,然后开始延时计时,时间到了之后应该按键电平是稳定的了,这个时候不就是需要判断是否按键还处在低电平不就好了么。电平稳定后这个assign key_low=key_rst_r & (~key_rst)里面的key_rst_r和key_rst不应该都是0么?那结果 key_low不就等于0 么,那就不应该翻转啊。

楼主要看清LED翻转(亮灭)的条件, key_low为0时,翻转吗?嘻嘻!注意看程序:

always @ (posedge sys_clk or negedge sys_rsn)
begin
if(!sys_rsn)
led_out <= 1'd1;
else if(key_low)
led_out <= ~led_out;
else
led_out<=led_out;
end

 


助工
2013-07-11 10:21:34     打赏
9楼
电平稳定后这个assign key_low=key_rst_r & (~key_rst)里面的key_rst_r和key_rst不应该都是0么?那结果 key_low不就等于0 么。我的意思是既然20ms后的电平已经稳定了!那这时候为0应该是要翻转的。因为电平稳定而且按键是按下状态所以进行一次翻转。大神求解!

高工
2013-07-11 10:30:51     打赏
10楼

你要理解程序所实现的功能,按键按下LED亮,再次按下LED灭,楼主还需再理解消抖的基本原理。


共12条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]