Entprellung 3*4 Tastenfeld

Gast #1247149
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
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #1247162
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 ;-)

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.