28 / 37 · Concepto
Máquinas de estados: separe estado, transición y salida
Construya una FSM desde su tabla y compare Moore, Mealy, estados ilegales y política de peticiones.
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
El estado resume solo el pasado necesario
Si la salida no depende únicamente de las entradas actuales, defina qué estado almacenar. En vez de guardar toda la historia, distinga solo la información necesaria para decidir el futuro.
Considere un controlador de inicio y finalización: IDLE espera, BUSY procesa y DONE indica finalización durante un ciclo.
| Estado actual | Condición | Estado siguiente | busy | done |
|---|---|---|---|---|
| IDLE | start=0 | IDLE | 0 | 0 |
| IDLE | start=1 | BUSY | 0 | 0 |
| BUSY | work_done=0 | BUSY | 1 | 0 |
| BUSY | work_done=1 | DONE | 1 | 0 |
| DONE | Siempre | IDLE | 0 | 1 |
busy y done son salidas del estado actual. Al observar finalización en BUSY, el flanco cambia a DONE y entonces done=1. Son salidas Moore.
Cada columna registra un flanco ascendenteFlanco ascendente Instante en que el reloj pasa de 0 a 1. Se distingue del nivel alto, que abarca todo el intervalo con CLK=1. Más información, entradas previas y estados «después» posteriores; la alineación no representa propagación físicaRetardo de propagación Tiempo desde un cambio de entrada hasta que la salida se estabiliza en el valor correcto. La equivalencia lógica y el comportamiento temporal son propiedades distintas. Más información. Se parte de IDLE. Al aceptar work_done se pasa a DONE con done=1. Desde DONE se vuelve a IDLE independientemente de start.
Ver los datos de la forma de onda
| Señal | Forma de onda | Valores del bus |
|---|---|---|
| flanco | 2345 | E0 → E1 → E2 → E3 |
| start | 10.1 | |
| work_done | 0.10 | |
| estado después | 2.34 | BUSY → DONE → IDLE |
| busy después | 1.0. | |
| done después | 0.10 |
RTL que separa transición y almacenamiento
typedef enum logic [1:0] {IDLE, BUSY, DONE} state_t;
state_t state, next_state;
always_comb begin
next_state = state;
case (state)
IDLE: if (start) next_state = BUSY;
BUSY: if (work_done) next_state = DONE;
DONE: next_state = IDLE;
default: next_state = IDLE;
endcase
end
always_ff @(posedge clk)
if (rst) state <= IDLE;
else state <= next_state;
assign busy = (state == BUSY);
assign done = (state == DONE);Este ejemplo SystemVerilog explica la estructura de control. La generación de work_done por el procesador conectado y la sincronización de entradas se implementan aparte.
Preguntas que suelen faltar en la especificación
El circuito ignora start en BUSY y DONE. Para aceptar una petición al finalizar, cambie primero la tabla. Una salida Mealy usa estado y entrada actual y puede responder antes, pero requiere revisar temporización y pulsos espurios combinacionales. Elegir codificación binaria o one-hotOne-hot Representación en la que exactamente un bit vale 1. Si también se permite que todos sean 0, la condición se denomina one-hot-or-zero. Más información y elegir Moore o Mealy son decisiones distintas.
Inténtalo tú
En DONE, start=1 durante un ciclo. ¿Comienza esta FSM otro trabajo inmediatamente? ¿Qué debe cambiar para admitir trabajos consecutivos?
Leer la explicación
La tabla lleva DONE→IDLE y no acepta esa petición. Cambie la transición para ir a BUSY si start está activo en DONE, o diseñe un protocolo que conserve la petición. Verifique de nuevo la duración de done y el instante de aceptación.