În general în momentul în care apăsǎm un buton sau schimbǎm un întrerupǎtor semnalul la ieşire nu este unul treaptǎ (cum ar fi ideal şi ne-ar ajuta foarte mult). De fapt semnalul arată ca în figura urmǎtoare.
Din această cauză citirea unui astfel de input poate genera aparenţa mai multor apăsări. Pentru a detecta corect o apăsare trebuie să folosim un circuit (sau o logică) de debouncing. În cea mai simplă formă acesta este un delay: citim semnalul, aşteptăm o perioadă până când acesta s-a stabilizat şi acum luăm în considerare valoarea obţinută. Forma corectă de a proiecta un debouncer este de a ţine minte perioada dintre douǎ schimbări ale semnalului. În cazul în care această perioadă este mai mică decât o valoare de prag considerăm că semnalul nu s-a stabilizat şi valoarea nu este de încredere, altfel valoarea poate fi folosită.
// Pseudocod pentru debouncer module debouncer( output reg button_out, input clk, input reset, input button_in ); always @(posedge clk) begin if (reset == 1) begin // resetăm ieșirea și alte auxiliare end else begin // Ținem un contor intern de delay, pe care îl creștem // Reținem schimbările butonului // Actualizăm ieșirea debouncerului doar când contorul revine la 0 end end endmodule
Un exemplu de cum folosim debouncerul:
module Hello( output reg button_pressed, input button_in, input clk, input reset ); wire button_debounced; // Instantiem modulul de debouncer si ii dam butonul ca intrare // Iesirea modulului (button_debounced) identifica corect apasarea // butonului dat ca intrare si va fi folosita in restul programului // in locul lui button_in debouncer db(button_debounced, clk, reset, button_in); always @(posedge button_debounced, posedge reset) begin if (reset == 1) begin button_pressed <= 0; end else begin button_pressed <= ~button_pressed; end end endmodule