Altifigence Academy

28 / 37 · Concept

Machines à états : séparer état, transition et sortie

Construire une FSM depuis sa table et comparer Moore/Mealy, états illégaux et politique de requêtes.

L'état résume seulement le passé nécessaire

Quand les entrées actuelles ne suffisent pas, définissez un état mémorisé. Au lieu de conserver tout l'historique, distinguez seulement ce qui peut changer le comportement futur.

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

Considérons un contrôleur de lancement et d'achèvement : IDLE attend, BUSY traite, DONE signale la fin pendant un cycle.

État actuelConditionÉtat suivantbusydone
IDLEstart=0IDLE00
IDLEstart=1BUSY00
BUSYwork_done=0BUSY10
BUSYwork_done=1DONE10
DONEToujoursIDLE01

busy et done sont des sorties de l'état actuel. Après le front qui accepte l'achèvement en BUSY, l'état devient DONE et done=1 : c'est une sortie de Moore.

Chaque colonne observe un front montantFront montant Instant où l'horloge passe de 0 à 1, distinct du niveau désignant tout l'intervalle CLK=1. En savoir plus, entrées avant et états after après ; l'alignement n'est pas un retard physiqueRetard de propagation Temps nécessaire après un changement d'entrée pour que la sortie se stabilise à sa valeur correcte. Équivalence logique et caractéristiques temporelles sont distinctes. En savoir plus. À partir d'IDLE, accepter work_done mène à DONE et done=1 après le front. Après DONE, on revient à IDLE indépendamment de start.

La sortie de Moore suit l'état courant
Voir les données du chronogramme
Données du chronogramme : chaque caractère représente un intervalle ; un point maintient l'état précédent ; p représente un cycle d'horloge.
SignalForme d'ondeValeurs du bus
edge2345E0 → E1 → E2 → E3
start10.1
work_done0.10
état après2.34BUSY → DONE → IDLE
busy après1.0.
done après0.10

RTL séparant transition et stockage

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

Cet exemple SystemVerilog explique la structure de contrôle. La génération de work_done par le processeur associé et la synchronisation des entrées restent à réaliser séparément.

Questions facilement oubliées

Ce circuit ignore start en BUSY et DONE. Pour accepter une nouvelle demande à l'achèvement, modifiez d'abord la table. Une sortie de Mealy utilise état et entrées actuelles pour réagir vite, mais exige d'étudier timing et glitches du chemin combinatoire. Encodage binaire/one-hotOne-hot Représentation où exactement un bit vaut 1. Si le motif tout à zéro est aussi autorisé, on parle de one-hot-or-zero. En savoir plus et classification Moore/Mealy sont deux décisions distinctes.

Essayez vous-même

start=1 dure un cycle pendant DONE. La FSM démarre-t-elle immédiatement un nouveau travail ? Que modifier pour enchaîner les travaux ?

Lire l’explication

Non : DONE→IDLE ignore cette demande. Ajoutez une transition DONE→BUSY si start, ou un protocole mémorisant la requête. Vérifiez alors durée de done et instant d'acceptation selon le nouveau contrat.

Votre choix s’applique à ce navigateur. Modifiez-le à tout moment en bas de page.