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étodo | Descripción |
|---|---|
always con retardo # | Método más común |
Bucle forever | Método alternativo |
Bucle repeat | Para 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 = 0en el tiempo 0- Cada 5 unidades de tiempo,
clkcambia 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
endMismo 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
endGenera exactamente 10 flancos de reloj (5 ciclos completos) y luego se detiene.
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:
- Inicializa
clka 0 en el tiempo 0 usando un bloqueinitial - Usa un bloque
alwayscon un retardo para cambiar el estado declkcada 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 = 10Método 2: Bucle forever
initial begin
clk = 0;
forever #5 clk = ~clk;
endMétodo 3: Repeat (número fijo de flancos)
initial begin
clk = 0;
repeat(10) #5 clk = ~clk; // 10 flancos = 5 ciclos
endPrué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
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 ALU13Temporización y retardos
¿Qué son los retardos?Retardos de compuertaRetardos de asignaciónDirectiva TimescaleGeneración de relojResumen - Control de temporización5Operadores 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ódulo