www.mikrocontroller.net

Forum: FPGA, VHDL & Co. PB-Taster entprellen mit Schiebregister


Autor: 655432 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich verstehe folgenden Code zur Entprellung eines PB-Tasters nicht. Es 
handelt sich dabei um die DEBOUNCE-Funktion aus der Library UP1-Core von 
Quartus II.
 ENTITY debounce IS
  PORT(pb, clock_100Hz   : IN  STD_LOGIC;
     pb_debounced    : OUT  STD_LOGIC);
END debounce;

ARCHITECTURE a OF debounce IS
  SIGNAL SHIFT_PB     : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN

  -- Debounce clock should be approximately 10ms or 100Hz
  PROCESS
  BEGIN
      WAIT UNTIL (clock_100Hz'EVENT) AND (clock_100Hz = '1');
    -- Use a shift register to filter switch contact bounce
      SHIFT_PB(2 DOWNTO 0) <= SHIFT_PB(3 DOWNTO 1);
      SHIFT_PB(3) <= NOT PB;
      IF SHIFT_PB(3 DOWNTO 0)="0000" THEN
         PB_DEBOUNCED <= '0';
      ELSE 
          PB_DEBOUNCED <= '1';
      END IF;
  END PROCESS;
END a; 

Mittlereile ist mir klar, dass das Signal pb um 40 ms verzögert wird. 
Nur wie das genau passiert (so ab der ersten If-Anweisung) ist mir nicht 
so ganz klar. Ich hoffe ihr könnt mir weiterhelfen.

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Prinzip wird so über die letzten 4 Taktzyklen getestet, ob die
Taste gedrückt ist (hier gedrückt gleich logisch 0). Ist das Signal
nicht stabil (z.B. ="0010","0110" etc.), dann wird '1' rausgegeben.
Eigentlich wird nur getestet, ob die Taste gedrückt wird, es wird
aber nicht das Loslassen entprellt!

Um z.B. zu testen, ob die Taste losgelassen wurde, muss die Zeile

  IF SHIFT_PB(3 DOWNTO 0)="0000" THEN

zu

  IF SHIFT_PB(3 DOWNTO 0)="1111" THEN

geändert werden. Für ein vollständiges Entprellen bräuchtest Du
also zwei Signale PB_DEBOUNCED_DOWN und PB_DEBOUNCED_UP.

Autor: 655432 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK danke Jörg, dass hast du verständlich erklärt. Ich bin noch nicht fit 
in VHDL.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da  hätte ich auch mal eine Frage. Welche Technik würde man in der 
Praxis zum Entprellen eines Tasters verwernden.
a) Die oben beschriebene inkl. eines Clockdividers o.ä.
oder
b) Die Beschreibung mit einem runterzählenden Counter, der sich bei 
einer Störung zurücksetzt. Diesen kann man ja am normalen Clock 
betreiben, wenn man nur den Counter groß genug wählt. (50MHz bei meinem 
S3 Board)

bspw.
signal key_old, key_tmp: std_logic;
signal cnt: std_logic_vector(19 downto 0);

-- begin
 
deb:process(CLK_50)
begin
  if rising_edge(CLK_50) then
    key_tmp <= KEY_IN;
    if key_tmp /= key_old then
      cnt <= cnt-1;
    else
      cnt <= (others => '1');
    end if;
    if cnt=0 then
      key_old <= key_tmp;
    end if;
  end if;
end process deb;
KEY_OUT <= key_old;


Gibt es einen Grund, einer dieser Techniken den Vorzug zu geben, oder 
macht man das in der Praxis nochmal ganz anders?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.