← Índice del curso

Circuitos Secuenciales y Memoria · Tema 2

Concepto de estado y memoria

En el tema anterior descubrimos que un circuito puede responder según lo que ocurrió antes. Ahora vamos a ponerle nombre y medida a ese «antes»: qué es exactamente un estado, cuándo dos historias son indistinguibles, cuántos bits hacen falta para representarlo y cómo decidir qué vale la pena recordar.

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.

Tres historias de un torniquete. M es una moneda y P un empuje; el torniquete arranca bloqueado.
HistoriaQué ocurrióSituación finalPróxima persona que empuje
ANadaBloqueadoNo pasa
BM, luego PBloqueadoNo pasa
CM, P, M, P, PBloqueadoNo pasa
DMLibrePasa

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).

Diagrama de estados del torniquete Dos estados, Bloqueado y Libre. Bloqueado pasa a Libre con moneda sin empuje y se conserva en el resto de los casos. Libre pasa a Bloqueado con un empuje y se conserva cuando no hay empuje. El arranque es en Bloqueado. BloqueadoQ = 0LibreQ = 1M y no PPno M, o Pno ParranqueY = 0: cerrojo cerradoY = 1: cerrojo abierto

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.

Tabla de transición del torniquete. Las filas con M = 1 y P = 1 exigen una decisión de diseño.
MPSi Q = BloqueadoSi Q = LibreComentario
00BloqueadoLibreSe conserva el estado
10LibreLibreLa moneda libera el paso; una segunda moneda no suma
01BloqueadoBloqueadoEmpujar sin pagar no hace nada; pasar consume el pago
11BloqueadoBloqueadoElegimos 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:

Q[n + 1] = NOT P[n] AND (Q[n] OR M[n])
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:

Las cuatro piezas, con el torniquete como ejemplo.
PiezaSímboloEn el torniqueteEn el hardware
Estado actualQ[n]Bloqueado o LibreSalidas de los flip-flops
EntradasX[n]M y PSeñales sincronizadas con el reloj
Próximo estadoQ[n + 1] = f(Q[n], X[n])Tabla de transiciónLógica combinacional que alimenta las entradas D
SalidaY[n] = g(Q[n])Cerrojo abierto solo si LibreLógica combinacional (o un cable directo)
Estructura general de un circuito secuencial síncrono Las entradas M y P entran en la lógica de próximo estado. Su resultado Q más entra en un registro de estado con reloj. La salida Q del registro vuelve a la lógica de próximo estado y alimenta la lógica de salida, que produce Y. MPLógica depróximo estadof(Q, M, P)Q+Registrode estadoflip-flopsQLógica de salida gYreloj

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:

n = ⌈log₂ N⌉ bits, el menor n con 2ⁿ ≥ N
Bits de estado según la cantidad de estados.
Estados NBits mínimosCombinaciones disponiblesSin usar
2120
3241
4240
5 a 8380 a 3
9 a 164160 a 7
3766427
100010102424

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:

Tres formas de codificar cuatro estados.
EstadoBinarioGrayOne-hot
E000000001
E101010010
E210110100
E311101000

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:

Misma máquina, cuatro especificaciones, distinta memoria.
RequisitoQué hay que recordarEstadosBits mínimos
1. Una moneda libera un paso; no se acumulan¿Hay un pago pendiente?21
2. Se acumulan hasta 3 monedas, un paso por monedaCuántos créditos hay: 0, 1, 2 o 342
3. Como la 2, y además una alarma por cada empuje sin pagar, hasta que el operador la borraCréditos (0 a 3) y si hay alarma pendiente4 × 2 = 83
4. Como la 1, pero tras cada paso se esperan 2 ciclos antes de aceptar otra monedaSi está libre, o cuántos ciclos de espera quedan (0, 1 o 2)4: Libre, Listo, Espera 1, Espera 22

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

Diagrama de estados interactivo Dos círculos, Bloqueado y Libre. El estado actual se rellena en amarillo verdoso. El estado al que pasaría en el próximo flanco se rodea con un círculo punteado. BloqueadoQ = 0LibreQ = 1M · ¬PP¬M + P¬PY = 0Y = 1
Estado actualBloqueado
Bit de estado Q0
Próximo estado, si hay flancoBloqueado
Salida Y: cerrojoCerrado
Combinaciones (Q, M, P) probadas0 / 8
Regla del último flanco—

Estado inicial: Bloqueado, Q = 0. Todavía no se generaron flancos.

Últimos 10 flancos. Los cambios de casillas no agregan filas.
FlancoMPQ antesQ despuésCerrojo
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

  1. 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.
  2. Con M todavía activa, generá otro flanco. Sigue Libre: la segunda moneda sobra, el torniquete no acumula créditos.
  3. Desactivá M y activá P. Generá el flanco: vuelve a Bloqueado. Pasó una persona.
  4. Con P activa y Bloqueado, generá otro flanco. Empujar sin pagar no cambia nada.
  5. 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.
  6. 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

  1. Escribí las entradas, las salidas y el reloj. Indicá qué significa cada valor y cuándo se muestrean las entradas.
  2. 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.
  3. Preguntá en cada punto: ¿qué necesito recordar para decidir lo que viene? Si dos situaciones tienen el mismo futuro posible, son el mismo estado.
  4. Nombrá y numerá los estados. El nombre debe describir la información que resumen («Libre», «Espera 1»), no el camino que llevó hasta ahí.
  5. Completá la tabla de transición. Cada estado necesita una respuesta para todas las combinaciones de entradas, incluidas las simultáneas o imposibles.
  6. Definí las salidas y el estado inicial. Decidí si dependen solo del estado y qué mecanismo lleva al circuito al arranque.
  7. Calculá los bits y revisá los sobrantes. Con N estados, ⌈log₂ N⌉ bits; decidí qué ocurre con las combinaciones sin usar.
  8. 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.