Menu
Coddy logo textTech

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 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 procedurales: initial (se ejecuta una vez) y always (se ejecuta continuamente). Comencemos con el bloque always.

El bloque always se ejecuta de forma continua: se repite indefinidamente una vez que comienza la simulación. Se utiliza para describir hardware que necesita mantenerse en funcionamiento, como flip-flops, contadores y lógica combinacional.

Sintaxis básica:

always @(sensitivity_list) begin
  // Código que se ejecuta repetidamente
end

El @(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 congelarí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;
endmodule

Cómo funciona este código

ParteSignificado
alwaysEjecuta este código repetidamente, para siempre
@(posedge clk)Espera a que el reloj cambie de 0 a 1 (flanco de subida)
count <= count + 1Toma el valor actual de count, suma 1 y vuelve a almacenarlo

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.

Always Block con Múltiples Señales

Puedes listar señales específicas:

always @(a or b) begin
  out = a & b;
end

Esto se ejecuta cuando a o b cambia.

challenge icon

Desafío

Agrega el bloque always que falta para hacer que este módulo funcione.

Cómo funciona:

  • En cada flanco ascendente de clock, out1 conmuta (cambia) de 0 a 1 o de 1 a 0
  • out2 sigue a out1 (mismo valor que out1)

Qué hacer:

  1. Agrega un bloque always @(posedge clk)
  2. Dentro, haz que out1 conmute (usa out1 = ~out1)
  3. Haz que out2 sea igual a out1

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 conmuta en cada reloj
  // out2 sigue a out1

endmodule
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Fundamentos