本帖最后由 YCD1234 于 2020-6-1 21:19 编辑
一个检测按键按下的消抖状态机,为什么quartus中在
1:
if(cnt >= 999999)begin
state <= 2;
cnt_en <= 1'b0;
end
这种写法下就不能看到状态转换图但是换成
1:
if(cnt == 999999)begin
state <= 2;
cnt_en <= 1'b0;
end
就可以看到
以下是源码
module key_detect(
clk,
key,
rst_n,
led
);
input clk;
input key;
input rst_n;
output [3:0]led;
reg key_r;
always@(posedge clk)
key_r <= key; //clk上升沿的时候为key_r赋key的值
wire key_nedge;
wire key_pedge;
assign key_nedge = (!key)&&key_r;//因为key按下后在下一个时钟上升沿key_r才会变化所以key下降沿时会出现key为低而key_r依旧保持上一个时钟上升沿赋值时的高
assign key_pedge = (!key_r)&&key;
reg [19:0]cnt;
reg cnt_en;
always@(posedge clk,negedge rst_n)begin
if(!rst_n)
cnt <= 0;
else if(cnt_en)
cnt <= cnt + 1'b1;
else
cnt <= 0;
end
reg [1:0]state;
always@(posedge clk,negedge rst_n)begin
if(!rst_n)
state <= 0;
else
case(state)
0:
if(key_nedge)begin
state <= 1;
cnt_en <= 1'b1;
end
else
state <= 0;
1:
if(cnt == 999999)begin
state <= 2;
cnt_en <= 1'b0;
end
else if(key_pedge)begin
cnt_en <= 1'b0;
state <= 0;
end
else
state <= 1;
2:
if(key_pedge)begin
cnt_en <= 1'b0;
state <= 3;
end
else
state <= 2;
3:
if(cnt == 999999)begin
state <= 0;
cnt_en <= 1'b0;
end
else if(key_pedge)begin
state <= 2;
cnt_en <= 1'b0;
end
else
state <= 3;
default : state <= 0;
endcase
end
endmodule
|