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
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. ;)
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.