www.mikrocontroller.net

Forum: FPGA, VHDL & Co. clk'event Verwendung


Autor: Robert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich sehe immer wieder wie in manchen codes nach einer Taktflanke gesucht 
wird indem man in einem Prozess das Eingangssignal um einen Takt 
verzögert und dann an der gewünschten Stelle in einer if Abfrage fragt 
ob das originalsignal 1 und das alte 0 ist (in dem Fall also eine 
steigende Flanke).

Warum wird das so gemacht, es gibt doch xxx'event and xxx = '1'?? So 
könnte man doch viel einfacher nach einer steigenden Flanke in dem 
entsprechenden Signal suchen oder??

Danke für die Aufklärung

Robert

Autor: Christian Peters (kron)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das 'event, bzw. rising_edge und falling_edge nutzt man bei 
Clock-Signalen.
Wenn man aber die Signaländerung eines "normalen" Signals entdecken 
will,
nimmt man die verzögert Variante.

Ich kann jetzt nicht genau sagen, warum das so ist,
vermute einfach mal, dass bei 'event die ISE denkt,
dass es ein Clocksignal ist und das Signal dann versucht
so zu routen, was natürlich nicht gewollt ist.
Kann aber falsch sein. :)
Ist nur eine Frage der Zeit, bis ein Experte Stellung nimmt. ;)

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na ja, in erster Linie ist man bestrebt nur einen einzigen Clock
zu haben.
Warum?
Ganz einfach: Damit das Layout synchron bleibt, ansonsten können
-- Metastabile Zustände
-- Glitches
-- Spikes
auftreten.

Deswegen wird ein Siganl, dessen Flanke man erkennen möchte zunächst mal 
mit dem Takt einsynchronisiert.

Um weitere Informationen zu erlangen einfach mal die oben genannten 
Begriffe in der Suchmaske eintragen.

Gruß Volker

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei der Verwendung von clock'event (and clk='1' oder '0') generiert das 
Synthesetool Flip-Flops die mit clk getaktet werden. Alternativ (besser)
schreibt man rising_edge(clk), falling_edge(clk).

Diese Konstruktion könnte man nun auch verwenden, um Flanken von 
beliebigen Signalen zu erkennen, dann kommt man aber ganz schnell in den 
Bereich asynchroner Schaltungen. Wer nicht weiß was das ist und warum 
man das vermeiden sollte, schaut mal hier im Forum oder sucht bei 
Google.

Generell sollten also alle Signale synchron zu 'clk' sein. Wenn man nun 
ein Signal A hat, das synchron zu clk ist und dessen steigende Flanke 
erkennen möchte, dann verzögert man das Signal um einen Clock und 
vergleicht aktuellen und vorherigen Zustand. Das ist der übliche (und 
einzige mir bekannte) Weg, um Signaländerungen vollsynchron zu erkennen.

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
IMHO denkst du wie ein Programmierer ("...nach einer Taktflanke 
gesucht...","...if Abfrage..."), nur wird mit VHDL ausschließlich in 
Testbenches für Simulationen PROGRAMMIERT, soll dagegen ein FPGA 
synthetisiert werden, steht VHDL für das BESCHREIBEN für Hardware. Und 
die FPGA - Hardware erkennt eben Signalflanken (oder in HW formuliert: 
setzt ein Ausgangssignal auf '1) durch ein 2Input XOR mit einem Eingang 
am Orginal und an dem zweiten Eingang das mit einem ein DD-FF 
verzögertem Signal.
Nicht anders.

In der Synthese wird eben der Code anders (mit einem anderen Ziel) 
"übersetzt". Bei 'event kommt das "mit IF abgefragte" Signal an den 
Takteingang eines FF. und mit einem solchen FF kannst du kein Signal auf 
'1' setzten sobald das "getestete" Signal '1' wird.
mit 'edge kann man Signalwechsel in einer Simulation erkennen, aber 
keinen Flankendetektor bauen. Ist halt missdeutbar - die Sprache.

Und letzlich will man nicht den Signalwechsel erkennen (das dauert ja 
nur ein paar ps), sondern das sich das Signal gewechselt hat.

Es ist die selbe Sprache nur für einen koplett anderen Empfänger.

Autor: Robert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für die ausführlichen Antworten. Mir ist die Sache jetzt klar und 
ich werde es weiterhin so machen "wie die andern", nur jetzt weiss ich 
auch warum :)

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.