El reloj es la señal periódica que coordina cuándo cambian de estado los registros dentro de un circuito digital.
Hasta este punto del curso, hemos diseñado circuitos puramente combinacionales. Puertas AND, OR, multiplexores… En estos circuitos, si cambias la entrada, la salida cambia “al instante” (tan rápido como los electrones pueden cruzar el silicio).
El mundo real no es estático. Necesitamos recordar el pasado (memoria) y coordinar acciones (secuencia).
Para lograr esto, necesitamos un director de orquesta que marque el ritmo. Necesitamos la señal más importante de toda la FPGA: El Reloj (Clock).
Hoy entramos en el dominio de la Lógica Secuencial.
¿Qué es el reloj?
Imagina una orquesta con 100 músicos. Si cada uno toca su nota tan rápido como puede, el resultado sería un ruido caótico. Necesitan un director que mueva la batuta. Nadie toca la siguiente nota hasta que el director da la señal.
En una FPGA, el Reloj (clk) es esa batuta. Es una señal eléctrica (onda cuadrada) que oscila constantemente entre 0 y 1 a una velocidad fija (Frecuencia).
- Nivel Bajo (0): El circuito “descansa”.
- Nivel Alto (1): El circuito “descansa”.
- El Cambio (Flanco): ¡ACCIÓN!
En los diseños síncronos, los registros no capturan nuevos datos mientras el reloj está en 0 o en 1. Capturan justo en el flanco.
El flanco de subida (posedge)
En Verilog, verás constantemente esta instrucción:
always @(posedge clk)posedge significa Positive Edge (Flanco de Subida). Es el instante infinitesimal en el que la señal pasa de 0 a 1.
¿Por qué usamos el flanco y no el nivel?
Porque el flanco es un evento puntual. Define un “ahora” exacto.
Si usáramos el nivel (mientras clk es 1), la señal estaría activa durante mucho tiempo (nanosegundos), y en ese tiempo los electrones podrían dar varias vueltas al circuito, causando caos e inestabilidad.
Al usar el flanco, tomamos una “foto” del estado de las entradas en ese preciso instante y actualizamos las salidas.
Sincronismo y estabilidad
Decimos que una parte del diseño es síncrona cuando sus elementos de memoria se coordinan con una señal de reloj. Un sistema puede contener varios dominios de reloj, pero las señales que cruzan entre ellos necesitan un tratamiento específico.
Esto permite que los registros no capturen los glitches intermedios siempre que las señales se estabilicen a tiempo.
El problema de los glitches
Imagina que tienes una suma A + B.
Si A cambia de 0 a 1 un nanosegundo antes que B, la salida de la suma podría dar un valor erróneo momentáneo antes de estabilizarse.
Si conectaras esa salida inestable a otro circuito, el error se propagaría como una bola de nieve.
La solución síncrona
En un diseño síncrono, no nos importa lo que pase entre tic y tac del reloj.
- Tic (Flanco): Los datos salen de los registros.
- Tiempo de vuelo: Los datos atraviesan las puertas lógicas (sumas, muxes…). Durante este tiempo, los cables tienen “basura” o valores transitorios.
- Tac (Siguiente Flanco): Para cuando llega el siguiente flanco, las señales ya se han estabilizado. Los registros capturan el resultado limpio y correcto.
Para que el dato se capture correctamente deben cumplirse los tiempos de setup y hold, además de considerar el retardo de la lógica, del routing y la incertidumbre del reloj.
Implementación en Verilog
Vamos a ver la diferencia visual entre un circuito combinacional (sin reloj) y uno secuencial (con reloj).
Circuito combinacional
Este bloque se activa si cambia a o b. La salida cambia inmediatamente.
// Lógica Combinacional (Sin memoria)
always @(a or b) begin
// O mejor: always @(*)
y = a & b;
endCircuito secuencial
Este bloque se activa solo cuando sube el reloj. No importa si a o b cambian mil veces en medio del ciclo; el circuito las ignora hasta que llega el flanco.
// Lógica Secuencial (Memoria / Síncrono)
always @(posedge clk) begin
y <= a & b; // Usamos asignación no bloqueante
endFrecuencia máxima (Fmax)
Esto nos lleva a un concepto clave de ingeniería. ¿Cómo de rápido podemos ir?
Si ponemos un reloj de 1 GHz, el tiempo entre flancos es de 1 nanosegundo. Si nuestra lógica (las sumas y multiplicaciones) tarda 2 nanosegundos en calcular el resultado, cuando llegue el siguiente flanco el dato aún no estará listo. Capturaremos basura.
El Timing Analysis del toolchain calcula exactamente esto:
- Ruta Crítica: El camino más largo entre dos Flip-Flops.
- Frecuencia Máxima: La velocidad límite antes de que el circuito falle.