Î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.

Semnalul la apasarea si lasarea unui buton

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ă.

Cum implementăm un debouncer?

Cum implementăm un debouncer?

debouncer.v
// 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 de delay, pe care îl incrementăm
            // Reținem starea butonului
            // Actualizăm ieșirea debouncerului doar când contorul revine la 0 
            // (adică abia după ce a trecut delay-ul vom lua în considerare starea butonului)
        end
    end
 
endmodule

Un exemplu de cum folosim debouncerul:

Hello.v
module Hello(
    output reg led,
    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
            led <= 0;
	end else begin
            led <= ~led;
        end
    end
 
endmodule
 

Soluție hardware debouncing

Soluție hardware debouncing

Oricând lucrăm cu butoane sau întrerupatoare trebuie sa luăm în considerare fenomenul de debouncing. De multe ori întârzierea dată de execuţia codului este de ajuns pentru a ascunde acest fenomen, însă nu trebuie să ne bazăm niciodată pe asta!

soc/laboratoare/03bis/debouncing.txt · Last modified: 2024/03/08 14:22 by dconstantinescu1704
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0