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;
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.
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;
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
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.
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
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."
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.
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...
hab jetzt einen passenden Code. Vielen Dank für die Hilfe.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.