2012-12-19 4 views
10

Ist es möglich, zwei oder mehr aufeinanderfolgende Prozesse für einen Prozess in VHDL zu starten?Ist der Prozess in VHDL reentrant?

Was passiert, wenn ein anderes Ereignis eintritt (in der Empfindlichkeitsliste), während die sequentielle Ausführung eines Prozesses nicht abgeschlossen ist?

Ist es möglich oder mein VHDL Modell für den Prozess ist völlig falsch?

+0

Vielleicht möchten Sie Ihre Frage zu klären – briantyler

+0

Können Sie mit einigen Beispielcode der Situation klären? Ich glaube, ich weiß, was Sie fragen, aber es ist schwer zu beantworten ohne ein konkretes Problem. –

Antwort

39

Während der Ausführung eines Prozesses wird niemals ein Ereignis auftreten!

Wenn ein Prozess von einem Ereignis ausgelöst wird, wird er bis zum Abschluss ("end process") oder einer expliziten "wait" -Anweisung ausgeführt und in den Ruhezustand versetzt. Dies erfordert fiktiv Null Zeit. Das bedeutet, dass wenn Sie Schleifen in Ihrem Prozess haben, diese effektiv vollständig ausgerollt werden, und wenn Sie synthetisieren, werden Sie genug Hardware generieren, um JEDE Iteration parallel auszuführen. Außerdem benötigen alle Prozeduren, Funktionen usw. null Zeit - es sei denn, sie enthielten eine explizite "wait" -Anweisung (in diesem Fall wird der Prozess bei "wait" unterbrochen, als ob die Prozedur inline gewesen wäre).

Während dieses Vorgangs haben alle Signale den Wert, den sie ursprünglich hatten, als der Prozess aufwachte, und alle Signalzuweisungen werden gespeichert, um später zu geschehen. (Variablen werden sofort aktualisiert; spätere Anweisungen im Prozess sehen den neuen Wert).

Wenn der Prozess ausgesetzt wird (bei "warten" oder "Prozess beenden"), passiert nichts, bis ALLE anderen Prozesse ebenfalls ausgesetzt werden. (Aber denk daran, dass sie alle null Zeit brauchen!). Wenn ein Prozess bei "Ende Prozess" aussetzt, wird er von Anfang an neu gestartet, wenn seine Empfindlichkeitsliste ihn aufweckt. Wenn es bei einem expliziten "Warten" aussetzt, wird dieses "Warten" ein Ereignis oder eine zukünftige Zeit angeben, die es nach dem "Warten" neu startet. (ANMERKUNGEN: 1: nicht die Empfindlichkeitsliste und Wait Styles im selben Prozess mischen! 2: Warten bis ein Ereignis synthetisch sein kann (obwohl einige Werkzeuge einwenden können); Warte einige Zeit nur auf Simulation)

DANN alle Signalzuweisungen werden durchgeführt. Da alle Prozesse eingeschlafen sind, werden alle Race-Bedingungen und Timing-Hazards eliminiert. Einige dieser Zuweisungen (wie '1' zu einer Uhr) werden dazu führen, dass Ereignisse in für sie empfindlichen Prozessen geplant werden.

Nachdem alle Signalzuweisungen vorgenommen wurden, schreitet die Zeit um einen unendlich kurzen Tick vorwärts (Delta-Zyklus genannt), und dann werden alle Prozesse mit geplanten Ereignissen geweckt.

Dies wird fortgesetzt, bis ein Delta-Zyklus auftritt, in dem KEINE neuen Ereignisse geplant sind, und schließlich kann die Simulation um einen Echtzeitschritt fortschreiten.

So

process(clk) 
begin 
if rising_edge(clk) then 
    A <= B; 
    B <= A; 
end if; 
end process; 

ist gefährdungsfrei in VHDL.

Wenn Sie Verilog verwenden müssen, beachten Sie, dass dies teilweise anders vorkommt und Sie sich nicht auf die gleiche Vorhersagbarkeit in den Simulationsergebnissen verlassen können.


In der Synthese, natürlich, erzeugen wir Hardware, die etwas Zeit braucht, um diesen Prozess auszuführen. Die Synthese- und Back-End-Tools (Ort und Route) garantieren jedoch, dass dieses Modell getreu gehorcht wird, oder fehlschlagen und melden, warum sie fehlgeschlagen sind. Zum Beispiel addieren sie alle tatsächlichen Verzögerungen und verifizieren, dass die Summe weniger als die angegebene Taktperiode ist. (Es sei denn, Sie haben die Taktgeschwindigkeit zu hoch eingestellt!).

