1、请设计一个去抖动电路,要求能过滤脉冲宽度在2个时钟周期内的抖动。
module dbc(
input clk,
input rst_n,
input signal_i,
output signal_o
);
reg [2:0] signal_3;
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
signal_3 <= 0;
else begin
signal_3 <= { signal_3[1:0],signal_i };
end
end
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
signal_o <= 0;
else if( signal_3 == 3'b111 )
signal_o <= 1'b1;
else if( signal_3 == 3'b000 )
signal_o <= 1'b0;
else ;
end
endmodule
2、用verilog实现按键抖动消除电路,抖动小于15ms,输入时钟12MHz。
添加计数器,计数时间为15ms。若这段时间key_in保持不变,则key_in连接输出。若计数到中间,输入有变化,则重新计时。
(若未给出抖动时间,按经验,抖动时间一般会少于20ms. 也就是说,如果数据稳定20ms,认为可以采集该数据。)
module key(
input clk,
input rst_n,
input sw_in,
output sw_out
);
reg [19:0] cnt;
reg sw_in_r;
wire edge_p,edge_n,edge_en;
assign edge_en = edge_p | edge_n;
assign edge_p = sw_in & (~sw_in_r); //上升沿检测
assign edge_n = (~sw_in) & (sw_in_r); //下降沿检测
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
sw_in_r <= 0;
end
else begin
sw_in_r <= sw_in;
end
end
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
cnt <= 0;
end
else if(edge_en)
cnt <= 0;
else if(cnt == 180000)
cnt <= 0;
else
cnt <= cnt + 1;
end
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
sw_out <= 0;
end
else if(cnt == 180000)
sw_out <= sw_in;
else ;
end
endmodule
参考:https://blog.csdn.net/Reborn_Lee/article/details/89927569