脉冲边沿检测
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
脉冲边缘检测法:
Reg[2:0] key_rst; //用来保存按键的值
Reg[2:0] key_rst_r; //用来保存key_rst的值
always @(posedge clk or negedge rst)
begin
if(!rst)key_rst<=3’b111;
else
key_rst<={key1,key2,key3};//将三个按键的值都赋给key_rst
end
always @ (posedge clk or negedge rst)
begin
if(!rst) key_rst_r<=3’b111;
else
key_rst_r<=key_rst;
end
wire[2:0] key_an;
assign key_an=key_rst_r&(~key_rst);//实现了记录由低电平按下的目的到此就可以判断有按键按下或有抖动。这两个是那一个到此还不确定。
Reg[2:0] low_sw;
Reg[2:0] low_sw_r;
Reg[19:0] cnt;
always @(posedge clk or negedge rst)
begin
if(!rst) cnt<=20’d0;
else if(key_an) cnt<=20’d0;
else cnt<=cnt+1’b1;
end
always @(posedge clk or negedge clk)
begin
if(!rst) low_sw<=3’b111;
else if(cnt==20’hfffff)
low_sw<={key1,key2,key3};
end
always @(posedge clk or negedge rst)
begin
if(!rst) low_sw_r<=3’b111;
else
low_sw_r<=low_sw;
end
wire[2:0] led_ctrl
assign led_ctrl=low_sw_r&(~low_sw);
到此就可以判断是按键按下还是抖动了,如果led_ctrl=1那就是按键按下了,如果led_ctrl=0,则是抖动。
注:开始时按键接的脚为高电平。当按键按下时按键对应的脚为低电平。
程序说明:
来一个时钟脉冲,则就将按键的值赋给key-rst,同时也将key-rst的值赋给key-rst—r。当没按下按键时,key-rst为高电平。在来一个时钟脉冲,则这个高电平又赋给了,此时key_an 的值为0;当有按键按下时,key-rst由1变为了0,而key-rst-r这为key_rst的原来的值1.此时key_an的值为 1.从而记下了有按键按下这个信息。如果key-rst为 111001 那么key_rst_r为 111001