Menu
Coddy logo textTech

Assegnazione non bloccante

Fa parte della sezione Fondamenti del percorso Verilog di Coddy. Lezione 50 di 90.

Nella lezione precedente abbiamo trattato l’assegnazione bloccante (=), che viene eseguita passo dopo passo. Ora tratteremo l’assegnazione non bloccante (<=), che viene eseguita tutta insieme, in parallelo.

L’assegnazione non bloccante usa l’operatore <=. Si chiama «non bloccante» perché non blocca l’esecuzione dell’istruzione successiva. Tutte le assegnazioni non bloccanti in un blocco vengono eseguite contemporaneamente.

Sintassi:

variable <= expression;

Quando usare l'assegnazione non bloccante

L'assegnazione non bloccante (<=) si usa per la logica sequenziale: circuiti che usano un clock e hanno memoria. Le uscite cambiano solo sul fronte del clock (di solito quello di salita).

Esempi di logica sequenziale:

  • Flip-flop
  • Registri
  • Contatori
  • Macchine a stati
  • Registri a scorrimento

Esempio di Verilog:

initial begin
  a <= 5;      // Programmato, ma non ancora eseguito
  b <= a + 2;  // Programmato, usa il VECCHIO valore di a
  c <= b * 3;  // Programmato, usa il VECCHIO valore di b
end

Tutte e tre le assegnazioni avvengono allo stesso tempo usando i valori precedenti. Alla fine del passo temporale, tutti gli aggiornamenti avvengono insieme.

Assegnazioni non bloccanti nei blocchi Always (logica sequenziale)

Le assegnazioni non bloccanti si usano per la logica sequenziale: circuiti che usano un clock e hanno memoria (flip-flop, registri, contatori).

always @(posedge clk) begin
  q <= d;           // q riceve d sul fronte del clock
  count <= count + 1; // count aumenta sul fronte del clock
end

Entrambe le assegnazioni avvengono nello stesso momento, utilizzando i valori precedenti al fronte di clock.

Riepilogo

RegolaSpiegazione
Usa <= per la logica sequenzialealways @(posedge clk)
Usa = per la logica combinatoriaalways @(*)
Le assegnazioni non bloccanti vengono eseguite in paralleloTutte le assegnazioni avvengono contemporaneamente
I valori si aggiornano alla fine dell'intervallo di tempoNon immediatamente
challenge icon

Sfida

Completa l'assegnazione non bloccante

Aggiungi le assegnazioni non bloccanti mancanti per far funzionare questo registro a scorrimento a 2 bit.

Come funziona:

  • A ogni fronte di clock, q1 riceve d
  • q2 riceve il valore precedente di q1

Cosa fare:

  1. Assegna d a q1 (non bloccante)
  2. Assegna q1 a q2 (non bloccante)

Provalo tu

module shift_register (
  input clk,
  input reset,
  input d,
  output reg q1,
  output reg q2
);
  
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      q1 <= 0;
      q2 <= 0;
    end else begin
      // TODO: Aggiungi la logica di scorrimento
      // Passaggio 1: Assegna d a q1 (assegnazione non bloccante)
      // Passaggio 2: Assegna q1 a q2 (assegnazione non bloccante)
    end
  end
endmodule
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fondamenti

Esercitati da solo: Compilatore Verilog online