Altifigence Academy

28 / 37 · Concetto

Macchine a stati: separare stato, transizioni e uscite

Costruire FSM da tabelle e confrontare Moore/Mealy, stati illegali e politica delle richieste.

Lo stato riassume solo il passato necessario

Quando l'ingresso attuale non determina da solo l'uscita, definiamo uno stato memorizzato. Non conserviamo tutta la storia, ma solo le differenze utili al comportamento futuro.

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

Consideriamo un controllore di lavoro: IDLE attende richieste, BUSY elabora, DONE segnala il completamento per un ciclo.

StatoCondizioneProssimo statobusydone
IDLEstart=0IDLE00
IDLEstart=1BUSY00
BUSYwork_done=0BUSY10
BUSYwork_done=1DONE10
DONESempreIDLE01

busy e done sono uscite dello stato corrente. Rilevando il completamento in BUSY, dopo il fronte si passa a DONE e done diventa 1. È un'uscita Moore.

Ogni colonna registra un fronte di salitaFronte di salita Passaggio del clock da 0 a 1, distinto dall’intero intervallo di livello CLK=1. Approfondisci. Gli ingressi sono quelli immediatamente precedenti; gli stati con „after“ quelli subito dopo l’aggiornamento. Le colonne indicano l’ordine dei campioni, non il ritardo fisico di propagazioneRitardo di propagazione Tempo dalla variazione d’ingresso all’assestamento corretto dell’uscita. Equivalenza logica e proprietà temporali sono distinte. Approfondisci. Si parte da IDLE. Dopo l'accettazione di work_done si raggiunge DONE con done=1. Da DONE si torna a IDLE indipendentemente da start.

Le uscite di Moore seguono lo stato attuale
Mostra i dati della forma d’onda
Dati della forma d’onda: ogni carattere è un intervallo; il punto mantiene lo stato precedente; p è un ciclo di clock.
SegnaleForma d’ondaValori del bus
edge2345E0 → E1 → E2 → E3
start10.1
work_done0.10
state after2.34BUSY → DONE → IDLE
busy after1.0.
done after0.10

RTL che separa transizione e memoria

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

L'esempio SystemVerilog illustra la struttura di controllo. La generazione di work_done nell'elaboratore collegato e la sincronizzazione degli ingressi vanno implementate separatamente.

Domande facilmente dimenticate

Il circuito ignora start in BUSY e DONE. Per accettare una richiesta insieme al completamento bisogna prima modificare la tabella. Le uscite Mealy dipendono da stato e ingresso corrente e possono reagire rapidamente, ma richiedono analisi di timing e glitch. Codifica binaria o one-hotOne-hot Rappresentazione con esattamente un bit a 1. La condizione che ammette anche tutti 0 si chiama one-hot-or-zero. Approfondisci e classificazione Moore/Mealy sono decisioni indipendenti.

Prova tu

In DONE arriva start=1 per un ciclo. Parte subito un nuovo lavoro? Cosa cambiare per consentire lavori consecutivi?

Leggi la spiegazione

La tabella passa DONE→IDLE e non accetta la richiesta. Modificate DONE con start verso BUSY oppure progettate un protocollo che conservi le richieste. Verificate durata di done e istante d’accettazione secondo la nuova specifica.

La scelta vale per questo browser. Puoi modificarla in qualsiasi momento dal piè di pagina.