Also das Ergebnis ist, solange die Tools Erfolg melden (und Sie die Timing-Einschränkungen wie Taktgeschwindigkeit richtig einstellen) können Sie vorgeben, das oben genannte "Zero Time" -Modell ist wahr, und das reale Hardware-Verhalten entspricht Simulation. Garantierte Tool-Bugs!

+4

Warum genau ist diese Antwort nicht in jedem VHDL-Tutorial da draußen? Ich habe schon einige Zeit mit VHDL gearbeitet und du hast noch einige Grundlagen für mich geklärt! –

+0

danke für das Kompliment! –

+0

"Zum Beispiel addieren sie alle tatsächlichen Verzögerungen und verifizieren, dass die Summe weniger als die angegebene Taktperiode ist. (Es sei denn, Sie haben die Taktgeschwindigkeit zu hoch eingestellt!)." Ich verstehe nicht. Also, wenn Sie die Taktgeschwindigkeit zu hoch einstellen, dann erlauben sie eine Summe, die höher ist als die Taktperiode und wird nicht verifizieren? –

5

Wenn Sie mit VHDL (oder einem anderen HDL) beginnen, ist es äußerst wichtig, alle Konzepte des sequentiellen Codes zu verwerfen und sich stattdessen auf den Datenfluss durch die Hardware zu konzentrieren. In der Hardware ist alles von Natur aus parallel (alles geschieht simultan), verwendet aber ständig wechselnde Daten (Eingangssignale), um sich ständig ändernde Ergebnisse (Ausgangssignale) zu berechnen!

Ohne auf fortgeschrittene Themen wie Variablen, Wartebefehle usw. zuzugehen, geschieht alles innerhalb eines Prozesses gleichzeitig. Wenn widersprüchliche Dinge innerhalb desselben Prozesses auftreten (mehrfache Schreibvorgänge auf dasselbe Signal), gewinnt die letzte Anweisung im Prozess, was oft der Grund für die Verwirrung über "sequenziellen" Code in VHDL ist.

Dies funktioniert aufgrund der Zuordnung von Werten zu Signalen. Wenn einem Signal ein Wert zugewiesen wird, ändert sich der Wert des Signals nicht sofort! Stattdessen wird der zugewiesene Wert gespeichert und später als der tatsächliche Signalwert übernommen (als Vorbereitung für den nächsten Delta-Zyklus, der effektiv das nächste Zeitquant ist).

Da der nächste Delta-Zyklus erst beginnt, wenn alle Prozesse des vorherigen Delta-Zyklus abgeschlossen sind, ändern sich die Signalwerte nur, wenn kein Prozess läuft. Sobald sich alle Signale geändert haben, beginnt der nächste Delta-Zyklus und jeder Prozess, der für eines der geänderten Signale empfindlich ist, wird ausgeführt.

Wenn ein Prozess empfindlich auf ein Signal reagiert, das er ebenfalls schreibt, haben Sie eine so genannte kombinatorische Schleife, z. B. ein Gate, bei dem die Ausgabe einen Eingang speist. Dies ist (fast) immer ein Fehler in Ihrer Schaltung und führt normalerweise dazu, dass Simulatoren in eine unendliche Delta-Zyklus-Schleife eintreten.

Das ist alles, was ich für jetzt schreibe, da Brian Drummonds Antwort gerade aufgetaucht ist, während ich dies schrieb, aber zögern Sie nicht, einen Kommentar zu hinterlassen und ich werde weitere Details hinzufügen.

2

Sobald ein Prozess (aufgrund eines Ereignisses) zu laufen beginnt, läuft es bis zum Abschluss, bevor andere Ereignisse dürfen etwas anderes auslösen.

+0

Ist das irgendetwas anderes in der gesamten Entität oder nur innerhalb des Prozesses? – atomh33ls

+1

Nur der Prozess.Sobald ein Prozess abgeschlossen ist, können Sie nicht mehr wissen, welcher Prozess, der bereit ist, den gleichen Delta-Zyklus auszuführen, als nächstes geplant wird. Es kann eine von der gleichen Entität sein, möglicherweise nicht. Und (solange Sie keine gemeinsam genutzten Variablen verwenden) ist das egal –