El circuito antirrebote garantiza que, a pesar de que los rebotes pueden provocar la generación de múltiples señales, solo se registra una pulsación. La lógica digital, como registros de desplazamiento, contadores o filtros temporales, detectan un flanco estable del reloj y verifican que la señal del botón ha alcanzado un estado estable antes de ser considerada válida, permite la implementación de este circuito.
si analizamos elsiguiente codigo vemos que al presionar pulse, si es diferente de button_stable el contador de rebotes se mantiene contando, y si llega a 111 button_stable tomara el valor anterior en pulse, esto se analiza en cada flanco alto del reloj, si es igual, se manda el conteo a cero, esto para poder contar de nuevo cada que el boton detecte un cambio.
luego de ello button stable se iguala a button para tener la salida fisica la cualm ya no es afectada por el rebote.
Código Verilog
module debounce(
input wire clk, // Señal de reloj
input wire pulse, // Señal del botón (con rebotes)
output reg button // Señal del botón estabilizada (sin rebotes)
);
reg [2:0] debounce_counter; // Contador para el proceso de antirrebote
reg button_stable; // Señal intermedia para almacenar el estado estable del botón
always @(posedge clk) begin
if (pulse == button_stable) begin
debounce_counter <= 3'b000; // Reinicia el contador si el estado es estable
end else begin
debounce_counter <= debounce_counter + 1'b1; // Incrementa el contador
if (debounce_counter == 3'b111) begin
button_stable <= pulse; // Actualiza el estado estable cuando el contador alcanza el valor máximo
end
end
end
assign button = button_stable; // Asigna el estado estable al botón de salida
endmodule
Código Verilog
module debounce_led(
input wire clk,
input wire btn, // Entrada del botón (con rebotes)
output reg led // Salida
parameter TIME = 8'd200; // Tiempo de rebote (ajustable)
reg [7:0] count; // Contador para el proceso de debounce
reg previo_estado; // Estado anterior del botón
reg btn_estable; // Estado estable del botón
always @(posedge clk) begin
// Si el estado actual del botón es diferente al estado anterior :)
if (btn != previo_estado) begin
count <= TIME; // Reiniciar el contador a _TIME
end else if (count > 1) begin
count <= count - 1; // Decrementar el contador
end else if (count == 1) begin
btn_estable <= btn; // Actualizar el estado estable del botón cuando el contador llega a 1
end
// Actualizar el estado anterior del botón
previo_estado <= btn;
end
// Control del LED basado en el estado estable del botón
always @(posedge clk) begin
led <= ~btn_estable;
end
endmodule
esto seria todo espero les haya gustado.