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
endTutte 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
endEntrambe le assegnazioni avvengono nello stesso momento, utilizzando i valori precedenti al fronte di clock.
Riepilogo
| Regola | Spiegazione |
|---|---|
Usa <= per la logica sequenziale | always @(posedge clk) |
Usa = per la logica combinatoria | always @(*) |
| Le assegnazioni non bloccanti vengono eseguite in parallelo | Tutte le assegnazioni avvengono contemporaneamente |
| I valori si aggiornano alla fine dell'intervallo di tempo | Non immediatamente |
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,
q1riceved q2riceve il valore precedente diq1
Cosa fare:
- Assegna
daq1(non bloccante) - Assegna
q1aq2(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
endmoduleQuesta lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fondamenti
1Introduzione
Cos'è VerilogHardware e software a confrontoIl tuo primo moduloCommentiLivelli di astrazione della progettazione4Operatori - Parte 1
Operatori aritmeticiOperatore moduloOperatori di confrontoRiepilogo - Matematica sempliceOperatori bitwise7Assegnazioni e porte
Assegnazione continuaAssegnazioni con operatoriPrimitive di porte integratePorte AND, OR e NOTPorte XOR e XNORRiepilogo: circuito con porte logiche10Decisioni
Istruzione ifIf-ElseRiepilogo - Comparatore sempliceIstruzione caseCasex e casezRiepilogo - Progettazione di una ALU5Operatori Parte 2
Operatori logiciOperatori di riduzioneOperatori di scorrimentoOperatore di concatenazioneOperatore condizionaleRiepilogo - Sfida sugli operatori3Sistema numerico
Rappresentazione binariaNumeri con dimensione specificataNumeri senza dimensione specificataNumeri negativiValori speciali X e ZRiepilogo - Formati numerici6Moduli
Struttura di un moduloPorte di input e outputPorte InoutIstanziazione di un moduloMappatura delle porte per nomeMappatura delle porte per ordineRiepilogo - Costruire un modulo9Blocchi procedurali
Blocco alwaysBlocco initialLista di sensibilitàAssegnazione bloccanteAssegnazione non bloccanteRiepilogo: always vs initial12Progetto Multiplexer
Progettazione di un mux da 2 a 1Progettazione di un mux da 4 a 1Esercitati da solo: Compilatore Verilog online