Ist ein Prozess in VHDL reentrant?
Ist es möglich, zwei oder mehr sequentielle Ausführung für einen Prozess in VHDL
?
Was wird passieren, wenn ein anderes Ereignis passiert (auf Empfindlichkeit signal-Liste), während die sequentielle Ausführung von a nicht abgeschlossen ist ?
Ist es möglich oder meine VHDL
Modell im Hinterkopf für den Prozess völlig falsch?
- Möchten Sie vielleicht klären Ihre Frage
- Können Sie näher erläutern, mit einigen Beispiel-code von der situation? Ich glaube, ich weiß, was du fragst, aber das ist schwer zu beantworten, ohne ein konkretes problem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Keinen Fall jemals auftreten, während ein Prozess ausgeführt wird!
Werden, wenn ein Prozess geweckt durch ein Ereignis, führt es zur Vollendung ("end process") oder eine explizite "wait" - Anweisung, und geht schlafen. Dies dauert, notionally, NULL Zeit. Das bedeutet, dass, wenn Sie loops in Ihrem Prozess, sind Sie effektiv ausgerollt vollständig, und wenn Sie werden, werden Sie erzeugen genug hardware zum ausführen JEDER iteration parallel. Außerdem werden alle Prozeduren, Funktionen, etc, nehmen Sie die null-Zeit - es sei denn, Sie enthielten eine explizite "wait" - Anweisung (in dem Fall der Prozess hält an der "warte", als ob das Verfahren war inlined).
Während dieses Prozesses, der alle Signale haben den Wert, den Sie ursprünglich hatte, als der Prozess aufgewacht, und alle signal-Zuordnungen gespeichert werden, um später passieren. (Variablen sofort aktualisiert; spätere Aussagen im Prozess sehen, in den neuen Wert).
Wenn der Prozess angehalten (auf "warten" oder "Prozess beenden"), passiert nichts, bis ALLE anderen Prozesse auch aussetzen. (Aber denken Sie daran, Sie nehmen alle null Zeit!). Wenn ein Prozess suspendiert auf "Prozess beenden" es wird von Beginn an neu starten, wenn Ihre Empfindlichkeit-Liste weckt es auf. Wenn es hält eine explizite "warten", das "warten" wird ein Ereignis anzugeben, oder die Zukunft, die neu starten, nach dem "Wait". (ANMERKUNGEN: 1 : mischen Sie nicht die Empfindlichkeit der Liste und Warten Sie, Stile, die in den gleichen Prozess! 2: Warten, Bis irgendein Ereignis ist synthetisierbaren (obwohl einige tools können Objekt) ; Warten Sie einige Zeit, ist eine simulation nur)
DANN alle signalzuordnungen durchgeführt werden. Da alle Prozesse sind eingeschlafen, dies beseitigt alle race-Bedingungen und die Zeitplanung Gefahren. Einige dieser Aufgaben (z.B. '1' für eine Uhr), führen Veranstaltungen geplant werden, auf Prozesse, die empfindlich auf Ihnen.
Nachdem alle Signale, die Aufgaben sind erledigt, die Zeit, die Schritte nach vorne, einen unendlich kurzen tick (genannt eine delta-Zyklus), und dann alle Prozesse mit geplanten Veranstaltungen geweckt werden.
Dies wird fortgesetzt, bis ein delta-Zyklus Auftritt, in denen KEINE neuen events geplant sind, und schließlich kann die simulation Voraus, die durch eine Echtzeit-Schritt.
Damit
ist Gefahr-frei in VHDL.
Wenn Sie jemals brauchen, um zu verwenden, Verilog, bewusst sein, dass einige dies anders dort, und verlassen Sie sich nicht auf der gleichen Ebene der Vorhersagbarkeit der Simulationsergebnisse.
In der Synthese, natürlich, wir generieren die hardware, das dauert echt einige Zeit für die Ausführung dieses Prozesses. Jedoch, die Synthese-und back-end-tools (place & route) zu gewährleisten, entweder gehorchen Sie diesem Modell treu, oder nicht-und berichten, warum Sie scheiterten. Zum Beispiel, die Sie hinzufügen, bis alle echten Verzögerungen und stellen Sie sicher, dass die Summe kleiner als die von Ihnen angegebenen Uhr Zeit. (Es sei denn, Sie haben die Taktrate zu hoch!).
Also das Fazit ist, solange die tools melden einen Erfolg (und Sie sind die Einstellung der timing-constraints wie clock speed richtig) können Sie vorgeben, die oben genannten "null-Zeit" - Modell ist wahr, und die tatsächliche hardware-Verhalten stimmt mit der simulation. Garantiert, Sperrung tool bugs!
Beim Start mit VHDL (oder jeder anderen HDL für diese Angelegenheit), ist es äußerst wichtig, entfernen alle Vorstellungen von sequenziellen code, und konzentrieren Sie sich auf den Fluss der Daten durch die hardware. In hardware, alles ist von Natur aus parallel (alles gleichzeitig geschieht), sondern nutzt sich ständig ändernden Daten (input-Signale) zu berechnen, die sich ständig verändernden Ergebnisse (Ausgangssignale)!
Ohne in die fortgeschrittenen Themen wie Variablen, warten, Befehle etc., alles in einem Prozess geschieht gleichzeitig. Wenn widersprüchliche Dinge, die auftreten, innerhalb des gleichen Prozesses (mehrere Schreibvorgänge auf dem gleichen signal), wird die Letzte Anweisung im Prozess gewinnt, ist oft, wo die Verwirrung über die "sequential" - code in VHDL kommt.
Dies funktioniert aufgrund der Art und Weise der Zuweisung von Werten an Signale. Bei der Zuweisung eines Wertes an ein signal, ist der Wert des Signals nicht sofort ändern! Stattdessen wird der zugewiesene Wert wird gespeichert und begangen werden, wie das eigentliche signal Wert später (in Vorbereitung für den nächsten delta-Zyklus, das ist tatsächlich die nächste Quanten-Zeit).
Seit dem nächsten delta-Zyklus beginnt erst, wenn alle Prozesse von der früheren delta-Zyklus abgeschlossen haben, signalisieren Werte nur ändern, wenn kein Prozess aktiv ist. Sobald alle Signale geändert haben, die nächsten delta-Zyklus beginnt und jeder Prozess empfindlich auf eines der Signale geändert wird, ausgeführt werden.
Wenn ein Prozess Sensitiv ist, um ein signal zu er schreibt auch, Sie haben, was ist bekannt als eine kombinatorische Schleife, z.B. ein Tor, wo der Ausgang speist ein Eingang. Dies ist (fast) immer einen Fehler in deiner Schaltung, und wird üblicherweise dazu, dass Simulatoren eingeben eine unendliche delta-Zyklus-Schleife.
Dass alles, was ich Schreibe jetzt, wie Brian Drummond ' s Antwort nur aufgetaucht ist, als ich dies Schreibe, aber fühlen Sie sich frei, einen Kommentar hinterlassen und ich werde ein paar mehr details.
Sobald ein Prozess zu laufen beginnt (durch ein Ereignis), die es zum Abschluss ausgeführt, bevor andere Ereignisse zulässig sind, um die trigger etwas anderes.
entity
oder nur innerhalb derprocess
?