Multiple Clock

Gast #386909
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
Angehängte Dateien:
Gast
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
Angehängte Dateien:
Gast
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
Angehängte Dateien:
Gast
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
Gast
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
Angehängte Dateien:
Gast
@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.
Gast
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.
Gast
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.
Angehängte Dateien:
Gast
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
Gast
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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.