Nella logica sequenziale abbiamo detto che l’uscita dipende sia dai valori correnti che dai valori precedenti , ma la differenza principale sta tra sincrone e asincrone.

  • Sincrone : tutti gli aggiornamenti sono sincronizzati da un clock ( consideriamo solo questo ora )
  • Asincrone : gli stati cambiano non appena gli ingressi cambiano ( come il latch-D )

Quelle sincrone possono essere rappresentate in questo modo :

queste forme si chiamano macchine a stati finiti o FSM. Si chiamano cosi’ perché effettivamente una macchina con registri può trovarsi in di stati diversi. Inoltre una FSM ha input , output e bit di stato. Inoltre riceve un segnale di clock e a volte anche un segnale di reset. Una FSM è composta da un blocco di logica dello stato prossimo , uno per la logica di uscita e da un registro che “memorizza” lo stato. Ad ogni fronte di salita di clock la FSM avanza allo stato prossimo definito in base agli input e allo stato corrente.

Supponiamo per esempio di avere questo circuito :

che contiene la seguente roba :

  • un registro formato da 2 FlipFlop che hanno degli stati futuri ( ) e gli stati attuali ( )
  • porte logiche elementari
  • input
  • output

Ora , siccome sappiamo che sono lo stato attuale del circuito , quindi appena passiamo in questo attuale stato , sappiamo per certo gli stati futuri (siccome a loro due entrano una parte di ) , che l’output . Quindi siccome sono le variabili indipendenti e sono le variabili dipendenti , possiamo rappresentare il circuito attraverso un’equazione di stato :

a sua volta ( siccome sta roba nell’equazione di stato sono formule della logica proposizionale ) possiamo ottenere la tabella di stato :

Possiamo ancora rappresentare il circuito , attraverso il diagramma di stato , ovvero un grafo diretto dove :

  • nodi : rappresentano i vari stati del circuito ( indicati con con , ovvero tutti i possibili stati che può assumere il circuito )
  • archi : transizioni da uno stato all’altro
  • etichette degli archi : input che determinano le transazioni e output attuali del circuito ( formato : )

Quindi nel nostro circuito il diagramma di stato ha come stati :

e quindi possiamo iniziare a disegnare il diagramma di stato secondo la tabella di stato , infatti all’inizio ( start ) il circuito partirà da e quindi avremo due “casi di input” :

  • se il circuito passerà ad uno stato ovvero e da in output
  • se il circuito passerà ad uno stato ovvero ( se stesso ) e da in output e quindi otteniamo :

Andando avanti così fino a otteniamo :

Ma a cosa serve tutto questo? Beh serve quando vogliamo costruire un circuito che faccia della roba , e quindi possiamo partire dal diagramma di stato e andando a ritroso di come abbiamo fatto adesso , otteniamo si un circuito diverso da un’altro che fa la stessa cosa , ma farà la stessa cosa anche lui.

Supponiamo per esempio di voler progettare un circuito che ad ogni ciclo di clock , gli venga passato un input e restituisca se e solo se gli ultimi 3 bit letti formano la sequenza .

Per esempio supponiamo che per i primi cicli di clock , venga passata questa sequenza in input e con il rispettivo output :

Beh costruire questo circuito direttamente con porte logiche elementare , FlipFlop etc.. sarebbe un’impresa , però possiamo fare cosi : diagramma di stato tabella di stato equazioni di stato circuito.

Vediamo allora come fare il diagramma di stato. Sicuramente il nostro circuito partirà da uno stato :

Poi dallo stato l’input può essere o :

  • se beh questo è il primo bit che leggiamo quindi la nostra sequenza ( che chiamerò ) sarà , quindi è come se stiamo ancora “fermi” e non cambiamo stato , quindi lo stato non cambia e torna su se stesso e come output ritorniamo .
  • beh ora cambia la situazione , infatti se vuol dire che abbiamo iniziato a leggere ( “costruire” ) la nostra sequenza voluta , quindi cambiamo stato in e come output ritorniamo .

