Hallo, ich habe die angehängte State Machine programmiert, funktioniert soweit auch. Jetzt wollte ich sie so erweitern, daß die Anweisung "if (start = '1') then" auf die positive Flanke des Signals Start reagiert. Dazu habe ich "if (rising_edge(start)) then" probiert, das funktionierte jedoch nicht. Wie stelle ich es an, daß ich auf zwei positive Flanken (start und clk) reagieren kann? Gruß Micha
Hallo Micha, Du musst zunächst ein um einen Takt verzögertes Signal (start_last) von start erzeugen. Wenn das verzögerte Signal noch '0' ist und das eigentliche Signal schon '1', dann dazwischen eine steigende Flanke gegeben haben. Ich habe Deinen Code entsprechend angepasst. Gruß Ines
Hallo Ines, das prinzip stimmt, in deinem Code sind noch zwei halbe fehler: -start steht noch in der sensitivity list -reset wert für start_last fehlt -> dadurch wird u.U. nach dem PowerUp eine Flanke detektiert wo keine ist. Code hängt bei
Vielen Dank für die schnelle Antwort. Auf so eine Lösung bin ich nicht gekommen....ich hab die ganze Zeit versucht, zwei Detektoren für die steigende Flanke zu programmieren. Es dauert sicher einige Zeit, bis man sich an die Programmierung mit VHDL gewöhnt hat. Gibt es eigentlich eine einfachere Methode, den Zustand des Schalters in eine Variable zu bekommen? Gruß Micha
Hallo FPGAküchle, hast recht! Ich hatte mir den Code nicht besonders ausführlich angeschaut. Deine Variante ist sicher die bessere! Hallo Micha, ich habe Deinen Code noch mal überarbeitet. - Warnung: Ich habe ihn weder kompiliert noch irgendwie getestet. Es ist also nur als Vorschlag zu verstehen. - Ich habe die State-Machine rausgenommen und den Counter in einen Vektor umgewandelt, weil dann die Umrechnerei entfällt. Frage: Die Zeile "counter := 20;" hatte keinen besonderen Sinn (den ich dann nicht verstanden hätte), oder? Viele Grüße Ines
@Ines: nur kein falsches bescheidenheit, meine Ergänzung sind minimal, dein Vorschlag zu 99,9 % ausreichend. Und noch eine kleine Verbesserung, IMHO ist IF (counter < switch) THEN hier besser mit: IF (counter /= switch) THEN zu ersetzten, sollte dasselbe tun, da counter inkrementiert (durch Simu überprüfen) und ist kleiner in Hardware. Vergleicher auf größer als und kleiner sind mind. doppelt so groß als Vergleicher auf Gleicheheit/Ungleichheit.
Hallo Ines, die Schaltung soll einen Puls einer einstellbaren Länge ausgeben. (nach pos. Flanke an Start) Wenn der Puls beendet ist, wollte ich den Zähler mit dem Maximalwert (20) laden, damit er sicher steht. Wenn ich das nicht mache und den Switch umschalte (höherer Wert), wird ein Puls ausgegeben. Ich werde die Änderungen mal testen. Vielen Dank.
Hallo Micha, wenn Du die Switches im Betrieb umstellen willst, dann solltest Du sie vorsichtshalber eintakten (das gleiche gilt natürlich für start). Um das Problem mit dem Puls beim Umstellen der Switches zu lösen, habe ich im ELSE-Zweig den counter auf 15dez gesetzt. Das ist auch schon sicher, weil ja auf kleiner (bzw. ungleich, was hier das selbe wie kleiner ist) abgefragt wird - den Wert 20 brauchst Du nicht. Ines PS: Ich habe wieder nicht kompiliert noch getestet.
Hallo Ines, wenn ich das Start-Signal auf diese Art mit dem Clock eintakte, hab ich allerdings das Problem, daß der Ausgangspuls um 2 Takte verzögert zum Start kommt. Ist das Eintakten beim Start-Signal notwendig, ich prüfe ja auf steigende Flanke von Start. Gruß Micha
Hallo Micha, woher kommt start eigentlich? FPGA/CPLD-intern, Taster von außen, Mikrocontroller? Das Problem ist halt die Geschichte mit dem "metastabilen Zustand". Bist Du damit vertraut? Ines
Hallo Ines, mit metastabilem Zustand bin ich nicht vertraut..... Das Start-Signal kommt aus einem externen Generator (asynchron) Gruß Micha
OK, also: Wenn Dein asynchrones Signal gerade zur / dicht bei der steigenden Clock-Flanke einen Pegelwechsel hat, tritt möglicherweise eine Hold- oder Setup-Time-Verletzung auf. Das führt dazu, das am Register-Ausgang für eine gewisse Zeit weder eine 0 noch eine 1 ansteht, sonder irgendwas dazwischen (bei Deinem Design wären die Signale run und counter betroffen). D.h. die folgende Logik kann mit dem Signal nichts anfangen. Durch Eintakten / Einsynchronisieren kann man die Wahrscheinlichkeit für das Auftreten eines metastabilen Zustands verringern. Ist es denn arg tragisch, wenn Dein erzeugter Puls nicht nur einen Takt nach start ansteht sondern drei Takte? Ines
Hallo Ines, in dem Fall ist es nicht so tragisch. Ist ja nur wichtig fürs Verständnis. Gruß Micha
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.