01 · Punto de partida
Recordar todo es imposible; recordar nada, insuficiente
La alarma del tema anterior guardaba un único bit: «hay un evento pendiente». No registraba cuántas veces se abrió la puerta, a qué hora ni durante cuánto tiempo. Y funcionaba, porque para decidir lo que tenía que hacer después ese bit era todo lo necesario.
Esa observación es el corazón de los circuitos secuenciales. Un circuito no puede almacenar su historia completa: cada bit cuesta un flip-flop, espacio, energía y tiempo de diseño. Tampoco puede olvidarla toda, porque entonces sería combinacional. Diseñar un sistema secuencial consiste en decidir qué información mínima hay que conservar para responder correctamente a lo que venga.
Trabajaremos con un ejemplo que se repite en muchos cursos de diseño digital: un torniquete que se libera con una moneda. Es suficientemente chico para analizarlo completo y suficientemente rico para mostrar las decisiones de diseño.
02 · Definición
El estado es un resumen de la historia
Un estado es la información que un circuito conserva del pasado y que, junto con las entradas actuales, alcanza para determinar su comportamiento futuro. No es la historia completa: es la parte que importa.
Una forma práctica de decidir si dos historias corresponden al mismo estado es esta pregunta: ¿existe alguna secuencia de entradas futuras que produzca resultados distintos? Si ninguna las distingue, el circuito no necesita diferenciarlas y ambas pueden resumirse en el mismo estado.
| Historia | Qué ocurrió | Situación final | Próxima persona que empuje |
|---|---|---|---|
| A | Nada | Bloqueado | No pasa |
| B | M, luego P | Bloqueado | No pasa |
| C | M, P, M, P, P | Bloqueado | No pasa |
| D | M | Libre | Pasa |
Las historias A, B y C son muy distintas (una vacía, una con un cobro y un paso, una con dos cobros y tres empujes), pero ningún futuro las diferencia: en las tres hace falta una moneda para que alguien pase. Son el mismo estado. La historia D sí se comporta distinto, así que es otro estado.
03 · Un caso completo
Un torniquete que cobra
Especificación: un torniquete de acceso tiene un cerrojo. Dos sensores entregan, en cada ciclo de reloj, una señal M (se detectó una moneda válida) y una señal P (alguien empujó el brazo). Arranca bloqueado. Una moneda libera el paso; cuando alguien pasa, vuelve a bloquearse. El cerrojo se energiza, es decir, se abre, solo mientras el torniquete está libre.
Antes de dibujar nada, listamos qué cosas hay que recordar. Cuando llega un empuje, la respuesta depende de si ya se pagó. Esa es la única pieza de la historia que importa, así que alcanzan dos estados: Bloqueado (sin pago pendiente) y Libre (pago recibido, paso disponible).
Cada flecha lleva la condición de entrada que provoca esa transición. Cada estado tiene exactamente las flechas necesarias para cubrir todas las combinaciones de M y P: eso se verifica con la tabla completa.
| M | P | Si Q = Bloqueado | Si Q = Libre | Comentario |
|---|---|---|---|---|
| 0 | 0 | Bloqueado | Libre | Se conserva el estado |
| 1 | 0 | Libre | Libre | La moneda libera el paso; una segunda moneda no suma |
| 0 | 1 | Bloqueado | Bloqueado | Empujar sin pagar no hace nada; pasar consume el pago |
| 1 | 1 | Bloqueado | Bloqueado | Elegimos que el empuje gane |
Cuando la moneda y el empuje llegan en el mismo ciclo, la especificación original no decía qué hacer. Hay dos respuestas razonables: gana el empuje (quien empujó pasa si estaba libre, y la moneda simultánea se pierde) o gana la moneda (el torniquete queda libre, incluso si acaba de pasar alguien). La primera pierde una moneda; la segunda puede dejar pasar a alguien sin pagar. Un diseñador elige y lo documenta, y el laboratorio te deja probar ambas.
Si codificamos Bloqueado como 0 y Libre como 1, con la política «gana el empuje» el bit de estado cumple una ecuación que ya conocés:
Y[n] = Q[n]
Es la misma forma que la alarma del tema 1, con la moneda como «set» y el empuje como «reset» prioritario. Dos problemas distintos, un mismo patrón: un bit que se activa con un evento, se mantiene y se borra con otro. Conviene reconocerlo, porque aparece una y otra vez.
04 · El modelo
Estado actual, entradas, próximo estado y salidas
Todo circuito secuencial síncrono se describe con las mismas cuatro piezas:
| Pieza | Símbolo | En el torniquete | En el hardware |
|---|---|---|---|
| Estado actual | Q[n] | Bloqueado o Libre | Salidas de los flip-flops |
| Entradas | X[n] | M y P | Señales sincronizadas con el reloj |
| Próximo estado | Q[n + 1] = f(Q[n], X[n]) | Tabla de transición | Lógica combinacional que alimenta las entradas D |
| Salida | Y[n] = g(Q[n]) | Cerrojo abierto solo si Libre | Lógica combinacional (o un cable directo) |
Dos cosas conviene notar. Primero, f nunca guarda nada: es lógica combinacional pura, como las que diseñaste en el curso anterior, con Q como una entrada más. Segundo, el almacenamiento está en un solo lugar, el registro de estado, que captura Q+ en cada flanco del reloj. Toda la «memoria» del sistema está ahí.
Cuando la salida depende solo del estado, como en el torniquete, el modelo se llama de Moore. Si además puede depender de las entradas actuales, es de Mealy. Las diferencias de tiempo y de diseño son importantes y las veremos con detalle más adelante; por ahora basta saber que existen.
05 · Medir el estado
Cuántos bits hacen falta
Cada flip-flop guarda un bit. Con n bits hay 2n combinaciones distintas, así que para distinguir N estados se necesitan:
| Estados N | Bits mínimos | Combinaciones disponibles | Sin usar |
|---|---|---|---|
| 2 | 1 | 2 | 0 |
| 3 | 2 | 4 | 1 |
| 4 | 2 | 4 | 0 |
| 5 a 8 | 3 | 8 | 0 a 3 |
| 9 a 16 | 4 | 16 | 0 a 7 |
| 37 | 6 | 64 | 27 |
| 1000 | 10 | 1024 | 24 |
Estados no usados
Si N no es potencia de 2, sobran combinaciones. Un sistema de 3 estados con 2 bits tiene una combinación «extra». El circuito puede caer allí al encender (los flip-flops arrancan con valores indeterminados) o por una perturbación eléctrica. Un diseño cuidadoso decide qué hace en esos casos: llevar a un estado conocido, o garantizar que no son alcanzables. No dejarlo definido es un error clásico.
Asignar códigos a los estados
Elegir qué combinación de bits representa a cada estado es un paso de diseño. Con 4 estados, por ejemplo:
| Estado | Binario | Gray | One-hot |
|---|---|---|---|
| E0 | 00 | 00 | 0001 |
| E1 | 01 | 01 | 0010 |
| E2 | 10 | 11 | 0100 |
| E3 | 11 | 10 | 1000 |
El binario usa la menor cantidad de flip-flops; el Gray cambia un solo bit por paso (útil cuando se recorren los estados en orden); el one-hot usa un flip-flop por estado, más hardware de almacenamiento pero lógica de próximo estado muy simple y salidas inmediatas. Ninguno es mejor en todo: es un compromiso entre flip-flops, lógica y velocidad.
«Memoria» tiene dos sentidos
En este curso la palabra memoria se usa de dos maneras. La primera es la que acabamos de ver: el estado de un circuito, unos pocos bits que resumen su historia. La segunda es la que aparece en el último bloque: arreglos de muchas palabras (RAM, ROM, Flash) a las que se accede por dirección. Un registro de 8 bits tiene 256 configuraciones posibles; una memoria de 1 KiB tiene 8192 bits y sería impráctico tratarla como una máquina de estados con 28192 estados. Se la usa por direcciones, como un conjunto de variables, no como un solo estado gigante.
06 · Decisiones de diseño
La especificación decide el estado
No existe «el» estado de un torniquete: depende de qué se le pida. Cada requisito nuevo puede agregar información que hay que recordar. Probemos con cuatro versiones:
| Requisito | Qué hay que recordar | Estados | Bits mínimos |
|---|---|---|---|
| 1. Una moneda libera un paso; no se acumulan | ¿Hay un pago pendiente? | 2 | 1 |
| 2. Se acumulan hasta 3 monedas, un paso por moneda | Cuántos créditos hay: 0, 1, 2 o 3 | 4 | 2 |
| 3. Como la 2, y además una alarma por cada empuje sin pagar, hasta que el operador la borra | Créditos (0 a 3) y si hay alarma pendiente | 4 × 2 = 8 | 3 |
| 4. Como la 1, pero tras cada paso se esperan 2 ciclos antes de aceptar otra moneda | Si está libre, o cuántos ciclos de espera quedan (0, 1 o 2) | 4: Libre, Listo, Espera 1, Espera 2 | 2 |
Observá que en la versión 4 el estado incluye tiempo: el circuito recuerda cuánto falta. Esto es lo que permite que un sistema síncrono cuente ciclos, y es la base de los contadores y temporizadores que estudiaremos más adelante.
07 · Analogía con programación
Constantes, una función de transición y un reduce
Si programás, ya usás máquinas de estados: un componente con modos, un flujo de pago, un analizador léxico. La estructura es la misma que acabamos de ver: un valor de estado, una función que calcula el próximo y otra que produce la salida.
Python en tu navegador. Los bloques son editables: cambiá los valores y presioná «Ejecutar Python». La primera vez tarda unos segundos en cargar.
from functools import reduce
BLOQUEADO, LIBRE = 0, 1
def proximo(q, moneda, empuje):
"""f: próximo estado (si llegan juntas, gana el empuje)."""
if empuje:
return BLOQUEADO
if moneda:
return LIBRE
return q
def cerrojo_liberado(q):
"""g: salida (modelo de Moore: depende solo del estado)."""
return q == LIBRE
q = BLOQUEADO
eventos = [(1, 0), (1, 0), (0, 1), (1, 1), (0, 0), (1, 0)]
trazas = []
for m, p in eventos:
q = proximo(q, m, p) # cada iteración es un flanco de reloj
trazas.append(q)
print(*trazas) # 1 1 0 0 0 1
# El mismo recorrido con reduce: el estado es el acumulador
final = reduce(lambda s, e: proximo(s, *e), eventos, BLOQUEADO)
print(final, cerrojo_liberado(final)) # 1 True
Los seis estados siguientes son 1 1 0 0 0 1 (0 = Bloqueado, 1 = Libre) y el reduce llega al mismo estado final: 1 True. Cambiá proximo para que gane la moneda cuando llegan juntas y comparalo: la secuencia pasa a ser 1 1 0 1 1 1.
La función proximo es pura. Todo el estado vive en una variable, o en el acumulador de un reduce, igual que en el hardware vive en los flip-flops. Si te resulta familiar el patrón nuevo_estado = reductor(estado, evento) de las bibliotecas de manejo de estado de las aplicaciones, es exactamente el mismo modelo.
También se puede escribir proximo como una tabla indexada por estado y entradas, que es literalmente la tabla de transición:
TABLA = {
0: {"00": 0, "10": 1, "01": 0, "11": 0}, # Bloqueado: la clave es "MP"
1: {"00": 1, "10": 1, "01": 0, "11": 0}, # Libre
}
def siguiente(q, m, p):
return TABLA[q][f"{m}{p}"]
for q in (0, 1):
for m in (0, 1):
for p in (0, 1):
print(f"Q={q} M={m} P={p} -> {siguiente(q, m, p)}")
Son las ocho filas de la tabla de transición del torniquete. Las dos filas con M = 1 y P = 1 dan 0 porque elegimos que gane el empuje.
Como en el tema anterior, el código es un modelo para razonar. Una diferencia importante: en un programa, el cambio de estado ocurre cuando una línea se ejecuta; en un circuito síncrono, todos los flip-flops capturan su próximo estado a la vez, en el flanco del reloj, usando los valores anteriores.
08 · Exploración interactiva
Recorrer el diagrama de estados
Las casillas fijan M y P; el botón genera un único flanco ascendente ideal. El estado actual aparece resaltado y, si hubiera un flanco ahora, el estado destino se marca con un círculo punteado. La política indica qué pasa cuando llegan M y P juntas. El contador de cobertura registra cuántas de las 8 combinaciones de la tabla (dos estados por cuatro entradas) ya probaste.
Torniquete de dos estados
Estado inicial: Bloqueado, Q = 0. Todavía no se generaron flancos.
| Flanco | M | P | Q antes | Q después | Cerrojo |
|---|---|---|---|---|---|
| Sin flancos registrados. | |||||
Reiniciar simulación restaura las entradas, la política, Q = Bloqueado, la cobertura y el historial. Es una comodidad del simulador: en el circuito, volver al estado inicial exige un mecanismo de arranque, un tema que veremos más adelante.
Recorrido guiado
- Activá M. El próximo estado pasa a Libre, pero el estado actual sigue en Bloqueado hasta el flanco. Generá el flanco: Q = 1 y el cerrojo se abre.
- Con M todavía activa, generá otro flanco. Sigue Libre: la segunda moneda sobra, el torniquete no acumula créditos.
- Desactivá M y activá P. Generá el flanco: vuelve a Bloqueado. Pasó una persona.
- Con P activa y Bloqueado, generá otro flanco. Empujar sin pagar no cambia nada.
- Activá M y P juntas, con el torniquete Libre y la política «gana el empuje». Pasa a Bloqueado y se pierde la moneda. Reiniciá, repetí la secuencia con la política «gana la moneda» y comprobá que queda Libre.
- Seguí probando hasta completar las 8 combinaciones. Es el equivalente de verificar todas las filas de la tabla en la mesa.
Desafío: llegar a Libre sin generar ningún flanco con M activa
No es posible. Con M activa, el próximo estado es Libre, pero Q solo cambia en un flanco. Y si M sube y baja entre dos flancos, la moneda pasa inadvertida, como la detección perdida del tema anterior. Un sistema real necesita capturar los pulsos, por ejemplo con un biestable de entrada, si quiere detectar eventos más cortos que el período del reloj.
09 · Método de trabajo
Cómo encontrar los estados
- Escribí las entradas, las salidas y el reloj. Indicá qué significa cada valor y cuándo se muestrean las entradas.
- Narrá casos típicos y casos raros. Recorré historias concretas: «paga y pasa», «empuja sin pagar», «paga dos veces». Las situaciones simultáneas deben estar entre ellas.
- Preguntá en cada punto: ¿qué necesito recordar para decidir lo que viene? Si dos situaciones tienen el mismo futuro posible, son el mismo estado.
- Nombrá y numerá los estados. El nombre debe describir la información que resumen («Libre», «Espera 1»), no el camino que llevó hasta ahí.
- Completá la tabla de transición. Cada estado necesita una respuesta para todas las combinaciones de entradas, incluidas las simultáneas o imposibles.
- Definí las salidas y el estado inicial. Decidí si dependen solo del estado y qué mecanismo lleva al circuito al arranque.
- Calculá los bits y revisá los sobrantes. Con N estados, ⌈log₂ N⌉ bits; decidí qué ocurre con las combinaciones sin usar.
- Recorré secuencias. Anotá entradas, estado antes y después. Cubrí cada fila de la tabla al menos una vez.
Cuando el sistema esté armado, la prueba tiene el mismo orden: comprobar alimentación, reloj y estado inicial; recién entonces forzar las entradas una por una y observar el estado. Un analizador lógico con el reloj como disparo permite ver en una sola captura la entrada, el próximo estado y el estado capturado.
10 · Comprensión
Confusiones frecuentes
«El estado es lo mismo que la salida»
En el torniquete la salida coincide con el bit de estado, pero es una coincidencia de este diseño. Un estado puede tener varias salidas, o ninguna visible. El estado es lo que el circuito lleva adentro; la salida, lo que muestra.
«Un estado por cada historia posible»
Las historias son infinitas; los estados, pocos. Las historias que dejan al sistema en la misma situación futura se agrupan en un solo estado.
«Más estados dan un diseño más seguro»
Los estados redundantes consumen flip-flops, complican la lógica y agregan combinaciones que verificar. Se busca el menor número que cumpla la especificación, y se fusionan los equivalentes.
«Con 3 estados necesito 3 bits»
Bastan 2 bits en binario. Tres bits (un flip-flop por estado) corresponden a la codificación one-hot, una elección posible, no una necesidad.
«Las combinaciones sin usar no importan»
Importan al arrancar y ante ruido. Si el circuito puede caer en una, hay que definir a dónde va; si no puede, hay que garantizarlo con un arranque adecuado.
«Si dos entradas coinciden, el circuito sabrá qué hacer»
El circuito hace lo que su lógica dice, y la lógica sale de la tabla. Si la especificación no definió el caso, alguien lo definió sin querer. En el torniquete, la elección entre «gana el empuje» y «gana la moneda» cambia quién pierde.
«La memoria de un circuito y la RAM son lo mismo»
Comparten el nombre y la idea de conservar bits, pero el estado de un circuito es un resumen pequeño que interviene en cada decisión; la RAM es un gran arreglo que se accede por dirección. Estudiaremos la segunda en el último bloque.
11 · Práctica guiada
Predecí antes de comprobar
1. Contar estados y bits
Un semáforo recorre tres fases: verde, amarillo y rojo, en ese orden y de forma repetitiva. ¿Cuántos estados y cuántos bits como mínimo? ¿Qué pasa con la combinación sobrante?
Ver solución razonada
Tres estados y 2 bits, porque ⌈log₂ 3⌉ = 2. Queda una combinación de las cuatro posibles sin usar. Hay que decidir: o el diseño la lleva al estado inicial (por ejemplo, rojo) en el siguiente flanco, o se garantiza que el arranque nunca la produzca. Dejarla sin definir permite que el semáforo muestre una combinación imprevista tras un arranque defectuoso.
2. Seguir una secuencia
Arrancando Bloqueado, aplicá en seis flancos estas parejas (M, P): (1,0), (1,0), (0,1), (1,1), (0,0), (1,0). ¿Cuáles son los seis estados siguientes con cada política?
Ver solución
Con «gana el empuje»: L, L, B, B, B, L. Con «gana la moneda»: L, L, B, L, L, L. Se diferencian en el cuarto flanco, el único con M = P = 1, y esa diferencia se propaga: con la segunda política el torniquete queda Libre y la persona siguiente pasa sin pagar. Comprobalo en el laboratorio.
3. Un gran número de estados
Un protocolo tiene 37 estados. ¿Cuántos bits necesita en binario y cuántas combinaciones sobran? ¿Y en one-hot?
Ver solución
2⁵ = 32 es menor que 37 y 2⁶ = 64 lo supera, así que 6 bits y 64 − 37 = 27 combinaciones sin usar. En one-hot haría falta 1 bit por estado: 37 flip-flops, a cambio de una lógica de próximo estado más simple.
4. ¿Depende solo del estado?
Agregás una salida A que se activa cuando alguien empuja con el torniquete bloqueado. ¿Puede calcularse solo con el estado?
Ver solución razonada
No. A = 1 cuando Q = Bloqueado y P = 1: depende del estado y de una entrada actual. Es una salida de tipo Mealy. Si se quiere que dependa solo del estado, hay que agregar un estado, como «Intruso», y que la salida se active allí; la alarma se retrasa un ciclo. Es una elección típica que retomaremos al estudiar Moore y Mealy.
5. Fusionar estados equivalentes
Una compañera diseñó el torniquete con tres estados: B1 (bloqueado), B2 (bloqueado después de un empuje) y L. B2 responde igual que B1 ante cualquier secuencia: con M pasa a L, y con cualquier otra entrada se queda en B2 o B1 sin diferencia visible. ¿Hace falta B2?
Ver solución
No. Ninguna secuencia futura distingue a B1 de B2, así que son el mismo estado y deben fusionarse. Se pasa de 3 estados (2 bits, con una combinación sobrante) a 2 (1 bit), con menos hardware y sin combinaciones indefinidas.
6. Especificar con cuidado
Un contador de créditos va de 0 a 3. M suma un crédito y P consume uno si hay. Enumerá los casos que la especificación debe aclarar.
Ver solución razonada
Hay que decidir: (a) M con 3 créditos: ¿se ignora, se satura o se señala un error? (b) P con 0 créditos: ¿se ignora o genera una alarma? (c) M y P juntas con 0 créditos: ¿P se ignora y M suma, o se cancelan? (d) M y P juntas con 3: ¿queda en 3 o pasa a 2 por la prioridad? Con 4 estados y 4 entradas hay 16 filas; cada una necesita una respuesta explícita.
12 · Síntesis
Ideas para recordar
- Un estado es el resumen de la historia que, junto con las entradas, determina el futuro. Historias con el mismo futuro son el mismo estado.
- El modelo tiene cuatro piezas: estado actual, entradas, próximo estado f(Q, X) y salidas g.
- La lógica de próximo estado y la de salida son combinacionales; el único almacenamiento es el registro de estado.
- Para N estados hacen falta ⌈log₂ N⌉ bits; las combinaciones sobrantes hay que definirlas.
- La especificación decide cuánta memoria se necesita: cada requisito puede agregar información que recordar.
- Hay que responder explícitamente a todas las combinaciones de entradas, incluidas las simultáneas.
- «Memoria» puede significar el estado de un circuito o un arreglo direccionable; son escalas muy distintas.
¿Listo para el tema 3?
Antes de avanzar, explicá con tus palabras por qué tres historias distintas del torniquete son el mismo estado, calculá cuántos bits hacen falta para 9 estados y describí una situación en la que la especificación original no alcanza para decidir el próximo estado. Si podés justificar las tres respuestas, ya podés mirar el tiempo con precisión.
En el próximo tema estudiaremos el reloj y los diagramas temporales: qué es un flanco, cómo se miden período, frecuencia y ciclo de trabajo, y cómo se lee un cronograma para saber cuándo cambia cada señal.