Forum: FPGA, VHDL & Co. Entprellung 3*4 Tastenfeld


von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich weiß zwar nicht, ob sich jemand von euch die Mühe machen will, 
meinen Code durchzuschauen, aber ich poste ihn trotzdem mal im Anhang.

Ich habe ein 3*4 Tastenfeld, das ich entprellen will und bei dem ich die 
gedrückten Tasten ermitteln will. Letzteres funtioniert zwar, aber nur 
mit dem Takt "clock", einem 100MHz Takt einer PLL.

Ich teile den 100MHz Takt, sodass ich einen von etwa 100Hz bekomme 
("clock_debounce").
Bei der ersten steigenden Flanke von clock_debounce lese ich die Werte 
der Tasten-Reihen und Spalten ein. Bei der zweiten mache ich das nochmal 
und vergleiche sie mit den alten und wenn sie übereinstimmen, hab ich 
einen neuen gültigen Wert.
Mein Problem ist, das das Ganze mit dem neuen Takt "clock_debounce" 
nicht funktioniert.

Die Signale:  deb_state,  previous_tst_r0,  previous_tst_r1, 
previous_tst_r2, previous_tst_r3, previous_tst_c0,  previous_tst_c1, 
previous_tst_c2, taste0_9, taste_enter, taste_operation
sollten eigentlich beim Reset (in einem anderen Process) zurüchgestzt 
werden, tun es aber nicht. Die Behavioral Simulation zeigt sie als "U" 
uninitialisiert an und sie ändern ihren Wert auch später nicht, wenn sie 
es eigentlich sollten.

Das Ganze funktioniert allerdings wie schon gesagt mit der normalen 
clock schon.

Wäre echt toll, wenn mir jemand weiterhelfen könnte.
Ich bin ziemlich ratlos.

Viele Grüße,
Stefan

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


Lesenswert?

Mach deine Takterzeugung anders.
Deine Version:
1
    taktteiler_fuer_debounceing: process(clock, reset) ---------- reset unnötig, weil synchron
2
    begin
3
      if rising_edge(clock) then
4
   :
5
   :
6
          if takt_counter < (TOPVALUE/2) then
7
            clock_debounce <= '0';
8
            takt_counter <= takt_counter + 1;
9
          elsif (takt_counter >= (TOPVALUE/2) AND takt_counter < TOPVALUE) then
10
            clock_debounce <= '1';
11
            takt_counter <= takt_counter + 1;
12
          else
13
              clock_debounce <= '0';
14
            takt_counter <= 1;
15
          end if;
16
        end if;
17
      end if;
18
    end process;
19
20
21
    entprellung: process(clock_debounce)
22
    begin
23
      if rising_edge(clock_debounce) then
24
        if(syncreset != RESETVALUE) then
25
   :
26
   :

Schreib das besser als Clock-Enable:
1
    taktteiler_fuer_debounceing: process(clock)
2
    begin
3
      if rising_edge(clock) then
4
      :
5
      :   
6
          clockenable_debounce <= '0';
7
          if (takt_counter = TOPVALUE) then  -- Ueberlauf
8
            clockenable_debounce <= '1';
9
            takt_counter   <= 0;
10
          else
11
            takt_counter <= takt_counter + 1;
12
          end if;
13
        end if;
14
      end if;
15
    end process;
16
17
18
    entprellung: process(clock)
19
    begin
20
      if rising_edge(clock_debounce) then
21
        if (syncreset != RESETVALUE) then
22
          if (clockenable_debounce='1') then
23
   :
24
   :
Dann hast du im ganzen Design nur 1 Takt. Und das ist gut so.


> Die Signale:  deb_state,  previous_tst_r0,  previous_tst_r1, ....
> sollten eigentlich beim Reset (in einem anderen Process) zurüchgestzt
> werden, tun es aber nicht. Die Behavioral Simulation zeigt sie als "U"
> uninitialisiert an und sie ändern ihren Wert auch später nicht, wenn sie
> es eigentlich sollten.
Wie lange ist dein Reset-Impuls?

Initialisiere die Signale mit Werten:
1
  :
2
    signal takt_counter : integer := 0;
3
    signal syncreset: std_logic := '0';  -- sollten sowieso 2 FFs sein
4
    signal clock_debounce: std_logic := '0';
5
  :
6
  :




BTW:
Das eine FF zum Einsynchronisieren des Resets reicht noch nicht aus:
1
    process(clock)
2
    begin
3
      if rising_edge(clock) then
4
        syncreset <= reset;
5
      end if;
6
    end process;
zum Einsynchronisieren solltest du (mindestens) 2 FFs hintereinander 
schalten. Hier eine Erklärung zu dem Thema:
http://www.lothar-miller.de/s9y/archives/41-Einsynchronisieren-von-asynchronen-Signalen.html

Brauchst du überhaupt einen Reset?
Xilinx sagt dazu:
>>>> Reset costs more than you think <<<<
Siehe dazu den Beitrag "Re: Fläche des Designs optimieren"
und dort insbesondere auch den letzten Post ;-)

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.