Blocco always
Fa parte della sezione Fondamenti del percorso Verilog di Coddy. Lezione 46 di 90.
Un blocco procedurale è un blocco di codice in cui le istruzioni vengono eseguite una dopo l'altra, in sequenza, proprio come nei linguaggi di programmazione software come C o Python. Verilog ha due blocchi procedurali: initial (viene eseguito una volta) e always (viene eseguito continuamente). Iniziamo con il blocco always.
Il blocco always viene eseguito continuamente. Si ripete all'infinito una volta avviata la simulazione. Viene usato per descrivere hardware che deve continuare a funzionare, come flip-flop, contatori e logica combinatoria.
Sintassi di base:
always @(sensitivity_list) begin
// Codice che viene eseguito ripetutamente
end@(sensitivity_list) indica al blocco quando eseguire. Senza di esso (e senza ritardi come #5 al suo interno), il blocco entrerebbe in un ciclo infinito e bloccherebbe la simulazione.
Esempio di blocco always: contatore
Ecco un esempio di come possiamo usare il blocco always per creare un contatore.
module counter (
input clk,
output reg [3:0] count
);
always @(posedge clk) count <= count + 1;
endmoduleCome funziona questo codice
| Parte | Significato |
|---|---|
always | Esegui questo codice ripetutamente, per sempre |
@(posedge clk) | Attendi che il clock passi da 0 a 1 (fronte di salita) |
count <= count + 1 | Prendi il valore attuale di count, aggiungi 1 e salvalo di nuovo |
Il blocco viene eseguito a ogni fronte di salita del clock. Ogni volta, count aumenta di 1.
La lista di sensibilità @(posedge clk) indica di eseguirlo solo sui fronti di clock, non continuamente. Senza questo, il ciclo continuerebbe a essere eseguito per sempre senza ritardi.
Blocco always con più segnali
Puoi elencare segnali specifici:
always @(a or b) begin
out = a & b;
endQuesto viene eseguito quando cambia a o b.
Sfida
Aggiungi il blocco always mancante per far funzionare questo modulo.
Come funziona:
- A ogni fronte di salita del clock,
out1commuta (passa) da 0 a 1 o da 1 a 0 out2segueout1(ha lo stesso valore diout1)
Cosa fare:
- Aggiungi un blocco
always @(posedge clk) - Al suo interno, fai commutare
out1(usaout1 = ~out1) - Imposta
out2uguale aout1
Provalo tu
module toggler (
input clk,
output reg out1,
output reg out2
);
initial begin
out1 = 0;
out2 = 0;
end
// TODO: Aggiungi un blocco always con posedge clk
// out1 cambia stato a ogni ciclo di clock
// out2 segue out1
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