Problèmes de machines à états finis synchrones

Transcription

Problèmes de machines à états finis synchrones
Problèmes de machines à états finis synchrones
N.B. Si vous trouvez des erreurs (logiques, pas grammatiques, je sais qu'il-y-a plein de
ces derniers !) dans cette solutionnaire, contactez [email protected]. Merci !
Synthèse : Détecteur de séquence
Concevez une machine capable de détecter la séquence 0-1-1-0 sur son unique entrée (x).
Quand la séquence se produit, il devrait émettre un 1 sur son unique sortie (y). Une
diagramme temporelle du comportement attendu est donné. Notez que dans la séquence
0-1-1-0-1-1-0, la séquence se produit deux fois ! Utilisez une machine de Moore.
x
x
y
CLK
y
CLK
N'oubliez pas de commencer par une diagramme d'états, d'essayer de minimiser le
nombre d'états et de choisir les bascules qui minimisent le coût (D, T ou JK).
Diagramme d'états :
Rien
1
0
0
«0»
1
0
«01»
1
«011»
0
0
1
«0110»
1
Table d'états suivants :
État courant
État suivant quand x =
Sortie
0
1
Rien
«0»
Rien
0
«0»
«0»
«01»
0
«01»
«0»
«011»
0
«011»
«0110»
Rien
0
«0110»
«0»
«01»
1
Est-ce-qu'on peut fusionner des états ? Non, parce-que parmi les états qui ont la même
sortie, aucuns n'ont les mêmes états suivants.
Table d'états :
État courant État suivant (Y) quand x =
Sortie
y2y1y0
0
1
000 (Rien)
001
000
0
001 («0»)
001
011
0
011 («01»)
001
010
0
010 («011»)
110
000
0
110 («0110»)
001
011
1
Il-y-a cinq états, alors on a besoin de trois bascules. Trois bascules nous donnent trois
bits d'état – c'est à dire 23 = 8 états possibles. Avec deux bascules on n'aura que 22 = 4
états possibles, ce qui sera insuffisant.
C'est possible d'assigner des codes aux états d'une autre façon. Ici on a choisi 000 comme
l'état de défaut par convention. On a essayé de faire que les codes des états suivants sont
adjacents. Et finalement, on a fait que «0110» a une code distincte (c'est la seule où y2 =
1) pour faciliter la logique de sortie.
Simplification des états suivants :
On remarque que Y2 n'est 1 que dans une seule condition (avec aucun cas facultatif
adjacent). Alors on peut le simplifier directement : Y2 = !y2y1!y0!x (pour bascule D)
Pour les autres, on utilise des tables de Karnaugh :
10
0
y2y1\y0x
00
Y1 (D)
00
01
11
0
0
1
00
00
0
01
1
0
1
0
01
0
1
0
1
11
0
1
-
-
11
1
0
-
-
10
-
-
-
-
10
-
-
-
-
00
00
0
Y1 (J)
01
0
11
1
10
0
01
-
-
-
-
11
-
-
-
-
11
1
0
-
-
10
-
-
-
-
10
-
-
-
-
y2y1\y0x
y2y1\y0x
Y1 (T)
01
11
0
1
Y1 (K)
y2y1\y0x 00
01
11
00
0
1
0
01
10
0
10
1
C'est moins cher d'utiliser une bascule JK et d'encercler les 1 dans les deux cas. Si vous
n'êtes pas convaincu de ce fait, il faudrait simplifier chaque table de Karnaugh de forme
disjonctive et conjonctive et comparer les coûts !
Alors, Y1J = y0x et Y1K = y2 y0 x (un ou-exclusif de ces trois)
y2y1\y0x
Y0 (D)
01
11
0
1
10
1
y2y1\y0x
00
00
1
Y0 (T)
01
11
0
0
00
00
1
01
0
0
0
1
01
0
0
1
0
11
1
1
-
-
11
1
1
-
-
10
-
-
-
-
10
-
-
-
-
11
-
10
-
y2y1\y0x
00
00
1
Y0 (J)
01
0
01
0
0
-
-
01
-
-
1
0
11
1
1
-
-
11
-
-
-
-
10
-
-
-
-
10
-
-
-
-
y2y1\y0x
00
Y0 (K)
00
01
11
0
10
0
10
0
Encore, c'est moins cher d'utiliser une bascule JK et d'encercler les 1 dans les deux cas.
Si vous n'êtes pas convaincu de ce fait, il faudrait simplifier chaque table de Karnaugh de
forme disjonctive et conjonctive et comparer les coûts !
Alors, Y1J = y2 + !y1!x et Y1K = y1x
Simplification de la sortie :
Selon notre choix de variables d'état, la sortie est simple. La sortie est 1 quand y2 = 1.
Circuit final :
À venir quand c'est confirmé que Jeff n'a fait aucune erreur jusqu'à ce point. :-)
Synthèse : Machine de Poly-Cola
Concevez une machine qui vend du Poly-Cola. Une bouteille de Poly-Cola coute 1$. La
machine accepte des 25¢ et des 1$. Dès que la machine obtient exactement 1$, ça lâche
une bouteille. Si plus que 1$ est inséré dans la machine (par un usager con), la machine
devrait simplement lâcher cet argent et retourner à son état initial.
Il-y-a deux entrées : 25¢ et 1$. Ces entrées pulsent à 1 pendant une seule cycle d'horloge
pour indiquer quand le sous correspondant est reçu.
Il-y-a deux sorties : lâche une bouteille et lâche l'argent. Il suffit d'envoyer une pulse de
1 pendant une seule cycle d'horloget pour assurer qu'une bouteille ou l'argent est lâché.
25¢
1$
CLK
Bouteille
POLY
Argent
Concevez la machine en premier comme machine de Moore, et de suite comme machine
de Mealy. Laquelle est plus simple et moins coûteuse ?
N'oubliez pas de commencer par une diagramme d'états, d'essayer de minimiser le
nombre d'états et de choisir les bascules qui minimisent le coût (D, T ou JK).
Diagrammes d'états :
MOORE
0¢
00
00
00
00
MEALY
10
25¢
10
50¢
10
0¢
00/00
01/10 10/00
01
01
01
XX
Retour
d'argent
01
75¢ 10
1$
00/00
XX
00/00
00/00
25¢ 01/01
10/00
50¢ 01/01
10/00
75¢ 01/01
10/10
Avec Moore, il-y-a six états (trois bascules), tandis-qu'avec Mealy il-y-a quatre états
(deux bascules). C'est à dire qu'avec Mealy on sauve une bascule.
Notez que dans la machine de Moore, on aurait pu ajouter des conditions où la machine
peut aller dans l'état 25¢/1$ après avoir été dans l'état 1$ ou Retour d'argent. Mais,
puisque c'est quasiment impossible que quelqu'un ajoute deux sous en deux cycles
d'horloge suivantes, on ignore cette possibilité. La machine devrait simplifier mieux par
conséquent.
Notez aussi que c'est impossible d'avoir 1$ et 25¢ ajoutés pendant la même cycle
d'horloge. Alors on peut ignorer le cas où QL (Quarter/Loonie) = 11.
Table d'états suivants (Moore) :
État courant
État suivant quand QL =
Sorties (BA)
00
01
10
11
0¢
0¢
$1.00
25¢
-
00
25¢
25¢
Ret
50¢
-
00
50¢
50¢
Ret
75¢
-
00
75¢
75¢
Ret
$1.00
-
00
$1.00
0¢
0¢
0¢
-
10
Retour
0¢
0¢
0¢
-
01
Il-n'y-a aucune paire d'états fusionnables.
Table d'états (Moore) :
État courant État suivant quand QL =
Sorties (BA)
y2y1y0
00
01
10
11
000 (0¢)
000
110
001
-
00
001 (25¢)
001
100
011
-
00
011 (50¢)
011
100
010
-
00
010 (75¢)
010
100
110
-
00
110 ($1.00)
000
000
000
-
10
100 (Retour)
000
000
000
-
01
C'est possible d'assigner des codes aux états d'une autre façon. Ici le chemin de 0¢ à $1
consiste de de transitions adjacents dans le but de simplifier la logique. Les états $1 et
Retour, qui sont les seuls à avoir une sortie, sont distincts puisqu'ils ont y2 = 1. Ceci
devrait simplifier les sorties.
Simplification des états suivants (Moore) :
y1y0\QL
00
Y2 (D) quand y2 = 0
00
01
11
0
1
-
10
0
y1y0\QL
00
Y2 (D) quand y2 = 1
00
01
11
0
0
-
10
0
01
0
1
-
0
01
-
-
-
-
11
0
1
-
0
11
-
-
-
-
10
0
1
-
1
10
0
0
-
0
10
0
y1y0\QL
y1y0\QL
00
Y2 (T) quand y2 = 0
00
01
11
0
1
-
00
Y2 (T) quand y2 = 1
00
01
11
1
1
-
10
1
01
0
1
-
0
01
-
-
-
-
11
0
1
-
0
11
-
-
-
-
10
0
1
-
1
10
1
1
-
1
10
0
y1y0\QL
y1y0\QL
00
Y2 (J) quand y2 = 0
00
01
11
0
1
-
00
Y2 (J) quand y2 = 1
00
01
11
-
10
-
01
0
1
-
0
01
-
-
-
-
11
0
1
-
0
11
-
-
-
-
10
0
1
-
1
10
-
-
-
-
10
-
y1y0\QL
y1y0\QL
00
Y2 (K) quand y2 = 0
00
01
11
-
00
Y2 (K) quand y2 = 1
00
01
11
1
1
-
10
1
01
-
-
-
-
01
-
-
-
-
11
-
-
-
-
11
-
-
-
-
10
-
-
-
-
10
1
1
-
1
Pour Y2, c'est le moins coûteux avec une bascule JK.
Y2J = L + y1!y0Q et Y2K = 1 (oui, on 'Kill' toujours !)
y1y0\QL
00
Y1 (D) quand y2 = 0
00
01
11
0
1
-
10
0
y1y0\QL
00
Y1 (D) quand y2 = 1
00
01
11
0
0
-
10
0
01
0
0
-
1
01
-
-
-
-
11
1
0
-
1
11
-
-
-
-
10
1
0
-
1
10
0
0
-
0
10
0
y1y0\QL
y1y0\QL
00
Y1 (T) quand y2 = 0
00
01
11
0
1
-
00
Y1 (T) quand y2 = 1
00
01
11
0
0
-
10
0
01
0
0
-
1
01
-
-
-
-
11
0
1
-
0
11
-
-
-
-
10
0
1
-
0
10
1
1
-
1
10
0
y1y0\QL
y1y0\QL
00
Y1 (J) quand y2 = 0
00
01
11
0
1
-
00
Y1 (J) quand y2 = 1
00
01
11
0
0
-
10
0
01
0
0
-
1
01
-
-
-
-
11
-
-
-
-
11
-
-
-
-
10
-
-
-
-
10
-
-
-
-
10
-
y1y0\QL
y1y0\QL
00
Y1 (K) quand y2 = 0
00
01
11
-
00
Y1 (K) quand y2 = 1
00
01
11
-
10
-
01
-
-
-
-
01
-
-
-
-
11
0
1
-
0
11
-
-
-
-
10
0
1
-
0
10
1
1
-
1
Pour Y1, c'est le moins coûteux avec une bascule JK.
Y1J = y0Q + !y2!y0L et Y1K = y2 + L
y1y0\QL
00
Y0 (D) quand y2 = 0
00
01
11
0
0
-
10
1
y1y0\QL
00
Y0 (D) quand y2 = 1
00
01
11
0
0
-
10
0
01
1
0
-
1
01
-
-
-
-
11
1
0
-
0
11
-
-
-
-
10
0
0
-
0
10
0
0
-
0
10
1
y1y0\QL
y1y0\QL
00
Y0 (T) quand y2 = 0
00
01
11
0
0
-
00
Y0 (T) quand y2 = 1
00
01
11
0
0
-
10
0
01
1
0
-
1
01
-
-
-
-
11
0
1
-
1
11
-
-
-
-
10
1
1
-
1
10
1
1
-
1
10
1
y1y0\QL
y1y0\QL
00
Y0 (J) quand y2 = 0
00
01
11
0
0
-
00
Y0 (J) quand y2 = 1
00
01
11
0
0
-
10
0
01
1
0
-
1
01
-
-
-
-
11
-
-
-
-
11
-
-
-
-
10
-
-
-
-
10
-
-
-
-
10
-
y1y0\QL
y1y0\QL
00
Y0 (K) quand y2 = 0
00
01
11
-
00
Y0 (K) quand y2 = 1
00
01
11
-
10
-
01
-
-
-
-
01
-
-
-
-
11
0
1
-
1
11
-
-
-
-
10
1
1
-
1
10
1
1
-
1
Pour Y0, c'est le moins coûteux avec une bascule D.
Y0 = y0!Q!L + !y2y1Q
Simplification des sorties (Moore) :
Heureusement on peut simplifier les sorties directement de la table d'états puisque pour
chacune, il-y-a juste un cas ou c'est 1. Alors, B = y2y1 et A = y2!y1
Circuit final :
À venir quand c'est confirmé que Jeff n'a fait aucune erreur jusqu'à ce point. :-)
Maintenant, il faut l'implémenter comme machine de Mealy pour qu'on puisse comparer
les deux solutions selon leur cout...
Table d'états suivants (Mealy) :
État suivant quand QL =
Sorties (BA) quand QL =
00
01
10
11
00
01
10
11
0¢
0¢
0¢
25¢
-
00
10
00
-
25¢
25¢
0¢
50¢
-
00
01
00
-
50¢
50¢
0¢
75¢
-
00
01
00
-
75¢
75¢
0¢
0¢
-
00
01
10
-
État
courant
Il-n'y-a aucune paire d'états fusionnables.
Table d'états (Mealy) :
État courant État suivant quand QL = Sorties (BA) quand QL =
y1y0
00
01
10
11
00
01
10
11
00 (0¢)
00
00
01
-
00
10
00
-
01 (25¢)
01
00
11
-
00
01
00
-
11 (50¢)
11
00
10
-
00
01
00
-
10 (75¢)
10
00
00
-
00
01
10
-
C'est possible d'assigner des codes aux états d'une autre façon. Ici le chemin de 0¢ à 75¢
et de retour à 0¢ consiste de de transitions adjacents dans le but de simplifier la logique.
Simplification des états suivants (Mealy) :
y1y0\QL
Y1 (D)
01
11
0
-
10
0
y1y0\QL
00
00
0
Y1 (T)
01
11
0
-
00
00
0
01
0
0
-
1
01
0
0
-
1
11
1
0
-
1
11
0
1
-
0
10
1
0
-
0
10
0
1
-
1
y1y0\QL
Y1 (J)
01
0
11
-
10
0
y1y0\QL
00
00
0
00
00
-
01
0
0
-
1
01
-
-
-
-
11
-
-
-
-
11
0
1
-
0
10
-
-
-
-
10
0
1
-
1
Y1 (K)
01
11
-
10
0
10
-
C'est le moins cher avec une bascule JK (JK = 12, D = 13).
Y1J = y0Q et Y1K = L + !y0Q
y1y0\QL
Y0 (D)
01
11
0
-
10
1
y1y0\QL
00
00
0
Y0 (T)
01
11
0
-
00
00
0
01
1
0
-
1
01
0
1
-
0
11
1
0
-
0
11
0
1
-
1
10
0
0
-
0
10
0
0
-
0
11
-
10
1
y1y0\QL
00
00
0
Y0 (J)
01
0
01
-
-
-
11
-
-
10
0
0
y1y0\QL
10
1
00
Y0 (K)
00
01
11
-
10
-
-
01
0
1
-
0
-
-
11
0
1
-
1
-
0
10
-
-
-
-
Encore, c'est le moins cher avec une bascule JK (JK = 12, D = 13).
Y0J = !y1Q et Y0K = L + y1Q
Simplification des sorties (Mealy) :
B
01
1
11
-
10
0
y1y0\QL
00
00
0
01
0
0
-
11
0
0
10
0
0
y1y0\QL
00
00
0
A
01
0
11
-
10
0
0
01
0
1
-
0
-
0
11
0
1
-
0
-
1
10
0
1
-
0
B = !y1!y0L + y1!y0Q et A = !L · (y1 + y0)
Circuit final :
À venir quand c'est confirmé que Jeff n'a fait aucune erreur jusqu'à ce point. :-)
Comparaison :
La machine de Moore a un coût logique (Y2 + Y1 + Y0 + A + B) de (9 + 17 + 14 + 4 + 4)
= 48
La machine de Mealy a un coût logique (Y1 + Y0 + A + B) de (12 + 12 + 8 + 14) = 46
Étant donné que la machine de Mealy requiert une bascule de moins que celle de Moore,
et son coût est inférieur, on peut conclure que la machine de Mealy est moins chère.
Analyse : Détecteur de séquence
Le circuit suivant est un détecteur de séquence. En suivant les étapes de l'analyse,
déterminez quelle séquence ce circuit détecte.
x
Y1
y1
CLK
Y0
y0
y
CLK
Dès que vous obtenez la diagramme d'états, c'est facile de déterminer cette séquence.
Astuce : l'état initial est y1y0 = 00. Dans cet état, aucune partie de la séquence n'a été
détectée.
Table d'états :
Si ce n'est pas évident comment passer directement du circuit à cette table, trouvez en
premier les équations pour Y1 et Y0 puis déterminez leur sorties selon toutes les
combinaisons d'entrées possibles (comme dans la colonne à gauche dans la table.
État courant État suivant (Y1Y0) quand x =
Sortie
y1y0
0
1
00
00
01
0
01
11
01
0
10
11
01
1
11
00
10
0
Table d'états suivants :
Maintenant, on sait que l'état 00 est l'état initial, alors on le nomme «Rien». On peut
facilement nommer les autres états. Comment ? On leur accorde comme nom la
séquence qu'on a eu à date sur l'entrée :
État courant
État suivant quand x =
Sortie
0
1
Rien (00)
00
01
0
«1» (01)
11
01
0
«101» (10)
11
01
1
«10» (11)
00
10
0
On n'a même pas besoin de dessiner une diagramme d'états. On voit que dès qu'on
obtient la séquence 1-0-1, la sortie devient 1. Quand même, voici la diagramme d'états
pour mieux comprendre comment fonctionne ce circuit :
Rien
0
1
«1»
0
0
«10»
1
«101» 1
0
Ce circuit est donc un détecteur de la séquence 1-0-1.
1

Documents pareils