|
本帖最后由 lcytms 于 2016-11-4 17:28 编辑
设计算是完成了。
我们再来进行一些扩展的思考。
有些时候,我们需要输出的是一个按键脉冲,表示按下了一次键。
而我们之前的程序仅仅是做了一个单纯的10ms滤波,也就是要求按键按下、释放均需经过10ms持续保持时间再确认。
我们对之前的程序稍微修改一下,就可以达到这个目的。
也就是在滤波结果的下降沿输出一个对应的脉冲即可,类似于flag标志信号,我们这里称之为key_flag,即按键标志信号。
我们新建一个key_flag.v文件。
module key_flag (clk, rst_n, key_n, key_out);
input clk, rst_n;
input key_n;
output key_out;
reg click_n;
parameter MASK_TIME = 500_000; // 10ms/20ns = 500_000, for checking key hold time
reg [18:0] cnt;
reg state;
localparam s0 = 1'b0,
s1 = 1'b1;
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
cnt <= 0;
click_n <= 1;
state <= s0;
end
else
begin
case (state)
s0 : begin
if (key_n)
begin
cnt <= 0;
click_n <= 1;
state <= s0;
end
else
begin
if (cnt < MASK_TIME - 1)
begin
cnt <= cnt + 19'b1;
state <= s0;
end
else
begin
cnt <= 0;
click_n <= 0;
state <= s1;
end
end
end
s1 : begin
if (!key_n)
begin
cnt <= 0;
click_n <= 0;
state <= s1;
end
else
begin
if (cnt < MASK_TIME - 1)
begin
cnt <= cnt + 19'b1;
state <= s1;
end
else
begin
cnt <= 0;
click_n <= 1;
state <= s0;
end
end
end
default : state <= s0;
endcase
end
end
reg click_r_n;
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
click_r_n <= 1;
else
click_r_n <= click_n;
end
assign key_out = click_r_n & ~click_n;
endmodule
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?我要注册
x
|