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


von Cutty (Gast)


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
1
entity Entpreller is
2
  port
3
  ( 
4
    clk,reset:  in std_logic;
5
    in_Sig  :  in std_logic;
6
    out_Sig  :  out std_logic  
7
  );
8
end entity;
9
10
architecture rtl of Entpreller is 
11
  signal count  :  integer range 0 to 149999;
12
  signal clk_100Hz:  std_logic;
13
  signal state  :  std_logic;
14
begin
15
  div_100Hz :  process(clk,reset) is
16
  begin
17
  if reset ='0' then
18
    clk_100Hz <= '0';
19
    count <= 0;
20
    elsif(rising_edge(clk)) then
21
      if(count = 149999) then
22
        count <= 0;
23
        clk_100Hz <= '1';
24
      else
25
        count <= count + 1;
26
        clk_100Hz <= '0';
27
      end if;
28
    end if;
29
  end process div_100Hz;
30
  
31
  debounce : process (clk) is
32
  begin
33
    if (rising_edge(clk))then
34
      if(clk_100Hz = '1') then
35
        if(in_Sig = state) then
36
          out_Sig <= in_Sig;
37
        end if;
38
        state <= in_Sig;
39
      end if;
40
    end if;
41
  end process debounce;
42
end rtl;

von Michael S. (Firma: www.das-labor.org) (laborsauron)


Lesenswert?

> Besonders der erste Prozess "div_100Hz"
1
 div_100Hz :  process(clk,reset) is
2
  begin
3
  if reset ='0' then              -- Synchroner Reset
4
    clk_100Hz <= '0';             -- Rücksetzen des 100 Hz Pulses
5
    count <= 0;                   -- Rücksetzen des Counters
6
    elsif(rising_edge(clk)) then
7
      if(count = 149999) then     -- Counter Endwert erreicht ?
8
        count <= 0;               -- Dann Counter auf 0
9
        clk_100Hz <= '1';         -- und Kurzer Impuls auf clk_100Hz
10
      else
11
        count <= count + 1;       -- Endwert nichz erreicht
12
        clk_100Hz <= '0';         -- dann weiter Zählen
13
      end if;
14
    end if;
15
  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
1
    if (rising_edge(clk))then
2
      if(clk_100Hz = '1') then
3
       ... 
4
       state <= in_Sig;
5
      end if;
6
    end if;

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.