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.
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
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.
Consideriamo un controllore di lavoro: IDLE attende richieste, BUSY elabora, DONE segnala il completamento per un ciclo.
| Stato | Condizione | Prossimo stato | 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 | Sempre | IDLE | 0 | 1 |
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.
Mostra i dati della forma d’onda
| Segnale | Forma d’onda | Valori del bus |
|---|---|---|
| edge | 2345 | E0 → E1 → E2 → E3 |
| start | 10.1 | |
| work_done | 0.10 | |
| state after | 2.34 | BUSY → DONE → IDLE |
| busy after | 1.0. | |
| done after | 0.10 |
RTL che separa transizione e memoria
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.