|
最经典的那段代码似懂非懂,所以按自己的想法重新写。区别是按下按键 LED灯亮,松开后立刻熄灭。这样做比较实用,一般使用按键都是松开后才相应(有的情况下需要检测长按,有的情况下长按按键将视为误操作,不相应该按键)。
module example2(clk_50MHz,rst_n,Key,Led);
input clk_50MHz;
input rst_n;
input [3:0] Key;
reg [3:0] KeyLast;
output [3:0] Led;
reg [3:0] Led;
reg [20:0] count1;
always@(count1 or rst_n)
begin
if(rst_n == 'b0)
begin
KeyLast <= Key;
end
else if(count1 == 'd1000000)
KeyLast <= Key;
end
always@(posedge clk_50MHz or negedge rst_n)
begin
if(rst_n == 'b0)
count1 <= 'd0;
else
if((KeyLast != Key) && (count1 <= 'd1000000))
count1 <= count1 + 'd1;
else
count1 <= 'd0;
end
always@(count1 or rst_n)
begin
if(rst_n == 'b0)
Led <= 'b0000;
else
if(count1 == 'd1000000)
Led <= KeyLast;
end
endmodule
测试的时候出了点小问题,只有key2是正常的,其余3个按键按下立刻相应,但是弹起需要1~2s后才相应(觉的应该是按键问题,没有深究)。另外这种写法相应速度有些,可以连续按下某个按键,查看LED的闪烁速度,一般情况下应该够用,但是特殊情况下(有些)可能不够,需要再优化。