2020-02-03 11:14发布
297229936 发表于 2016-8-15 10:22 代码改了下,抛开了按键,CPLD内部直接连通,就没有那么多0了,果然大神啊!膜拜!谢谢指导!不胜感激! ...
玄德 发表于 2016-8-15 10:15 20ns的抖动处理 不是毫秒?
最多设置5个标签!
稍加点拨就有结果,孺子可教!
按键部分的代码:
reg[3:0]keyr;
always@(posedge clk or negedge key_rst)
if(!key_rst)keyr<=4'b1111;
else keyr <= {keyr[2:0],key_sel};
wire key_pos = keyr[2]&~keyr[3];
wire key_neg = ~keyr[2]&keyr[3];
reg[19:0] cnt;
always@(posedge clk or negedge key_rst)
if(!key_rst)cnt <= 20'd0;
else if(key_neg||key_pos) cnt <= 20'd0;
else if(cnt <=20'd999_999)cnt <= cnt +1'b1;
else cnt <= 20'b0;
reg[1:0]key_value;
always@(posedge clk or negedge key_rst)
if(!key_rst) key_value[0] <= 1'b1;
else if(cnt==20'd999_999)key_value[0] <=keyr[3];
always@(posedge clk or negedge key_rst)
if(!key_rst)key_value[1] <=1'b1;
else key_value[1] <= key_value[0];
wire led_ctrl = ~key_value[0]&key_value[1];
always@(posedge clk or negedge key_rst)
begin
if(!key_rst)
state_code <=1'b0;
else
begin
if(led_ctrl)
begin
if(state_code == 1'b1)
state_code <= 1'b0;
else
state_code <= 1'b1;
end
end
end
请指导,为什么会出现那么多00?
20ms 锁存一次键值
应当是消抖没起到作用,造成开关抖动。
没细看全部代码,但这段就有逻辑问题,消抖根本无效:
只有第一个else在运行,后面两个根本没进入。
always@(posedge clk or negedge key_rst)
if(!key_rst)cnt <= 20'd0;
else if(key_neg||key_pos) cnt <= 20'd0;
else if(cnt <=20'd999_999)cnt <= cnt +1'b1;
else cnt <= 20'b0;
一周热门 更多>