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

共6条 1/1 1 跳转至

消斗按键疑问

助工
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 08:51:07     打赏
2楼

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


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

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

助工
2013-07-11 10:39:45     打赏
5楼
我不理解的是assign key_low=key_rst_r & (~key_rst)这条语句。key_rst_r和key_rst我个人理解是在电平稳定后。两个状态是一样的所以key_low是低。 现在就是满足了两个条件 1,检测到按键下降沿 2,延时过后电平保持低。那结果应该是这个时候key_low为低应该触发led翻转啊,不理解程序中key_low为高时候的翻转


助工
2013-07-12 12:23:24     打赏
6楼

昨天晚上回去琢磨了下!终于想通了!

我的盲点就在assign key_low=key_rst_r & (~key_rst)这条语句上!

在没有按键时key_rst和key_rst_r 都是高电平,主要是key_rst和key_rst_r 状态是要经过20ms才变化!所以当20ms后key_rst接收到key_in为低时,此时key_rst_r还为高,所以 key_rst_r 和key_rst 又恰好形成了下降沿!所以key_low这个时候为高电平。理所应当led翻转。

理解一个问题后很开心啊,虽然是很简单的问题。谢谢51大师的耐心指点。


共6条 1/1 1 跳转至

回复

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