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 么,那就不应该翻转啊。
初学者,百思不得其解。望解大师答!