TD3 VHDL Compteurs et registres

Un livre de Wikibooks.

Les compteurs sont des éléments très utiles en VHDL. Il permettent de gérer tout ce qui est temporisation et évidemment comptage.

Sections

[modifier] Le compteur simple

Il est possible d'utiliser un style case pour programmer un compteur mais cela devient vite fastidieux lorsque le nombre de bits augmente.

[modifier] Exercice

Combien d'états comporte un compteur de n bits et donc combien de lignes pour chacun des « case » ? Application numérique : prendre n=16.

[modifier] Eviter une programmation trop fastidieuse

L'idéal serait donc de pouvoir écrire quelque chose du style

	compteur <= compteur + 1;

Cela peut se faire en respectant les conditions suivantes :

  • utilisation de la librairie IEEE 1164
  • utilisation de la librairie IEEE ARITH
  • utilisation de la librairie IEEE UNSIGNED
  • déclaration de compteur comme std_logic_vector

Avec XILINX cela se fait avec les lignes (devant chacune des entités concernées) :

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all; -- WARP : use work.std_arith.all;
use ieee.std_logic_unsigned.all;

[modifier] Exercice

Vous disposez d'une horloge rapide et vous voulez réaliser en réaliser une plus lente dont la fréquence est divisée par 32768. Proposez un compteur avec comme entrée h_rapide et comme sortie h_lente (toutes deux sur un bit). Le compteur intermédiaire sera réalisé par un signal.

[modifier] Possibilité d'utiliser un signal de type integer

Dans ce cas le compilateur peut avoir des problèmes pour trouver le nombre de bits nécessaire pour le compteur. Il faudra donc utiliser une comparaison supplémentaire :

architecture a_cmpt of cmpt is
signal Count : integer :=0; 
  process begin
    if (Clk'event and Clk='0');
	if (Count=7) then Count <=0; -- sur 3 bits
	else Count <=Count+1;
	end if;
  end process;
end a_cmpt;

[modifier] Compteur avec Remise A Zéro (RAZ)

L'entrée RAZ (Reset en anglais) sur un compteur est une entrée qui permet de mettre la valeur du compteur à 0. Elle peut être synchrone (prise ne compte seulement sur front d'horloge) ou asynchrone. Pour une même entité que l'on donne maintenant :

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all; 
use ieee.std_logic_unsigned.all;
ENTITY Compteur IS
PORT (
  clk,raz :IN std_logic;
  q : BUFFER std_logic_vector(3 downto 0));
END Compteur;

On va présenter la technique synchrone et asynchrone (process seulement) :

-- methode synchrone
PROCESS(clk) BEGIN
  IF clk'event and clk='1' THEN
    IF raz='1' THEN
      q<=(OTHERS=>'0');
    ELSE
      q<=q+1;
    END IF;
  END IF;
END PROCESS;

et

-- methode asynchrone
PROCESS(clk,raz) BEGIN
  IF raz='1' THEN
      q<=(OTHERS=>'0');
  ELSIF clk'event and clk='1' THEN
      q<=q+1;
  END IF;
END PROCESS;

[modifier] Exercice

Réaliser un compteur avec SET et RESET synchrones et asynchrones.

Modifier ce compteur pour qu'il compte jusqu'à 24.

[modifier] Compteur avec chargement parallèle

Le chargement parallèle est en général asynchrone :

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all; 
use ieee.std_logic_unsigned.all;
ENTITY Compteur IS
PORT (
  clk,load :IN std_logic;
  q : BUFFER std_logic_vector(3 downto 0)
  qe : IN std_logic_vector(3 downto 0));
END Compteur;
ARCHITECTURE acmpt OF Compteur IS BEGIN
PROCESS(clk,load) BEGIN
  IF load='1' THEN
      q<=qe; 
      -- ou q<=31; valeur predefinie
  ELSIF clk'event and clk='1' THEN
      q<=q+1;
  END IF;
END PROCESS;
END acmpt;

[modifier] Temporisation

L'application la plus courante des compteurs est la temporisation.

[modifier] Exercice : réalisation des signaux de synchronisation d'un écran VGA

On désire réaliser les deux signaux hsynch et vsynch nécessaire au bon fonctionnement d'un écran VGA. Ils sont caractérisés par les durées suivantes :

VHDLFig12.png

Techniquement la réalisation est faite de la manière suivante :

VHDLFig13.png

1°) Calculer la période de P88.

2°) Le compteur 0 -> XXX commence à compter au début des 25,6 ms. Jusqu'à combien doit-il compter pour réaliser ces 25,6 ms ?

3°) Il lui faut réaliser ensuite 0,64 ms, jusqu'à combien doit-il compter ? Il lui faut réaliser ensuite 3,8 ms, jusqu'à combien doit-il compter ? Il lui faut réaliser ensuite la période complète 31,75 ms, jusqu'à combien doit-il compter ? (C'est la valeur de XXX à un près) On arrondit en général XXX à 799. Déduire de tout cela la valeur de ZZZ et TTT.

4°) Ce sont les hsynch qui incrémentent le compteur 0->YYY. Quelle est la période correspondante (si l'on prend XXX=799) ?

5°) Combien de temps dure la période des 480 lignes avec le résultat de la question 4° (à comparer à 15,24 ms de la spécification VGA).

6°) A l'aide du résultat de 4°) trouver de combien doit compter le compteur pour réaliser le temps de 0,35 ms.

7°) A l'aide du résultat de 4°) trouver de combien doit compter le compteur pour réaliser le temps de 64 ms.

8°) A l'aide du résultat de 4°) trouver de combien doit compter le compteur pour réaliser la période complète de 16,6 ms. Est-il normal d'arrondir à 520 ?

[modifier] Registre à décalage

L'opérateur de concaténation (&) est utile pour ce genre de registre :

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity ShiftReg is
  port(clk,entree : in std_logic;
       q : out std_logic_vector(7 downto 0));
end ShiftReg;
architecture aShiftReg of ShiftReg is
  signal dataq : std_logic_vector
                          (7 downto 0);
begin
  process(clk) begin
     if clk'event and clk='0' then
       dataq <= entree& dataq
                          (7 downto 1);
	 end if;
  end process;
  process(dataq)begin
     q<=dataq;
  end process;
end aShiftReg;

[modifier] Exercice (filtrage de rebonds et/ou aléats)

L'architecture peut être décrite comme suit : un registre à décalage 4 bits sensible aux fronts descendants de T9, une bascule D qui mémorise l'état de notre sortie et une partie combinatoire qui génère un 1 à l'entrée de la bascule D dès que le registre est rempli par 4 bits à 1 et que sortie vaut 0.

VHDLFig14.png

Compléter les chronogrammes ci-dessous.

VHDLFig15.png

[modifier] Retour à la page principale du document

Retour à conception et VHDL