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


von Robert (Gast)


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

von Christian P. (kron)


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. ;)

von Volker (Gast)


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

von Mark (Gast)


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.

von Fpgakuechle K. (Gast)


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.

von Robert (Gast)


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 :)

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.