Bloque Always
Parte de la sección Fundamentos del Journey de Verilog de Coddy. Lección 46 de 90.
Un bloque procedimental es un bloque de código en el que las instrucciones se ejecutan una después de otra, en secuencia, igual que en lenguajes de programación de software como C o Python. Verilog tiene dos bloques procedimentales: initial (se ejecuta una vez) y always (se ejecuta continuamente). Empecemos con el bloque always.
El bloque always se ejecuta continuamente. Se repite indefinidamente una vez que comienza la simulación. Se utiliza para describir hardware que debe seguir funcionando, como los biestables, los contadores y la lógica combinacional.
Sintaxis básica:
always @(sensitivity_list) begin
// Código que se ejecuta repetidamente
end@(sensitivity_list) le indica al bloque cuándo ejecutarse. Sin él (y sin ningún retardo como #5 en su interior), el bloque entraría en un bucle infinito y bloquearía la simulación.
Ejemplo de bloque always: contador
Aquí tienes un ejemplo de cómo podemos usar el bloque always para crear un contador.
module counter (
input clk,
output reg [3:0] count
);
always @(posedge clk) count <= count + 1;
endmoduleCómo funciona este código
| Parte | Significado |
|---|---|
always | Ejecuta este código repetidamente, para siempre |
@(posedge clk) | Espera a que el reloj pase de 0 a 1 (flanco ascendente) |
count <= count + 1 | Toma el valor actual de count, suma 1 y lo vuelve a guardar |
El bloque se ejecuta en cada flanco ascendente del reloj. Cada vez, count aumenta en 1.
La lista de sensibilidad @(posedge clk) indica que se ejecute solo en los flancos del reloj, no continuamente. Sin esto, el bucle se ejecutaría para siempre sin demora.
Bloque always con múltiples señales
Puedes enumerar señales específicas:
always @(a or b) begin
out = a & b;
endEsto se ejecuta cuando a o b cambia.
Desafío
Añade el bloque always que falta para que este módulo funcione.
Cómo funciona:
- En cada flanco ascendente del reloj,
out1cambia de estado (pasa de 0 a 1 o de 1 a 0) out2sigue aout1(tiene el mismo valor queout1)
Qué hacer:
- Añade un bloque
always @(posedge clk) - Dentro, haz que
out1cambie de estado (usaout1 = ~out1) - Haz que
out2sea igual aout1
Pruébalo tú mismo
module toggler (
input clk,
output reg out1,
output reg out2
);
initial begin
out1 = 0;
out2 = 0;
end
// TODO: Añade un bloque always con posedge clk
// out1 cambia de estado en cada ciclo de reloj
// out2 sigue a out1
endmoduleEsta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Fundamentos
1Introducción
Qué es VerilogHardware frente a softwareTu primer móduloComentariosNiveles de abstracción del diseño4Operadores, parte 1
Operadores aritméticosOperador móduloOperadores de comparaciónRepaso: matemáticas simplesOperadores bit a bit7Asignaciones y compuertas
Asignación continuaAsignación con operadoresPrimitivas de compuertas integradasCompuertas AND, OR y NOTCompuertas XOR y XNORRepaso: circuito de compuertas lógicas10Toma de decisiones
Sentencia IfIf - ElseRepaso - Comparador simpleSentencia CaseCasex y CasezRepaso - Diseño de ALU5Operadores, parte 2
Operadores lógicosOperadores de reducciónOperadores de desplazamientoOperador de concatenaciónOperador condicionalRepaso: desafío de operadores11Bucles
Bucle ForBucle WhileBucle de repeticiónBucle infinitoInstrucción DisableRepaso: patrones de bucles3Sistema numérico
Representación binariaNúmeros con tamañoNúmeros sin tamañoNúmeros negativosValores especiales X y ZRepaso: formatos numéricos6Módulos
Estructura de módulosPuertos de entrada y salidaPuertos inoutInstanciación de módulosAsignación de puertos por nombreAsignación de puertos por ordenRepaso: construir un módulo9Bloques procedurales
Bloque AlwaysBloque InitialLista de sensibilidadAsignación bloqueanteAsignación no bloqueanteRepaso: Always vs InitialPractica por tu cuenta: Compilador de Verilog online