Very High Speed Integrated Circuit Hardware Description Language/Exercices/TP 3

Une page de Wikiversité.

TP 3
Computer-aj aj ashton 01.svg
Exercice 3
Leçon : Very High Speed Integrated Circuit Hardware Description Language
Icon falscher Titel.svg

En raison de limitations techniques, la typographie souhaitable du titre, « Exercice : TP 3
Very High Speed Integrated Circuit Hardware Description Language/Exercices/TP 3
 », n'a pu être restituée correctement ci-dessus.


Sommaire

[modifier] TP3 : Lecture partielle d'un clavier PS/2

L'objectif de ce TP est de réaliser la lecture des codes (scancodes) d'un clavier sur un port PS/2. La différence avec le TP précédent est donc que maintenant on doit retrouver le scancode de la touche qui a été appuyée et non plus le nombre de fronts d'horloge envoyés par le clavier.

Nous allons compléter le TP précédant, c'est-à-dire utiliser l'horloge échantillonnée (sortie) comme horloge du compteur et du registre à décalage. Cette façon de faire n'est pas bonne en tous points, mais elle est simple et conduit à un séquenceur à trois états (schématisé par un GRAFCET dans la figure ci-dessous).

[modifier] Travail à réaliser =

Comme dans les travaux précédents le travail à réaliser est donné sous le forme d'un schéma.

[modifier] Schéma à réaliser

On donne le schéma global de ce que vous allez réaliser ci-dessous.

TPMCensl1Fig6.png

Par rapport au TP précédent on garde le compteur sur 8 bits mais il est actif sur front descendant maintenant, et toujours commandé par « sortie » qui commande aussi un registre à décalage de 11 bits. Après un transfert correct on trouvera dans ce registre les 8 bits de données, le bit de start, le bit de stop et le bit de parité. Seuls les 8 bits intéressants (Q1 ... Q8) seront transférés dans le registre d'affichage. On a ajouté d'autre part un circuit combinatoire détectant l'état cmpt=11. Sa sortie est utilisée par un séquenceur décrit par un grafcet. Son objectif est qu'une fois les 11 fronts d'horloge détectés, le transfert est lancé pour les 8 bits intéressants dans le registre d'affichage, puis il remet le compteur à 0 afin d'attendre le début d'un autre transfert.

Il est clair que la synthèse demandée est complexe. Comme toute synthèse complexe elle peut être décomposée en deux parties distinctes (voir ici pour des compléments) :

  • un séquenceur
  • une partie opérative

On remarquera que puisque ces deux parties utilisent une horloge commune, le séquenceur fonctionne sur front montant tandis que la partie opérative fonctionne sur front descendant.

Remarque : aucun test de parité n'est réalisé dans cette version. Les évolutions possibles sont donc ce test de parité et un séquencement un peu plus proche de l'état du bus.

Quelques scancodes :

scancode hexadécimal pour clavier AZERTY
Touche Scancode Touche Scancode Touche Scancode
b 0x32 d 0x23 f 0x2B
g 0x34 h 0x33 j 0x3B
q 0x1C s 0x1B t 0x2C

[modifier] Éléments de VHDL donnés pour commencer votre travail

L'entité globale est :

entity tp3 is
  port(
    PS2_Clk_M16, PS2_Data_M15,Clk_T9, reset_L14 : in std_logic;
    sorties_aff : out std_logic_vector(6 downto 0);
    aff : out std_logic_vector(3 downto 0));
end tp3;

L'ensemble des composants à réaliser est maintenant :

  component Counter8 -- compteur 8 bits
	port(horloge,reset : in std_logic;
	 q : buffer std_logic_vector(7 downto 0));
  end component;
  component ShiftReg -- registre a decalage 8 bits
    port(clk,entree : in std_logic;
         q : out std_logic_vector(7 downto 0));
  end component;
  component ShiftReg11 -- registre a decalage 11 bits
    port(clk,entree : in std_logic;
         q8 : out std_logic_vector(7 downto 0));
  end component;
  component comb -- filtrage des aleats
    port(
      entrees : in std_logic_vector(7 downto 0);
      eQ : in std_logic;
      F : out std_logic);
  end component;
  component dflipflop --bascule D
    port(
      d,clk : in std_logic;
      q : out std_logic);
  end component;
  component tp1 -- realise en TP 1
    port (
       clk : in std_logic;
    entrees : in std_logic_vector(7 downto 0);
    sorties : out std_logic_vector(6 downto 0);
    aff : out std_logic_vector(3 downto 0));
  end component;
  component seq -- séquenceur (GRAFCET)
  port(
    clk, cmpt_is_11,init : in std_logic;
    reset,transfert : out std_logic
  );
  end component;
  component compare -- comparateur
  port (
    entrees : in std_logic_vector(7 downto 0);
    s_cmpt_is_11 : out std_logic
  );
  end component;

On utilisera complètement le travail fait en tp1 et partiellement celui de TP2.

[modifier] Questions

Relever certains scancodes en plus de ceux fournis en exemple pour les tests, et en particulier celui des flèches de déplacement.