Forum: FPGA, VHDL & Co. Multiple Clock


von Micha (Gast)


Angehängte Dateien:

Lesenswert?

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

von Ines (Gast)


Angehängte Dateien:

Lesenswert?

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

von FPGAküchle (Gast)


Angehängte Dateien:

Lesenswert?

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

von Micha (Gast)


Lesenswert?

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

von Ines (Gast)


Angehängte Dateien:

Lesenswert?

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

von FPGAküchle (Gast)


Lesenswert?

@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.

von Micha (Gast)


Lesenswert?

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.

von Ines (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Micha (Gast)


Lesenswert?

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

von Ines (Gast)


Lesenswert?

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

von Micha (Gast)


Lesenswert?

Hallo Ines,

mit metastabilem Zustand bin ich nicht vertraut.....
Das Start-Signal kommt aus einem externen Generator (asynchron)

Gruß Micha

von Ines (Gast)


Lesenswert?

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

von Micha (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.