VHDL Compléments Compl ments Machines d’états d tats Machines d’états Principe de fonctionnement LA machine d’état s’apparente à un automate ou un grafcet Le système est dans un état stable ( équivalent d’une étape pour le grafcet) Il peut évoluer vers un autre état du système en fonction des entrées ( réceptivité VRAIE) A chaque état correspond une/des sorties actives ( les actions associées aux étapes) La représentation graphique est un diagramme à bulle Ne pas oublier de faire un tableau à côté pour préciser les sorties en fonction de l’état Contraintes de fonctionnement Une machine d’état a besoin d’une horloge (quartz, astable en externe ou PLL embarquée) Une transition est activée lorsque L’étape source est active La réceptivité est vrai (équation logique sur les entrées Un front d’horloge survient 2 Machines d’états Les différentes types de Finite State Machine (FSM) Machine de Moore La sortie ne dépend que de l’état courant Le temps de réaction dépend donc de l’horloge Cette machine peut-être qualifiée de synchrone Machine de Mealy La sortie ne dépend de l’état courant mais aussi des entrées Le temps de réaction est plus rapide que Moore Cette machine peut-être qualifiée d’asynchrone Inconvénients: la durée minimum d’un état n’ait plus garanti => L’état peut-être interprété par un autre système comme un état parasite 3 Machines d’états Codage des états Création d’un type énuméré Le compilateur affecte automatiquement un entier à chaque état • • T YPE etat IS (debut, etat1, etat2); SIGNAL etat_present : etat; Codage à la main L’utilisateur affecte un entier « à la main » • Ex: début vaudra 0,état1 vaudra 1 et état 2 vaudra 2 SIGNAL etat_present : integer range 0 to 2; OU SIGNAL etat_present : std_logic_vector(1 down to 0); Gestion des transitions DANS UN PROCESS (car séquentiel) Instructions CAS/IS bien adaptée 4 Machines d’états Exemple de codage à la main Cahier des charges la sortie S recopie l’état logique présent sur son entrée E si celle-ci est restée stable après 2 coups d’horloge successifs. La sortie est resynchronisée car incluse dans le process library ieee ; use ieee.std_logic_1164.ALL; entity MAE is port ( E,RST,HOR : in STD_LOGIC ; S : out STD_LOGIC ); end MAE; architecture COMPORTEMENT of MAE is signal REG_ETAT : STD_LOGIC_VECTOR(2 downto 0); process (HOR,RST) begin if RST='0' then REG_ETAT <= "000"; elsif (HOR’event and HOR='1') then case REG_ETAT is when "000" => S <= '0' ; if E = '1' then REG_ETAT <= "001"; else REG_ETAT <= "000"; end if ; when "001" => S <= '0' ; if E = '1' then REG_ETAT <= "010"; else REG_ETAT <= "000"; end if ; when "010" => S <= '0' ; if E = '1' then REG_ETAT <= "011"; else REG_ETAT <= "000"; end if ; when "011" => S <= '1' ; if E = '1' then REG_ETAT <= "011"; else REG_ETAT <= "100"; end if ; when "100" => S <= '1' ; if E = '1' then REG_ETAT <= "011"; else REG_ETAT <= "101"; end if ; when "101" => S <= '0' ; if E = '1' then REG_ETAT <= "011"; else REG_ETAT <= "000"; end if ; 5 when others => REG_ETAT <= "00"; end case ;end if ;end process ; end COMPORTEMENT ; Machines d’états Exemple 2 de codage à la main Sortie en dehors du process Description COMBINATOIRE 6 Machines d’états Création d’un type état Méthode conseillée car plus lisible Condition =1 Ne pas que la condition ne sera vrai qu’au coup l’horloge TYPE type_etat IS (debut,add,decal,fin); SIGNAL etat : type_etat; BEGIN -- autre process (opérateurs) PROCESS(h,init) BEGIN IF (init = ’1’) THEN etat <= debut; ELSE If (h=‘1’ and h’EVENT) THEN CASE etat IS WHEN debut =>IF zero THEN etat <= fin; ELSIF lsb THEN etat <= add; ELSE etat <= dec; END IF; WHEN add => etat <= dec; WHEN dec => IF zero THEN etat <= fin; ELSIF lsb THEN etat <= add; END IF; WHEN fin => etat <= fin; WHEN others => etat <=debut; END CASE; END IF; END PROCESS ; initialiser <= ‘1’ when (etat = debut) else ‘0’; additionner <= ‘1’ when(etat = add) else ‘0’; decaler <= ‘1’when (etat = dec) else ‘0’; fin_calcul <= ’1’ WHEN etat = fin ELSE ’0’; 7 Machines d’états Réalisation d’une temporisation dans une FSM Un Etat temporisation Basé sur un compteur Ne pas oublier de mettre réinitialiser le compteur when Etat1 => compt:=0; if (Madondition) then etat<=Tempo; end if; When Tempo => cpt:=cpt+1; If cpt=564 then etat<=Etat2; end if; When Etat2 = > ……. Synchronisation entre Machine d’état La sortie de la machine Maître est une entrée de la machine esclave Notion d’échange « en poignée de main »: HANDSHAKE Un Signal de notification et un signal d’accusé de réception Ce protocole d’échange est de nature asynchrone attention les FSM restent synchrones et n’échantillonne le signal sur front d’horloge 8 Applications Réception simplifiée des périphériques PS/2 Exemple de trame périphérique-> maître Schéma de principe Exemple de machine d’état simplifiée Extrait des codes octets envoyés 9