Una máquina de estados finitos es un modelo que describe un sistema mediante estados y transiciones provocadas por sus entradas.
Hemos visto piezas sueltas, puertas lógicas que toman decisiones instantáneas y Flip-Flops que recuerdan datos. Hemos hecho contadores que avanzan linealmente (1, 2, 3…).
Pero, ¿cómo hacemos un sistema que piense? ¿Cómo diseñamos un controlador para un ascensor, una máquina de vending o un protocolo de comunicación? No es una secuencia lineal; depende de lo que haga el usuario.
Para esto necesitamos el concepto más potente del diseño digital: la Máquina de Estados Finitos o FSM (Finite State Machine).
Hoy vamos a ver la teoría necesaria para modelar controladores digitales antes de traducirlos a hardware.
¿Qué es una FSM?
Una FSM es un modelo matemático de computación. Suena complejo, pero es muy intuitivo. Se basa en la idea de que un sistema solo puede estar en uno de una serie de modos o “estados” predefinidos en un momento dado.
Imagina un Torno de entrada de metro:
- Estado Inicial: Bloqueado (Locked).
- Evento: Echas una moneda.
- Transición: El torno pasa al estado Desbloqueado (Unlocked).
- Evento: Empujas la barrera.
- Transición: El torno vuelve al estado Bloqueado.
Si empujas mientras está bloqueado, no pasa nada (se queda en el mismo estado).
Componentes de una FSM
Para definir cualquier máquina, necesitamos identificar:
- Estados: Las “situaciones” en las que puede estar el sistema (Ej: Idle, Leyendo, Escribiendo, Error). Físicamente, esto se guarda en un registro.
- Entradas: Las señales externas que provocan cambios (Ej: Botón pulsado, Sensor activado, Timer acabado).
- Transiciones: La lógica que decide: “Si estoy en el Estado A y recibo la Entrada X, me muevo al Estado B”.
- Salidas: Lo que el sistema hace en cada momento (Ej: Encender motor, apagar LED).
Representación visual: el diagrama de estados
Antes de escribir una sola línea de Verilog, conviene dibujar el comportamiento. Usamos círculos para los estados y flechas para las transiciones. Cada flecha lleva escrita la condición que la activa.
Este diagrama es el mapa que luego traduciremos directamente a código case.
Moore y Mealy
A la hora de diseñar cómo se comportan las salidas de nuestra máquina, existen dos arquitecturas clásicas. Entender la diferencia es importante porque afecta a la velocidad y estabilidad de tu FPGA.
Máquina de Moore
En una Máquina de Moore, las salidas dependen únicamente del Estado Actual.
- No importa qué esté pasando en las entradas ahora mismo; si la máquina está en el estado “ALARMA”, la sirena suena.
- Comportamiento: La lógica de salida solo depende del estado. Si ese estado está registrado, los cambios se producen después de un flanco de reloj.
- Ventajas: Es fácil de razonar y reduce la dependencia directa de entradas asíncronas. Si necesitas salidas sin glitches, también puedes registrarlas.
- Desventajas: Reacciona con un ciclo de reloj de retraso respecto a la entrada.
Máquina de Mealy
En una Máquina de Mealy, las salidas dependen del Estado Actual Y de las Entradas.
- Imagina que estás en el estado “ESPERA”. En Moore, la salida sería 0. En Mealy, puedes decir: “Estoy en ESPERA, pero mientras pulses el botón, la salida es 1”.
- Comportamiento: La salida puede cambiar en mitad de un ciclo de reloj si cambia la entrada.
- Ventajas: Reacción inmediata (en el mismo ciclo). Suele requerir menos estados.
- Desventajas: Una entrada ruidosa o una ruta combinacional mal temporizada puede reflejarse en la salida. Requiere más atención al sincronismo y a los glitches.
Comparación entre Moore y Mealy
| Característica | Moore | Mealy |
|---|---|---|
| Dependencia de Salida | Solo Estado | Estado + Entradas |
| Cambio de Salida | En el flanco de reloj | Inmediato (Asíncrono) |
| Glitches | Menos dependencia de entradas; no imposibles | Mayor riesgo en salidas combinacionales |
| Velocidad de Reacción | Lenta (+1 ciclo) | Rápida (Combinacional) |
| Complejidad | Suele requerir más estados | Suele requerir menos estados |
Si estás empezando, Moore suele ser más fácil de depurar.
Mealy sigue siendo una opción correcta cuando necesitas una respuesta combinacional inmediata y controlas bien las entradas y el timing.
Codificación de estados
Físicamente, los estados se guardan en Flip-Flops. Pero, ¿cómo guardamos “IDLE” o “RUN” en bits? Tenemos que asignar un código binario a cada estado.
Existen varias estrategias, pero en FPGA destacan dos:
- Estado 0:
00 - Estado 1:
01 - Estado 2:
10
Usa pocos Flip-Flops, pero más lógica combinacional para decodificar.
- Estado 0:
0001 - Estado 1:
0010 - Estado 2:
0100 - Estado 3:
1000
Usa más flip-flops y puede simplificar la decodificación. El resultado de área, frecuencia y consumo depende del dispositivo y de la máquina concreta.
Generalmente, dejaremos que el sintetizador elija la codificación. Si el timing o el área son críticos, compararemos los resultados de síntesis antes de forzar una estrategia.