Bloque Always
Parte de la sección Fundamentos del Journey de Verilog de Coddy. Lección 46 de 90.
Un bloque procedural 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 como C o Python. Verilog tiene dos bloques procedurales: initial (se ejecuta una vez) y always (se ejecuta continuamente). Empecemos con el bloque always.
El bloque always se ejecuta de forma continua. Se repite para siempre una vez que comienza la simulación. Se utiliza para describir hardware que debe seguir ejecutándose, como flip-flops, contadores y lógica combinacional.
Sintaxis básica:
always @(sensitivity_list) begin
// Código que se ejecuta repetidamente
endLa @(sensitivity_list) indica al bloque cuándo ejecutarse. Sin ella (y sin ningún retraso como #5 dentro), el bloque se repetiría infinitamente 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 vuelve a almacenarlo |
El bloque se ejecuta en cada flanco ascendente del reloj. Cada vez, count aumenta en 1.
La lista de sensibilidad @(posedge clk) le indica que se ejecute solo en los flancos del reloj, no continuamente. Sin esto, el bucle se ejecutaría indefinidamente 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 cambian.
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 (invierte su valor) 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 de él, haz que
out1cambie (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ñadir bloque always con posedge clk
// out1 alterna en cada clock
// 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