Very High Speed Integrated Circuit Hardware Description Language/Travail pratique/TP 2

Début de la boite de navigation du travail pratique


Les Travaux Pratiques que nous présentons sont liés au matériel utilisé. En ce qui nous concerne nous utilisons du matériel XILINX (Spartan 3). Comme vous pourrez cependant le constater, la rédaction de ce TP est relativement indépendante du matériel. Beaucoup d'autres cartes proposent une connexion PS/2 : seuls le nom des broches et la façon de les nommer changent avec le matériel.

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

L'objectif de ce TP divisé en quatre parties est de lire le scancode envoyé par un clavier, de l'afficher sur plusieurs afficheurs sept segments et pour finir, d'embarquer un processeur qui utilisera ces scancodes. Le protocole PS/2 implanté ici est très loin d’être complet.

TP1 : afficheurs 7 segments

modifier

Pour visualiser nos futures informations fournies par un clavier, nous avons besoin dans un premier temps de travailler sur l’affichage d'informations. Nous allons utiliser pour cela des afficheurs 7 segments présents sur la carte.

Décodeur 7 segments simple

modifier

Pour permettre de prendre contact avec la maquette d'essai on va commencer par résoudre un problème simple : utiliser 4 interrupteurs en entrée et afficher en hexadécimal la valeur correspondante sur un des quatre afficheurs sept segments.

Début d’un principe
Fin du principe

Ce problème à résoudre correspond à une entité (entity) VHDL :

entity tp1 is
  port (
    entrees : in std_logic_vector(3 downto 0); -- 4 inters en entree
    s7segs : out std_logic_vector(6 downto 0); -- 7 segments en sorties
    aff : out std_logic_vector(3 downto 0)); -- 4 selecteurs d'afficheur
end tp1;

On peut remarquer que :

  • les quatre interrupteurs d'entrées sont regroupés dans une variable que l’on appelle entrees
  • les sept segments à afficher sont regroupés dans une variable nommée s7segs
  • la sélection des afficheurs est regroupée dans une variable nommée aff

La compréhension de ces choix nécessite une compréhension des afficheurs. Ils sont multiplexés à l'aide d'un signal par afficheur. L'affichage se fait ainsi avec 7 signaux (les segments à allumer) qui sont actifs à l'état bas. Cela veut simplement dire que les afficheurs 7 segments sont à anode commune.

La figure ci-dessous présente le travail à réaliser.

 
Début d’un principe
Fin du principe


L'entité VHDL complète correspondante à la figure ci-dessus sera donc :

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity tp1 is
  port (
    entrees : in std_logic_vector(3 downto 0); -- 4 inters en entree
    s7segs : out std_logic_vector(6 downto 0); -- 7 segments en sorties
    aff : out std_logic_vector(3 downto 0)); -- 4 selecteurs d'afficheur
end tp1;

qu’il vous faudra compléter avec son architecture correspondante. Il s'git naturellement d'un problème purement combinatoire qui peut être résolu avec un style "with select when" écrit directement à partir d'une table de vérité.

Décodeur 8 bits vers deux afficheurs avec sa correction

modifier

On utilisera que les deux afficheurs poids faibles. Réaliser un ensemble permettant d'afficher le contenu de 8 bits sur deux afficheurs en hexadécimal. Ici il vous faudra forcément une horloge pour afficher tantôt le poids faible tantôt le poids fort (l'afficheur est validé par un 0).

 

Indications : On pourra réaliser l’ensemble comme indiqué dans la figure ci-dessous. Il est important de comprendre que cette figure vous donne l'architecture de votre programme VHDL : on utilisera la programmation structurelle. Ce style consiste à assembler des composants : cela est expliqué dans la section Assembler des composants du WIKIBOOK Conception et VHDL.

 

Un compteur 20 bits est destiné à réaliser un signal "lent" (Q19) à partir de l'horloge 50 Mhz de la carte. Un mutliplexeur permet d'envoyer alternativement les quatre bits de poids fort et les quatre bits de poids faible sur le décodeur sept segments. Ceci doit être synchronisé avec le signal qui sélectionne l’afficheur 7 segments sur lequel on affiche. Comme il n'y a que deux afficheurs, le bit Q19 inversé/non inversé suffit pour alterner cette sélection d'afficheur : quand on envoie le poids faible on sélectionne l'afficheur droit etc. Le décodeur sept segments de l'exercice 1 peut être utilisé encore ici. Le travail à réaliser peut être caractérisé par l'entité (entity) suivante :

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity tp1 is
  port (
    clk : in std_logic; --horloge ajoutée pour demultiplexage
    entrees : in std_logic_vector(7 downto 0); -- 8 interrupteurs en entrée
    s7segs : out std_logic_vector(6 downto 0); -- affichage 7 segments
    aff : out std_logic_vector(3 downto 0)); -- sélection des afficheurs
end tp1;

qu’il vous suffit de compléter par son architecture correspondante. Avant de dérouler la solution, essayez de réfléchir par vous-même.

Décodeur 16 bits vers quatre afficheurs sans sa correction

modifier

On vous demande d'étendre l’affichage à 16 bits. Vous allez réaliser un registre à décalage sur 4 bits avec un '0' qui se décale en décalage circulaire. Ce registre sera commandé par l'horloge lente naturellement. Ces quatre signaux seront utilisés pour la sortie "aff", c'est-à-dire la sélection des afficheurs.

La sortie de ce registre à décalage commandera un multiplexeur pour choisir les quatre bits à afficher.

Voici un schéma de principe :

 
Gestion des 4 afficheurs
  Notre horloge générale est de 50 Mhz. Ainsi, contrairement au schéma, il est bon de prendre q17 en lieu et place de q19 comme horloge lente... autrement votre œil percevra les clignotements des afficheurs. Nous mettrons la figure à jour un de ces jours !

L'entité VHDL correspondant au schéma est :

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity tp1b is
  port (
    clk : in std_logic; --horloge ajoutée pour demultiplexage
    reset : std_logic; --reset pour le registre à décalage
    entrees : in std_logic_vector(15 downto 0); -- 8 interrupteurs en entrée + 8...
    s7segs : out std_logic_vector(6 downto 0); -- affichage 7 segments
    aff : out std_logic_vector(3 downto 0)); -- sélection des afficheurs
end tp1b;


Voir aussi

modifier