Forum: FPGA, VHDL & Co. gedrueckter key soll led im wechsel zum leuchten bringen und dunkel machen


von takeiteasy (Gast)


Lesenswert?

Hallo,
seit über einer Stunde versuche ich ein eigentlich einfaches Programm
auf einem Altera Board DE1 zum Laufen zu bringen.
Beim Drücken von Key0 soll abwechselnd das LEDG(0) zum leuchten gebracht
werden und beim erneuten Drücken wieder dunkel werden usw...

Jedoch muss ich oft mehrmals den Key drücken, damit das LED leuchtet 
bzw.
wieder dunkel wird.

Hoffentlich kann mir jemand helfen, ich hoffe nicht dass das Board einen 
Defekt hat.   Vielen Dank.


library ieee;
use ieee.std_logic_1164.all;


entity test is
  port(
    ledg: out std_logic_vector(0 downto 0);
    key: in std_logic_vector(3 downto 0)
  );
end test;

architecture arch of test is
signal modus: std_logic;
begin
  process(key)
  begin

  if((key="1110") and (modus = '0')) then
    ledg <="1";
    modus <= '1';
  elsif((key="1110") and (modus='1')) then
    ledg <="0";
    modus <= '0';
  else
    modus <= modus;

  end if;
  end process;
end arch;

von VHDL hotline (Gast)


Lesenswert?

Der key muss in einem taktgesteuerten Prozess einsynchronisiert und 
entprellt werden. Dann wird abhängig vom key das led signal in ein 
taktgesteuertes Speicherelement = Register geschrieben.
Gibt es für das Board denn kein Demoprogramm, dann siehst du ja ob alles 
funktioniert und kannst dir mal den Code davon anschauen.

von takeiteasy (Gast)


Lesenswert?

Vielen Dank.
Am Board scheint es nicht zu liegen, andere Programme laufen problemlos.


Ich habe das Programm jetzt umgeschrieben, muss aber immer noch oft 
mehrmals den Key drücken damit das LED an- bzw. ausgeht.   Ich dachte
die Key sind schon entprellt?


library ieee;
use ieee.std_logic_1164.all;


entity test is
  port(
    ledg: out std_logic_vector(0 downto 0);
    key: in std_logic_vector(3 downto 0);
    clk: in std_logic
  );
end test;

signal modus: std_logic;
signal sonst: std_logic;

