Menu
Coddy logo textTech

Generación de reloj

Parte de la sección Fundamentos del Journey de Verilog de Coddy — lección 71 de 90.

Un reloj es una señal que alterna continuamente entre 0 y 1 a intervalos regulares. Los relojes son esenciales para la lógica secuencial como los flip-flops y los contadores.

Por qué generar un reloj

En los bancos de pruebas (testbenches), se necesita un reloj para probar circuitos secuenciales. El reloj dirige el comportamiento de los flip-flops, registros y máquinas de estados.

Métodos para generar un reloj

MétodoDescripción
always con retardo #Método más común
Bucle foreverMétodo alternativo
Bucle repeatPara un número fijo de ciclos

Método 1: Bloque Always con Retraso

reg clk;

initial begin
  clk = 0;
end

always #5 clk = ~clk;
  • clk = 0 en el tiempo 0
  • Cada 5 unidades de tiempo, clk cambia de estado
  • Periodo = 10 unidades de tiempo
  • Frecuencia = 1/10 = 0.1 por unidad de tiempo

Método 2: Bucle Forever

reg clk;

initial begin
  clk = 0;
  forever begin
    #5 clk = ~clk;
  end
end

Mismo resultado que el método always.

Método 3: Repetir por ciclos fijos

reg clk;

initial begin
  clk = 0;
  repeat (10) begin
    #5 clk = ~clk;
  end
end

Genera exactamente 10 flancos de reloj (5 ciclos completos) y luego se detiene.

challenge icon

Desafío

Añade el código que falta para generar un reloj que cambie de estado cada 4 unidades de tiempo (periodo = 8 unidades de tiempo).

Qué hacer:

  1. Inicializa clk a 0 en el tiempo 0 usando un bloque initial
  2. Usa un bloque always con un retardo para cambiar el estado de clk cada 4 unidades de tiempo

Hoja de referencia

Un reloj alterna entre 0 y 1 a intervalos regulares. Periodo = 2 × retraso.

Método 1: Bloque always (el más común)

reg clk;

initial begin
  clk = 0;
end

always #5 clk = ~clk; // Periodo = 10

Método 2: Bucle forever

initial begin
  clk = 0;
  forever #5 clk = ~clk;
end

Método 3: Repeat (número fijo de flancos)

initial begin
  clk = 0;
  repeat(10) #5 clk = ~clk; // 10 flancos = 5 ciclos
end

Pruébalo tú mismo

module clock_challenge;
  reg clk;
  
  // TODO: Paso 1 - Agregar un bloque initial para establecer clk = 0
  
  
  // TODO: Paso 2 - Agregar un bloque always para alternar clk cada 4 unidades de tiempo
  

  initial begin
    $monitor("Time %0t: clk = %b", $time, clk);
    #20;
    $display("Clock generated for 20 time units");
    $finish;
  end
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