2013-10-06 10 views
5

Da quanto ho capito, tutte le istruzioni all'interno di un PROCESSO vengono eseguite in sequenza. Quindi cosa succede a un'assegnazione simultanea del segnale (< =)? Funziona allo stesso modo dell'assegnazione sequenziale (: =) o esegue dopo un ritardo delta?L'assegnazione del segnale (concorrente) all'interno di un'istruzione di processo sequenziale o concomitante?

Se si esegue dopo un ritardo delta, come possono essere sequenziali tutte le istruzioni all'interno di PROCESS?

Se viene eseguito immediatamente, esiste una differenza tra: = e < = in un processo?

risposta

7

L'assegnazione del segnale (< =) viene eseguita dopo che tutto il codice sequenziale nei processi è stato eseguito. Questo è quando tutti i processi attivi per quel timestep sono fatti.

Come esempio perché questo è:

Supponiamo di avere un evento che attiva 2 processi. Questi 2 processi utilizzano lo stesso segnale, ma uno di questi modifica il valore di quel segnale . Il simulatore è in grado di eseguire un processo solo nel tempo a causa di un modello di simulazione sequenziale (da non confondere con il modello concorrente di vhdl ). Quindi se il processo A viene simulato per primo e A cambia il segnale, B avrà il valore del segnale sbagliato. Pertanto, il segnale può essere modificato solo dopo aver eseguito tutti i processi attivati.

L'assegnazione variabile (: =) esegue immidiatly e può essere usato per esempio memorizzare temporaneamente alcuni dati all'interno di un processo.

3

Assegnazione sequenziale del segnale (< =), in contrapposizione all'assegnazione di variabile sequenziale (: =), pianifica in sequenza un ritardo di un ritardo uno in seguito per il valore del segnale da aggiornare. È possibile modificare l'evento programmato utilizzando un'assegnazione sequenziale del segnale sullo stesso segnale nello stesso processo. Si verificherà solo l'ultimo aggiornamento programmato su un particolare segnale. Ad esempio:

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; 

E 'anche importante notare che, mentre processi sequenziali operano in sequenza da un punto di vista logico nel VHDL, quando sintetizzata, sono veramente trasformate in dichiarazioni simultanee complesse collegamento infradito. L'intero processo viene eseguito simultaneamente come unità tra ogni ciclo di clock (i processi che non funzionano su un orologio diventano pura logica combinatoria). I segnali sono i valori che vengono effettivamente memorizzati nelle infradito. Le variabili sono solo alias per rendere i processi più facili da leggere. Sono assorbiti nella logica combinatoria dopo la sintesi.