Ora stiamo in e quindi vuol dire che la nostra , e abbiamo sempre due casi di :

  • se ottimo la nostra diventa e quindi dobbiamo cambiare stato , siccome stiamo costruendo la nostra sequenza voluta.
  • se non va bene perché la nostra diventa , quindi in che stato andiamo? beh se ci ragioniamo potrebbe essere un candidato di una nuova costruzione che porterebbe alla nostra sequenza voluta , quindi rimaniamo in questo stato e la nostra rimane quindi . ( in tutti e due i casi siccome ancora non abbiamo ottenuto la nostra sequenza voluta )

Ora stiamo in e quindi la nostra , anche qui i due casi :

  • se non va bene , la nostra diventa e quindi dobbiamo necessariamente tornare al punto di partenza perché abbiamo distrutto la nostra sequenza voluta e torniamo output .
  • se ottimo , otteniamo la nostra sequenza voluta ( ) e quindi dobbiamo restituire in output e torniamo nello stato , siccome questo nuovo potrebbe aiutarci ancora .

Ora abbiamo finito , e iniziamo a fare la tabella di stato. Siccome abbiamo 3 stati , avremo necessariamente bisogno di un registro a 2 bit siccome sappiamo che a 2 bit potrà avere stati , questo implica che dovremmo usare 2 FlipFlop . Ora se codifichiamo ( scelta arbitraria , come vedremo dopo ) i nostri stati in questo modo :

e indichiamo gli stati attuali con e futuri con dei due FlipFlop , otteniamo la seguente tabella# di stato :

Siccome la nostra FSM non andrà mai nello stato ( che neanche esiste infatti ) , non è rilevante cosa assegniamo a e in corrispondenza di quelle righe ( infatti ho messo una ).

Ora è tutto in discesa , perché sappiamo ricavare da una tabella di verità una formula grazie alle mappe di Karnaugh :

  • per : quindi da ( siccome possiamo manipolarla come ci pare ) ( non ha senso prendere anche siccome dobbiamo raggruppare con degli già presenti ) , quindi otteniamo che :
  • per si nota già dalla tabella di stato che sarebbe :
  • per : e quindi otteniamo con : Ora non ci resta che fare il circuito che sarebbe , secondo le equazioni di stato :

Circuiti alla Moore e alla Mealy

Le macchine a stati finiti si distinguono i due diverse tipologie :

  • macchine alla Moore : dove gli output dipendono solo dallo stato presente del circuito
  • macchine alla Mealy : dove gli output dipendono dallo stato presente del circuito e anche dagli input attuali ( nei casi di prima la variabile ).

le macchine a stati finiti infatti possiamo rappresentarle in questo modo :

dove la linea gialla indica che si sta parlando di una macchina alla Mealy e senza sarebbe alla Moore ( dove infatti l’output dipende solo dallo stato dei registri ) , infatti fino ad ora abbiamo visto macchine alla Mealy . La differenza quindi sostanziale che c’è tra i due è che nella macchine alla Moore , i singoli stati il loro output dipende solo dallo stato attuale e non dall’input , quindi l’output nel cerchietto è già determinato dallo stato. Notiamo quindi che si abbiamo due casi nei singoli stati , ma nei singoli stati l’output è già deciso dallo stato attuale , quindi ci serviranno più stati.

Per esempio supponiamo di voler progettare la macchina a stati finita che legge una sequenza infinita di bit in input e ritorna se e solo se gli ultimi 3 bit formano la sequenza , però sta volta facciamola alla Moore. Partiamo quindi dal diagramma di stato :

notiamo infatti che abbiamo utilizzato uno stato in più della macchina alla Mealy , gli stati si trovano nel formato dove è proprio l’output già determinato dallo stato attuale. Ora facciamo la tabella di stato , siccome è determinato solo dagli stati attuali , ci servono solo loro per avere :

quindi notiamo subito che l’equazione di stato di è . Ora ci serve la tabella di stato di per ottenere questi ci servono :

quindi per si nota subito che la sua equazione sarebbe , mentre per bisogna fare la mappa di Karnaugh , da cui otteniamo che . Quindi ora risulta facile costruire il circuito secondo le equazioni di stato appena ottenute.