mikrocontroller.net

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


Autor: Stefan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

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

Bewertung
0 lesenswert
nicht lesenswert
Mach deine Takterzeugung anders.
Deine Version:
    taktteiler_fuer_debounceing: process(clock, reset) ---------- reset unnötig, weil synchron
    begin
      if rising_edge(clock) then
   :
   :
          if takt_counter < (TOPVALUE/2) then
            clock_debounce <= '0';
            takt_counter <= takt_counter + 1;
          elsif (takt_counter >= (TOPVALUE/2) AND takt_counter < TOPVALUE) then
            clock_debounce <= '1';
            takt_counter <= takt_counter + 1;
          else
              clock_debounce <= '0';
            takt_counter <= 1;
          end if;
        end if;
      end if;
    end process;


    entprellung: process(clock_debounce)
    begin
      if rising_edge(clock_debounce) then
        if(syncreset != RESETVALUE) then
   :
   :

Schreib das besser als Clock-Enable:
    taktteiler_fuer_debounceing: process(clock)
    begin
      if rising_edge(clock) then
      :
      :   
          clockenable_debounce <= '0';
          if (takt_counter = TOPVALUE) then  -- Ueberlauf
            clockenable_debounce <= '1';
            takt_counter   <= 0;
          else
            takt_counter <= takt_counter + 1;
          end if;
        end if;
      end if;
    end process;


    entprellung: process(clock)
    begin
      if rising_edge(clock_debounce) then
        if (syncreset != RESETVALUE) then
          if (clockenable_debounce='1') then
   :
   :
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:
  :
    signal takt_counter : integer := 0;
    signal syncreset: std_logic := '0';  -- sollten sowieso 2 FFs sein
    signal clock_debounce: std_logic := '0';
  :
  :




BTW:
Das eine FF zum Einsynchronisieren des Resets reicht noch nicht aus:
    process(clock)
    begin
      if rising_edge(clock) then
        syncreset <= reset;
      end if;
    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-Einsyn...

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

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.