www.mikrocontroller.net

Forum: FPGA, VHDL & Co. was macht diese Tasterentprellung?


Autor: Cutty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo :)

habe mir diesen VHDL-Code zur Tasterentprellung besorgt. Funktioniert 
auch ganz prima, nur weiß ich leider nicht 100%ig was da eigentlich 
dahintersteckt. Kann mir das jemand bitte in einfachen Worten erklären? 
Besonders der erste Prozess "div_100Hz" und was eigentlich das Signal 
state macht (wird nur einmal aufgerufen?).
Danke schonmal im Voraus :).

gruß Cutty
entity Entpreller is
  port
  ( 
    clk,reset:  in std_logic;
    in_Sig  :  in std_logic;
    out_Sig  :  out std_logic  
  );
end entity;

architecture rtl of Entpreller is 
  signal count  :  integer range 0 to 149999;
  signal clk_100Hz:  std_logic;
  signal state  :  std_logic;
begin
  div_100Hz :  process(clk,reset) is
  begin
  if reset ='0' then
    clk_100Hz <= '0';
    count <= 0;
    elsif(rising_edge(clk)) then
      if(count = 149999) then
        count <= 0;
        clk_100Hz <= '1';
      else
        count <= count + 1;
        clk_100Hz <= '0';
      end if;
    end if;
  end process div_100Hz;
  
  debounce : process (clk) is
  begin
    if (rising_edge(clk))then
      if(clk_100Hz = '1') then
        if(in_Sig = state) then
          out_Sig <= in_Sig;
        end if;
        state <= in_Sig;
      end if;
    end if;
  end process debounce;
end rtl;

Autor: Michael Sauron (Firma: www.das-labor.org) (laborsauron)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Besonders der erste Prozess "div_100Hz"
 div_100Hz :  process(clk,reset) is
  begin
  if reset ='0' then              -- Synchroner Reset
    clk_100Hz <= '0';             -- Rücksetzen des 100 Hz Pulses
    count <= 0;                   -- Rücksetzen des Counters
    elsif(rising_edge(clk)) then
      if(count = 149999) then     -- Counter Endwert erreicht ?
        count <= 0;               -- Dann Counter auf 0
        clk_100Hz <= '1';         -- und Kurzer Impuls auf clk_100Hz
      else
        count <= count + 1;       -- Endwert nichz erreicht
        clk_100Hz <= '0';         -- dann weiter Zählen
      end if;
    end if;
  end process div_100Hz;
und was eigentlich das Signal
state macht (wird nur einmal aufgerufen?).

nein, es wird mit jedem clk_100Hz impuls der wert inSig zugewisen


    if (rising_edge(clk))then
      if(clk_100Hz = '1') then
       ... 
       state <= in_Sig;
      end if;
    end if;

Zu beachten ist ausserdem noch, dass der clk_100Hz kein richtiger clock 
ist. Er ist 14999 Takte = 0 und einen Takt = 1

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
state ist ein unglücklicher Name für ein Flipflop, in das der Pegel 
des Eingangssignals hineingetaktet wird. Nur, wenn dann dieser vorherige 
Pegel mit dem aktuellen übereinstimmt, wird der Eingang direkt auf den 
Ausgang gespeichert. Diese Entprellung dauert also 20ms und hat nur 1 
Vergleicherstufe. Für reale Taster bevorzuge ich mehrere Stufen, damit 
ein Signal nicht nur an 2 Abtastzeitpunkten zufällig mal gleich sein 
muß.

Insgesamt ist die Registertiefe für eine saubere Einsynchronisierung 
noch nicht ausreichend. Denn es wird ja wie gesagt der Eingang mit dem 
Takt auf den Ausgang zugewiesen. Das ist nur 1 Ffipflop. Sauber 
einsynchronisiert ist erst nach 2 FFs.

> dass der clk_100Hz kein richtiger clock ist.
Sondern es ist ein Clock-Enable. Und auch hier ist der Name clk_10ms 
wieder sehr ungünstig gewählt...
>>> Besonders was der erste Prozess "div_100Hz" ... macht
Er sorgt dafür, dass aus dem 15MHz-Takt jeweils nach 10ms für 1 
Taktzyklus lang das Clock-Enable clk_10ms aktiv ist. Das hatten wir 
schon mal im Beitrag "Re: Unterschied clockenable und frequenzteiler"

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.