begin
  modus <= sonst;
  process(clk, key, modus)
  begin
    if(clk'event and clk='1') then
      if((key="1110") and (modus = '0')) then
        ledg <="1";
        sonst <= '1';

      elsif((key="1110") and (modus='1')) then
        ledg <="0";
        sonst <= '0';
      end if;
    end if;

  end process;
end arch;

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


Lesenswert?

takeiteasy schrieb:
> Ich habe das Programm jetzt umgeschrieben
Eins vorneweg:  VHDL ist keine Programmiersprache,  sonst würde es VHPL 
heißen...

takeiteasy schrieb:
> Ich dachte die Key sind schon entprellt?
Als kleiner Denkanstoß: wie schnell prellt der Taster? Richtig: im 
Millisekunden-Bereich.
Und wie schnell läuft die Flankenerkennung, die du zur Entprellung 
verwenden willst? Im Nanosekunden-Bereich, also zigtausend mal 
schneller...

Was du jetzt also hast, ist zwar eine Einsynchronisierung und eine 
Flankenerkennung, aber eben noch keine wirksame Entprellung.

BTW: Sieh dir mal die Sache mit den [vhdl] Tags an, wenn du das nächste 
Mal eine VHDL Beschreibung postest. Stichwort Formatierung,  zu finden 
über dem Texteingabefeld.

: Bearbeitet durch Moderator
von Burkhard K. (buks)


Lesenswert?

takeiteasy schrieb:
> Ich dachte
> die Key sind schon entprellt?

Debounced - laut User-Manual 
http://users.ece.gatech.edu/~hamblen/DE1/DE1_CDROM/DE1_UserManual_v1017.pdf 
per Schmitt-Trigger. D.h. dein Key-Vektor hält den Zustand "1110" in 
jedem Fall über mehrere Taktzyklen - auch nach dem Loslassen.

Während dieser Zeit wechselt das "modus"-Register mit jedem Takt den 
Zustand. Ich denke, was Du brauchst ist eine Flankenerkennung.

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


Lesenswert?

Burkhard K. schrieb:
> Debounced - laut User-Manual ... per Schmitt-Trigger.
Ich würde mich auf so ein Gebastel nie einlassen und das direkt im FPGA 
machen. Dann kann ich auch mal einen "normalen" Taster anschließen.

takeiteasy schrieb:
> Ich dachte die Key sind schon entprellt?
Ich habe mir das ganze Drama nochmal angesehen, und es ist viel 
schlimmer als ich meinte:
natürlich ist der Taster nicht einsynchronisiert (klassischer und sehr 
beliebter Anfängerfehler). Solange das nicht gemacht wird, kann alles 
Mögliche passieren.

Du solltest dir unbedingt im Klaren sein, dass ein FPGA kein 
Mikrocontroller ist. Der macht das Einsynchronisieren auch, aber so, 
dass du es nicht merkst. Und beim FPGA musst du das selber machen.

Also einfach mal schaeun, wie Andere das machen. Die Grundlagen dazu:
http://www.lothar-miller.de/s9y/categories/35-Einsynchronisieren
Und wenn das grundlegend(!) verstanden ist, dann gehts da weiter:
http://www.lothar-miller.de/s9y/categories/5-Entprellung

takeiteasy schrieb:
> process(clk, key, modus)
In dieser Sensitivliste sind modus und key überflüssig und falsch. Der 
Prozess ist ausschließlich auf clk sensitiv.

: Bearbeitet durch Moderator
von Burkhard K. (buks)


Lesenswert?

Lothar M. schrieb:
>> Debounced - laut User-Manual ... per Schmitt-Trigger.
> Ich würde mich auf so ein Gebastel nie einlassen und das direkt im FPGA
> machen. Dann kann ich auch mal einen "normalen" Taster anschließen.

Da will ich nicht widersprechen; nur umgehen lässt sich die fest 
eingebaute Hardware wohl nicht, eine Verzögerung durch eigene 
Entprellungsmassnahmen kommt also zu der des vorhandenen 
Schmitt-Triggers hinzu. Spezifiziert finde ich die nicht, dazu müsste 
man den Schaltplan des Boards konsultieren.

Altera preist übrigens im User-Manual die Entprellung per Hardware mit 
folgenden Worten an: "Since the pushbutton switches are debounced, they 
are appropriate for use as clock or reset inputs in a circuit."

von Lattice User (Gast)


Lesenswert?

Die VHDL Beschreibung macht genau das, was im Betreff steht.
Bei gedrückter Taste Key(0) geht die LED ständig an und aus. Das Auge 
ist nur zu träge um das zu sehen. Beim Loslassen der Taste ist es Zufall 
ob die LED dann an oder aus ist.

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


Lesenswert?

Lattice User schrieb:
> Die VHDL Beschreibung macht genau das, was im Betreff steht.
Das könnte man sich hier mit einer simplen Testbench in einer Waveform 
im Simulator ansehen. Mit 15 Zeilen Code dürfte da das Allermeiste 
erledigt sein...

von takeiteasy (Gast)


Lesenswert?

hab jetzt einen passenden Code.
Vielen Dank für die Hilfe.

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


Lesenswert?

takeiteasy schrieb:
> hab jetzt einen passenden Code.
Schön. Aber noch viel schöner wäre es, wenn du ihn posten würdest. Dann 
wäre evtl. anderen auch geholfen...

> Vielen Dank für die Hilfe.
Keine Ursache.

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.