www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Multiple Clock


Autor: Micha (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Ines (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: FPGAküchle (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ines (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: FPGAküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ines (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ines (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ines,

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

Gruß Micha

Autor: Ines (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ines,

in dem Fall ist es nicht so tragisch. Ist ja nur wichtig fürs
Verständnis.

Gruß Micha

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.