TD4 VHDL Logique Sequentielle

Un livre de Wikibooks.

Sections

[modifier] Programmation de graphes d'états et graphes d'évolutions

Nous avons déjà eu l'occasion de parler de ce problème en logique (ici (TD 8)) avec des équations de récurrence.

Td8fig3.png

Une transition barrée est dite réceptive et, comme l'indique l'équivalence du dessin ci-dessus, elle sous entend que si la réceptivité est fausse on reste dans le même état.

Présentons d'abord la technique avec et sans initialisation.

-- sans initialisation
BEGIN
  PROCESS (clock) BEGIN
    IF clock'EVENT AND clock='1' THEN
      CASE etat IS
      WHEN Off => IF key ='1' THEN etat <= Armed; 
                  ELSE etat <= Off; 
                  END IF;
                  ....
      END CASE;
    END IF;
  END PROCESS;
  ....

On voit sur cet exemple partiel comment passer d'un graphe d'évolution à un CASE en VHDL.

-- avec initialisation synchrone
BEGIN
  PROCESS (clock) BEGIN
    IF clock'EVENT AND clock='1' THEN
      IF Init='1' THEN etat  <=Off; --initialisation synchrone
      ELSE
        CASE etat IS
        WHEN Off => IF key ='1' THEN etat <= Armed; 
                    ELSE etat <= Off; 
                    END IF;
                    ....
        END CASE;
      END IF
    END IF;
  END PROCESS;
  ....

[modifier] Le codage des états

La programmation des états nécessite une déclaration symbolique comme on peut voir ci-dessous :

TYPE typetat IS (Armed, Off, Ringing); -- dans architecture
SIGNAL etat : typetat;

Quand la synthèse sera demandée plusieurs solutions peuvent se présenter suivant le codage des états. Une telle déclaration débouchera sur un codage Armed=00, Off=01 et Ringing=10.

On peut modifier ce codage à l'aide de deux attributs différents : enum_encoding et state_encoding. Enum_encoding est normalisé par le standard IEEE 1076.6.

type state is (s0,s1,s2,s3);
attribute enum_encoding of state:type is "00 01 10 11";

La directive state_encoding spécifie la nature du code interne pour les valeurs d'un type énuméré.

attribute state_encoding of type-name:type is value;

Les valeurs légales de la directive state_encoding sont sequential, one_hot_zero, one_hot_one, and gray.

  • sequential : on code en binaire au fur et à mesure de l'énumération avec autant de bits que nécessaire.
  • one_hot_zero : on code la première valeur par zéro, puis le reste en utilisant à chaque fois un seul un : N états nécessiteront donc N-1 bits.
  • one_hot_one : idem à one_hot_zero sauf que l'on n'utilise pas le code zéro. N états nécessiteront donc N bits.
  • Gray : les états suivent un code GRAY.

Exemples :

type state is (s0,s1,s2,s3);
attribute state_encoding of state:type is one_hot_zero;
type s is (s0,s1,s2,s3);
attribute state_encoding of s:type is gray;

[modifier] Exercice

Concevez une machine d'état capable de détecter la présence de la sequence « 1111010 ».

a) Dessiner le graphe d'évolution.

b) Réaliser le programme VHDL correspondant.

[modifier] Les forçages synchrones et asynchrones

Il existe deux façons pour initialiser en utilisant les fronts d'horloge (synchrone) ou non (asynchrone). La technique de programmation est très similaire à celle des compteurs du TD précédent.

[modifier] Forçage asynchrone

-- gestion de l'asynchrone
process(clk,reset) begin
  if reset='1' then
  -- avant horloge donc asynchrone
  q<= "0000";
  elsif clk'event and clk='1' then
  -- ici le synchrone
  end if;
end process;

[modifier] Forçage synchrone

[modifier] Première façon

-- initialisation synchrone
process(clk) begin
  if clk'event and clk='1'then
  -- equations de récurrence +
  -- init ou
  -- equations de récurrence 
  --./init
  end if;
end process;

[modifier] Deuxième façon

if clk'event and clk='1'then
  if init ='1' then
    q<= "0000";
  else 
    -- ici case ou equations de
    -- récurrences
  end if; 
end if;

[modifier] Exercice

Un étudiant a utilisé active-FSM (outil de dessin de graphes d'évolution) et généré un programme VHDL correspondant au dessin ci-dessous. Puis il a réalisé un projet pour compiler et prétend que les extraits ci-dessous sont tirés du fichier de rapport correspondant. On vous demande de dire si l'étudiant a raison ou pas. Pour cela on vous propose de remplir l'habituelle table de transitions ci-dessous (ou tableau état présent état futur) et d'en déduire s'il correspond bien au dessin du diagramme d'évolution ci-dessous.

VHDLFig16.png

Pour remplir le tableau, vous utiliserez naturellement les équations de récurrence du fichier rapport. Dans ce fichier, la notation truc.D signifie truc+ et truc.Q signifie truc. On notera sregSBV_0 tout simplement s0.

Table de transitions
Entrées Sortie
Etat Présent Conditions Etat futur
s s0 e0 e1 Init s+ s0+
0 0 0 X 0
0 0 1 X 0
0 1 0 X 0
0 1 1 X 0
1 0 0 X 0
1 0 1 X 0
1 1 1 X 0

Fichier rapport

    | | | | | | |
   _________________
  -|               |-
  -|               |-
  -|               |-
  -|    CYPRESS    |-
  -|               |-
  -|               |-  Warp VHDL Synthesis Compiler:
  -|               |-  Copyright (C) 1991, 1992, 1993,
   |_______________|   Cypress Semiconductor
     | | | | | | |
....
State variable 'sreg0' is represented by a Bit_vector(0 to 1).
State encoding (sequential) for 'sreg0' is:
	etat0 :=	b"00";
	etat1 :=	b"10";
	etat2 :=	b"01";
-----------------------------------------------------------------------
PLD Compiler Software:        PLA2JED.EXE    21/SEP/1998  [v4.02 ] 5.1 IR 14
DESIGN EQUATIONS           (19:08:48)
    sreg0SBV_0.D = /e0 * /init * sreg0SBV_0.Q 
                  + e1 * /init * s.Q 
    s.D =  e0 * /init * /s.Q * /sreg0SBV_0.Q 
           + /e1 * /init * s.Q 
........
                                 C20V8C
                 __________________________________________
          clock =| 1|                                  |24|* not used   
           init =| 2|                                  |23|* not used   
             e1 =| 3|                                  |22|* not used   
             e0 =| 4|                                  |21|* not used   
       not used *| 5|                                  |20|* not used   
       not used *| 6|                                  |19|* not used   
       not used *| 7|                                  |18|* not used   
       not used *| 8|                                  |17|* not used   
       not used *| 9|                                  |16|= (sreg0SBV_0)   
       not used *|10|                                  |15|= s          
       not used *|11|                                  |14|* not used   
       not used *|12|                                  |13|* Reserved   
                 __________________________________________

[modifier] Retour à la page principale du document

Retour à conception et VHDL