Altifigence Academy

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.

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.

Sk+1=F(Sk,Xk)S_{k+1}=F(S_k,X_k)

Considere un controlador de inicio y finalización: IDLE espera, BUSY procesa y DONE indica finalización durante un ciclo.

Estado actualCondiciónEstado siguientebusydone
IDLEstart=0IDLE00
IDLEstart=1BUSY00
BUSYwork_done=0BUSY10
BUSYwork_done=1DONE10
DONESiempreIDLE01

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.

Las salidas Moore siguen el estado actual
Ver los datos de la forma de onda
Datos de la forma de onda: cada carácter es un intervalo; un punto conserva el estado anterior; p representa un ciclo de reloj.
SeñalForma de ondaValores del bus
flanco2345E0 → E1 → E2 → E3
start10.1
work_done0.10
estado después2.34BUSY → DONE → IDLE
busy después1.0.
done después0.10

RTL que separa transición y almacenamiento

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

Tu elección se aplica a este navegador. Puedes cambiarla en el pie de página.