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 donde las sentencias se ejecutan una tras otra, en secuencia — al igual que en los 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 necesita seguir funcionando, como flip-flops, contadores y lógica combinacional.
Sintaxis básica:
always @(sensitivity_list) begin
// Código que se ejecuta repetidamente
endLa @(sensitivity_list) le indica al bloque cuándo ejecutarse. Sin ella, el bloque entraría en un bucle infinito y bloquearía la simulación.
Ejemplo de bloque Always: Contador
Aquí hay 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 de subida) |
count = count + 1 | Toma el valor actual de count, súmale 1 y guárdalo de nuevo |
El bloque se ejecuta en cada flanco de subida del reloj. Cada vez, count aumenta en 1.
La lista de sensibilidad @(posedge clk) le indica que se ejecute solo en los flancos de reloj, no de forma continua. Sin esto, el bucle se ejecutaría indefinidamente sin ningún retraso.
Bloque Always con Múltiples Señales
Puedes listar señales específicas:
always @(a or b) begin
out = a & b;
endEsto se ejecuta cuando a o b cambian.
Desafío
Añade el bloque always que falta para que este módulo funcione.
Cómo funciona:
- En cada flanco de subida del reloj,
out1conmuta (cambia) de 0 a 1 o de 1 a 0 out2sigue aout1(mismo valor queout1)
Qué hacer:
- Añade un bloque
always @(posedge clk) - Dentro, haz que
out1conmute (usaout1 = ~out1) - Haz que
out2sea igual aout1
Hoja de referencia
El bloque always se ejecuta continuamente y se utiliza para describir hardware como flip-flops y contadores.
always @(sensitivity_list) begin
// Código que se ejecuta repetidamente
end@(posedge clk) se activa en el flanco de subida del reloj; @(a or b) se activa cuando cambia cualquier señal de la lista.
// Contador: se incrementa en cada flanco de subida del reloj
always @(posedge clk) count = count + 1;
// Combinacional: se ejecuta cuando a o b cambian
always @(a or b) begin
out = a & b;
endNota: las salidas controladas por bloques always deben declararse como reg.
Pruébalo tú mismo
module toggler (
input clk,
output reg out1,
output reg out2
);
initial begin
out1 = 0;
out2 = 0;
end
// TODO: Añadir bloque always con posedge clk
// out1 cambia 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 Verilog?Hardware vs SoftwareNiveles de abstracción de diseñoTu primer móduloComentarios4Operadores Parte 1
Operadores aritméticosOperador de móduloOperadores de comparaciónRepaso - Matemáticas simplesOperadores bit a bit7Asignación y Compuertas
Asignación ContinuaAsignación con OperadoresPrimitivas de Compuertas IntegradasCompuertas AND OR NOTCompuertas XOR XNORResumen - 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 condicionalResumen - Desafío de operadores3Sistema de numeración
Representación binariaNúmeros con tamaño definidoNúmeros sin tamaño definidoNúmeros negativosValores especiales X y ZResumen - Formatos de números6Módulos
Estructura del móduloPuertos de entrada y salidaPuertos InoutInstanciación de módulosMapeo de puertos por nombreMapeo de puertos por ordenResumen: Construye un módulo9Bloques procedimentales
Bloque AlwaysBloque InitialLista de sensibilidadAsignación bloqueanteAsignación no bloqueanteResumen - Always vs Initial