2013-10-06 7 views
5

Von dem, was ich verstehe, werden alle Anweisungen in einem Prozess sequenziell ausgeführt. Was passiert also mit einer gleichzeitigen Signalzuweisung (< =)? Funktioniert es genauso wie die sequenzielle Zuweisung (: =) oder wird es nach einer Delta-Verzögerung ausgeführt?Ist die (gleichzeitige) Signalzuweisung innerhalb einer Prozessanweisung sequenziell oder gleichzeitig?

Wenn es nach einer Delta-Verzögerung ausgeführt wird, wie können dann alle Anweisungen in PROCESS sequenziell aufgerufen werden?

Wenn es sofort ausgeführt wird, gibt es einen Unterschied zwischen: = und < = in einem Prozess?

Antwort

7

Die Signalzuweisung (< =) wird ausgeführt, nachdem der gesamte sequenzielle Code in den Prozessen ausgeführt wurde. Dies ist, wenn alle aktiven Prozesse für diesen Zeitschritt abgeschlossen sind.

Als Beispiel, warum dies:

Angenommen, Sie ein Ereignis haben, die zwei Prozesse auslöst. Diese 2 Prozesse verwenden das gleiche Signal, aber einer von ihnen ändert den Wert dieses Signals . Der Simulator kann aufgrund eines sequentiellen Simulationsmodells nur einen Prozess unter der Zeit ausführen (nicht mit dem simultanen Modell von vhdl zu verwechseln). Wenn also Prozess A zuerst simuliert wird und A das Signal ändert, würde B den falschen Signalwert haben. Daher kann das Signal nur geändert werden, nachdem alle ausgelösten Prozesse ausgeführt wurden.

Die Variablenzuweisung (: =) wird sofort ausgeführt und kann z. vorübergehend einige Daten in einem Prozess speichern.

3

Sequenzielle Signalzuweisung (< =), im Gegensatz zur sequenziellen Variablenzuweisung (: =), plant sequenziell ein Ereignis eine Deltaverzögerung später für den Wert des zu aktualisierenden Signals. Sie können das geplante Ereignis ändern, indem Sie eine sequenzielle Signalzuweisung für dasselbe Signal im selben Prozess verwenden. Nur das letzte Update, das für ein bestimmtes Signal geplant ist, wird auftreten. Zum Beispiel:

signal a : std_logic := '1'; --initial value is 1 

process(clk) 
    variable b : std_logic; 
begin 
    --note that the variable assignment operator, :=, can only be used to assign the value of variables, never signals 
    --Likewise, the signal assignment operator, <=, can only be used to assign the value of signals. 
    if (clk'event and clk='1') then 
    b := '0' --b is made '0' right now. 
    a <= b; --a will be made the current value of b ('0') at time t+delta 
    a <= '0'; --a will be made '0' at time t+delta (overwrites previous event scheduling for a) 
    b := '1' --b will be made '1' right now. Any future uses of b will be equivalent to replacing b with '1' 
    a <= b; --a will be made the current value of b ('1') at time t+delta 
    a <= not(a); --at time t+delta, a will be inverted. None of the previous assignments to a matter, their scheduled event have been overwritten 
    --after the end of the process, b does not matter because it cannot be used outside of the process, and gets reset at the start of the process 
    end if; 
end process; 

Es ist auch wichtig zu beachten, dass, während sequentielle Prozesse sequentiell von einer logischen Perspektive in der VHDL arbeiten, wenn synthetisiert, sie sind wirklich in komplexe gleichzeitige Aussagen gedreht Verbindungs ​​Flip-Flops. Der gesamte Prozess läuft gleichzeitig als eine Einheit zwischen jedem Taktzyklus (Prozesse, die nicht auf einer Uhr arbeiten, werden zur reinen Kombinationslogik). Signale sind die Werte, die tatsächlich in den Flip-Flops gespeichert werden. Variablen sind nur Aliasing, um Prozesse leichter lesbar zu machen. Sie werden nach der Synthese in kombinatorische Logik absorbiert.

Verwandte Themen