Que es un boton anti-rebote:
Un mecanismo llamado circuito antirrebote evita que las señales de un botón detecten varias pulsaciones debido al ruido producido al presionar el botón. Las características mecánicas del interruptor permiten que, al presionar un botón mecánico, se produzcan varias transiciones rápidas entre los estados de "encendido" (1) y "apagado" (0). Se denominan este fenómeno "rebote" o "bouncing".


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.


Mostrar código Verilog

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
    
El siguiente codigo es para mi un poco mas sencillo y preciso, por ello he decidido ponerlo en esta misma seccion, asi pueden probar ambos, en este caso solo deberias introducirlo a tu ide, ajustar el constrains file y probar, igual que en el caso anterior, este segundo codigo en mi fpga funciono con mas precision que el primero, aunque no en todos los fpga's sera el caso. Mostrar código Verilog

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.