P. 1
clavier_matriciel

clavier_matriciel

4.0

|Views: 848|Likes:
Publié parhaithemo
conception en Vhdl d'une clavier matriciel
conception en Vhdl d'une clavier matriciel

More info:

Published by: haithemo on Feb 05, 2009
Droits d'auteur :Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as TXT, TXT or read online from Scribd
See more
See less

05/10/2014

Rapport du projet semestriel N°3 Sujet : Gestion du clavier matriciel Elaboré par : • ZERDOUM WASSIM • YAZID HAITHEM • LOUSSIF

MOHAMED AMINE • EI.2.2.2 Encadré par : Mr. SABEUR JEMALLI

Sommaire Remerciement…………………………………………….3 I. Introduction Générale ………………………………….4 II. Présentation Générale………………………………….5 1. schéma globale ………………………………………………...........5 2. Description générale…………………………………………….......6 III. Description bloc par bloc…………………………….7 1. clavier……………………………………………………………......7 2. démultiplexeur …………………………………………………….7 3. Encodeur de clavier………………………………………………...9 4. Les registres………………………………………………………..11 5. Commande……………………………………………………….. 13 6. Multiplexeur ………………………………………………………14 7. Décodeur…………………………………………………………...15 8. Transcodeur …………………………………………………… ...16 9. Les afficheurs 7 segments………………………………………....18 IV. Conclusion…………………………………………...19 V.Résultats :(Annexes)…………………..…………………....20

Remerciement Au terme de ce rapport, nous tenons à exprimer nos profonds respects et gratitudes à la direction de L’ENISO qui nous a contribué à nous accorder ce projet afin de consolider nos acquis théoriques par une expérience pratique, aussi bien, pour enrichir nos connaissances dans le domaine de programmation et la conception FPGA. De mêmes, nous nous adressons par nos sincères remerciements à Monsieur Jemalli Sabeur, pour son soutien et ses précieux conseils le long de la réalisation de ce projet. Ainsi pour tous ceux qui nous ont aidés à terminer nos travaux.

I. Introduction Générale L’objectif de ce projet est de faire la gestion d’un clavier matriciel à 16 touches. En effet, le projet consiste à faire une étude complète pour l’implémentation du programme correspondant sur une carte FPGA. Donc, on a décomposé le système en un ensemble de blocs. Chaque bloc réalise une fonction précise suivant nos besoins avec les interconnexions nécessaires .la sortie de ce clavier sera affichée sur une association de quatre afficheur 7 segments. À travers ce compte rendu de projet, nous présenterons tout d’abord le schéma général du clavier à réaliser ainsi que la description générale y associée. Nous présenterons ensuite les différents modules qui le composent en les détaillants, en exposant leur codage vhdl ainsi que leurs chronogrammes (en annexe). L’outil utilisé pour faire la simulation est Modelsim 6.2.

II. Présentation Générale 1. schéma globale reset sel clK vect(4 bits) clK vers reset vect( 4 bits) clK load appui

reset sel clK vect(2 bits)

2. Description Générale Initialement, on fait attribuer un 1 logique aux lignes d’entées du clavier matriciel. Ceci est garanti par l’association du compteur_1 et de démultiplexeur. Ensuite, l’appui sur une touche du clavier déclenche le cycle complet. D’abord, l’encodeur transforme le code reçu sur 8 bits en un vecteur à 4 bits et génère une sortie supplémentaire pour désactiver le compteur_1 « appui » (par l’intermédiaire du bloc de commande).ce vecteur va être enregistré dans un registre puis affiché sur un afficheur 7 segments après le passage d’un vecteur à 4 bits vers un vecteur à 7 bit à l’aide d’un transcodeur. Mais notre but est d’afficher quatre chiffres sur quatre afficheurs. Pour cela, on met les 4 registres (reg1, reg2, reg3, reg4) en cascade. A chaque fois qu’on a une nouvelle entrée le registre i+1 prend la valeur enregistré dans le registre i .ainsi on relie leurs sorties par un multiplexeur pour avoir un affichage multiplexé et la sélection de l’afficheur correspondant se fait à l’aide d’un décodeur commandé par les mêmes entrées de sélections du notre multiplexeur.

III. Description bloc par bloc 1. Le clavier L0 L1 L2 L3 Fig1 : schéma externe :architecture interne Principe Fig2

Ce type de clavier est composé de lignes et de colonnes à l’intersection desquelles se trouvent les touches qui viennent donner le contact électrique. A chaque touche correspond un contact entre une ligne et une colonne. Ici il s’agit d’un clavier matricé de 16 touches avec 4 lignes et 4 colonnes. EX : une pression sur la touche 1 met en liaison électrique la colonne 1 avec la rangée A. Ce type de montage permet de limiter le nombre de fils nécessaires à la gestion du clavier mais nécessite un circuit de décodage du clavier. 2. Le Démultiplexeur : (annexe1) Un démultiplexeur réalise l’opération duale du multiplexeur : il aiguille 1donnée sur 1 parmi 2n sorties (n entrées d’adresses).on utilise ce dispositif pour attribuer un 1 logique à chaque ligne du clavier matriciel D’une façon séquentielle. Schéma du bloc :

{Code vhdl } library ieee; use ieee.std_logic_1164.all; entity dmux is port( vdd:in std_logic; sel:in std_logic_vector(1 downto 0); a,b,c,d:out std_logic ); end dmux; architecture rtl_dmux of dmux is begin process(vdd,sel) begin case sel is when"00" => a<=vdd; when"10" => b<=vdd; when"01" => c<=vdd; when others => d<=vdd; end case; end process;

end rtl_dmux;

3. Encodeur de clavier (annexe2) C’est un codeur 8 à 4bits dont les entrées sont les quatre lignes et les quatre colonnes du clavier et la sortie est un code binaire à 4 bits qui correspond à l’identifiant de la touche appuyée .De plus l'encodeur renvoie une variable témoin : Appui. Cette sortie, qui sera utile pour arrêter le balayage (désactiver le compteur qui commande le D_mux), est à l'état 1 lorsqu'une touche est appuyée et à 0 sinon. Dans ce dernier cas la sortie de l'encodeur est (0000). Pour déterminer la touche appuyée, on fait un balayage sur les lignes d’une entrée à niveau haut. Ceci est garantie par l’utilisation d’un démultiplexeur 4 bits qui permet de générer un 1 logique à chaque ligne suivant les valeurs des entrées de selection.la sélection est commandée par un compteur 2bits dont la fréquence d’horloge vaut 10 kHz . Schéma du bloc

{Table de vérité} L3 L2 L1 L0 C3 C2 C1 C0 A4 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 1 {Code vhdl} library ieee; use ieee.std_logic_1164.all; entity decod is port( l0,l1,l2,l3,c0,c1,c2,c3,clk:in bit ; key_det:out std_logic; sd:out std_logic_vector(3 downto 0) ); end decod; architecture rtl_decod of decod is begin process (clk) begin if (c0='0' and c1='0' and c2='0' and key_det<='0'; else key_det<='1';

A3 0 0 0 0 1 1 0 0 1 0 0 1 1 0 1 0

A2 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1

A1 1 0 1 0 0 0 1 1 1 0 1 0 1 0 0 1

c3='0') then

if(clk'event and clk='1') then if (l0='1' and c0='1') then sd<="0001"; elsif (l0='1' and c1='1') then sd<="0010"; elsif (l0='1' and c2='1') then sd<="0011"; elsif (l0='1' and c3='1') then sd<="1010"; elsif (l1='1' and c0='1') then sd<="0100"; elsif (l1='1' and c1='1') then sd<="0110"; elsif (l1='1' and c2='1') then sd<="0011"; elsif (l1='1' and c3='1') then sd<="1011"; elsif (l2='1' and c0='1') then sd<="0111"; elsif (l2='1' and c1='1') then sd<="1000"; elsif (l2='1' and c2='1') then sd<="1001"; elsif (l2='1' and c3='1') then sd<="1100"; elsif (l3='1' and c0='1') then sd<="1111"; elsif (l3='1' and c1='1') then sd<="0000"; elsif (l3='1' and c2='1') then sd<="1110"; elsif (l3='1' and c3='1') then sd<="1011"; end if; end if; end if; end process; end rtl_decod;

4. Les registres (annexe3) Un registre est un groupe de bascules qui permet de stocker plusieurs éléments binaires. La façon de connecter les bascules donne la fonction au registre. Le registre permet ainsi de mémoriser un mot. A chaque mot binaire est associée une bascule D. Le mode de fonctionnement se résume comme suit : Quand « load » est à l'état haut et au front montant de l’horloge, le registre charge la valeur de sortie de l'encodeur dans un vecteur 4 bits. Cette valeur est stockée le temps d'être transmise. Dans notre application on a fait appel à quatre registres afin d’enregistrer quatre valeurs dans le but de les afficher sur les quatre afficheurs 7 segments.au début, le chargement s’effectue dans le premier registre, ensuite l’appuie d’une autre touche déclenche l’opération de transfert des données vers le deuxième registre et ainsi de suite. Schéma du bloc

S_reg1 s_reg4 cLk

S_reg2

s_reg3

Code vhdl(un registre) LIBRARY ieee; USE ieee.std_logic_1164.all; entity pi_po is port ( CLK,R,load :in std_logic; in_paral :in std_logic_vector(3 downto 0); out_paral :out std_logic_vector(3 downto 0) ); end pi_po; architecture rtl_reg of pi_po is signal Q:std_logic_vector(3 downto 0); begin process(clk,R) begin if R='1' then Q <= "0000"; elsif (CLK'event and CLK='1' ) then if load = '1' then Q <= in_paral; end if; end if; out_paral<=Q; end process; end rtl_reg;

5. Commande (annexe4) C’est un bloc synchrone (fréquence =10KHz) conçu pour éviter les problèmes engendrés lors de l’appui sur les touches du clavier. Ce bloc admet comme entrée la sortie de l’encodeur « appui » .quand ce signal est actif, il désactive le compteur et active les entrées de chargement « load » Des quatre registres. shéma du bloc load Appui cLk reset(compteur_1)

Code vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity commande is port(key_det:in std_logic; clk: in std_logic; load:out std_logic); end; architecture auto of commande is begin process(clk) begin if key_det='0' then load<='0'; elsif key_det='1' then if (clk='1'and clk 'event)then load<='1'; end if; end if; end process; end auto;

6. Multiplexeur 4→1 (annexe5) Un multiplexeur est un circuit réalisant un aiguillage (recopie) de l’une des entrées de données (par la commande des entrées d’adresse) vers une sortie unique . Dans notre application, chaque entrée est un vecteur de 4 bits issue des quatre registres. La sélection se fait par un compteur 2 bit. Schéma du bloc S_reg1 S_reg2 S_mux S_reg 3

S_reg 4

Code vhdl library ieee; use ieee.std_logic_1164.all; entity mux is port( sel: in std_logic_vector(1 downto 0); s_reg1,s_reg2,s_reg3,s_reg4:in std_logic_vector(3 downto 0); s_mux: out std_logic_vector(3 downto 0)); end; architecture sort_mux of mux is begin process begin case sel is when "00" =>s_mux<=s_reg1; when "01" =>s_mux<=s_reg2; when "10" =>s_mux<=s_reg3; when others =>s_mux<=s_reg4; end case; end process; end sort_mux;

7. Décodeur (annexe6) Un décodeur est un circuit qui délivre des informations lorsque la combinaisons des variables binaires d’entrée est représentative des mots-code choisis. On utilise ce bloc pour sélectionner un seul afficheur à la fois. Schéma du bloc A0 SEL A1 2bits A2 A3 Table de vérité Sel1 0 0 1 1 Sel0 0 1 0 1 A3 0 0 0 1 A2 0 0 1 0 A1 0 1 0 0 A0 1 0 0 0

Code vhdl library ieee; use ieee.std_logic_1164.all; entity code is port( sel:in std_logic_vector(1 downto 0); sel_aff:out std_logic_vector(3 downto 0)); end; architecture cod_aff of code is begin process(sel) begin case sel is when "00" =>sel_aff<="0001"; when "01" =>sel_aff<="0010"; when "10" =>sel_aff<="0100"; when others =>sel_aff<="1000"; end case; end process; end cod_aff;

8. Transcodeur (annexe7) Un transcodeur est un dispositif permettant de passer du nombre N écrit dans un code C1 au même nombre N écrit dans le code C2. Dans notre cas, la valeur reçue en 4 bits passe à un code sur 7 bits afin de pouvoir afficher la valeur sur un afficheur 7 segments. Schéma du bloc a b A B C D c d e f

g

Table de vérité A 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 B 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 C 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 D 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 a 0 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 B 1 0 1 1 1 0 1 0 1 1 1 0 0 1 0 1 c 1 0 0 1 1 1 1 1 1 1 1 1 0 1 0 0 d 1 0 1 1 0 1 0 1 1 1 0 1 1 1 1 0 e 1 1 1 0 0 0 1 1 1 0 1 1 1 1 1 1 f 1 1 0 0 1 1 1 0 1 1 1 1 1 0 1 1 g 1 0 1 1 0 1 1 0 1 1 1 0 1 0 1 1

Code vhdl

library ieee; use ieee.std_logic_1164.all; entity transcod_affich is port( s_mux:in std_logic_vector(3 downto 0); s_t:out std_logic_vector(6 downto 0) ); end transcod_affich; architecture rtl_trans of transcod_affich is begin process(s_mux) begin case s_mux is when "0000"=>s_t<="0111111"; when "0001"=>s_t<="0000110"; when "0010"=>s_t<="1101101"; when "0011"=>s_t<="1111001"; when "0100"=>s_t<="1110010"; when "0101"=>s_t<="1011011"; when "0110"=>s_t<="1110111"; when "0111"=>s_t<="0011100"; when "1000"=>s_t<="1111111"; when "1001"=>s_t<="1111011"; when "1010"=>s_t<="1110111"; when "1011"=>s_t<="1011110"; when "1100"=>s_t<="0001111"; when "1101"=>s_t<="1111100"; when "1110"=>s_t<="1001111"; when OTHERS=>s_t<="1100111"; end case; end process; end rtl_trans;

9. Les afficheurs 7 segments

Un afficheur 7 segments permet de visualiser des chiffres ou éventuellement certaines lettres de l'alphabet : Schéma interne pour afficheur anode commune Comme son l'indique, l'afficheur est composé de 7 segments a, b, c, d, e, f et g qui sont des LEDS et nécessitent, en fonction du type d'afficheur (anode commune ou cathode commune) une polarisation spécifique. On distingue 2 types d'afficheurs : Afficheur à anode commune : (Cf schéma interne ci-dessus) : toutes les anodes sont reliées entre elles. Afficheur à cathode commune : ce sont les cathodes qui sont reliées entre elles. Notre projets consiste à afficher 4 chiffres .donc on utilise quatre afficheurs 7 segments et on les active séquentiellement par les sorties du codeur.

IV. Conclusion Le projet présenté a été fini dans les temps et répond au cahier des charges. La simulation Montre un fonctionnement correct du circuit et l’optimisation ne révèle aucune erreur. Cependant, même si tout semble fonctionner correctement, rien ne nous assure que le programme une fois implémenté dans un FPGA fonctionnera également. Pour cela, il aurait fallu d’implémenter réellement le programme dans un FPGA pour effectuer des tests. Malheureusement, le temps impartit pour ce projet ne nous a pas permis d’arriver jusqu'à la partie finale du développement d’un circuit.

V. Résultats Annexe1 : démultiplexeur

Annexe2 : Encodeur du clavier

Annexe3 : registre

Annexe4 : commande

Annexe5:multiplexeur

Annexe6 : Décodeur

Annexe7 : Transcodeur

Annexe8 : Compteur (2 bit)

Annexe9 : programme principale library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity clavier_mat is port(e:in std_logic_vector(7 downto 0); sortie:out std_logic_vector(6 downto 0)); end; architecture RTL of clavier_mat is component decod --decodeur clavier port( l0,l1,l2,l3,c0,c1,c2,c3,clk:in std_logic ; key_det:out std_logic; sd:out std_logic_vector(3 downto 0) ); end component decod; component pi_po --registre port ( CLK,R,load :in std_logic; in_paral :in std_logic_vector(3 downto 0); out_paral :out std_logic_vector(3 downto 0) ); end component pi_po; component commande --commande port(key_det:in std_logic; clk: in std_logic; load:out std_logic); end component commande; component transcod_affich --transcodeur afficheur port( s_mux:in std_logic_vector(3 downto 0); s_t:out std_logic_vector(6 downto 0) ); end component transcod_affich; component code --codeur select afficheur port( sel:in std_logic_vector(1 downto 0); sel_aff:out std_logic_vector(3 downto 0)); end component code; component dmux --dmux lignes port( vdd:in std_logic; sel:in std_logic_vector(1 downto 0); a,b,c,d:out std_logic ); end component dmux; component mux --mux registre port( sel: in std_logic_vector(1 downto 0); s_reg1,s_reg2,s_reg3,s_reg4:in std_logic_vector(3 downto 0); s_mux: out std_logic_vector(3 downto 0));

end component mux; component compteur --compteur port (clk,reset:in std_logic; cnt:out std_logic_vector(1 downto 0) ); end component compteur; --déclaration des signaux internes signal l0,l1,l2,l3,c0,c1,c2,c3: std_logic ; signal sd: std_logic_vector(3 downto 0); signal s_reg1: std_logic_vector(3 downto 0); signal s_reg2: std_logic_vector(3 downto 0); signal s_reg3: std_logic_vector(3 downto 0); signal s_reg4: std_logic_vector(3 downto 0); signal key_det: std_logic; signal sel: std_logic_vector(1 downto 0); signal s_mux: std_logic_vector(3 downto 0); signal sel1: std_logic_vector(1 downto 0); signal clk0:std_logic; signal clk1:std_logic; signal clk2:std_logic; signal clk3:std_logic; signal clk4:std_logic; signal clk5:std_logic; signal r1:std_logic; signal r2:std_logic; signal r3:std_logic; signal r4:std_logic; signal load1:std_logic; signal load2:std_logic; signal load3:std_logic; signal load4:std_logic; signal s_t:std_logic_vector(6 downto 0); signal sel_aff: std_logic_vector(3 downto 0); signal vdd: std_logic; signal reset:std_logic; begin --instanciation decodeur u1:decod port map(l0,l1,l2,l3,c0,c1,c2,c3,clk0,key_det,sd); --instanciation registre decalage1 u2:pi_po port map(clk1,r1,load1,in_paral=>sd,out_paral=>s_reg1 ); --instanciation registre decalage2 u3:pi_po port map(clk2,r2,load2,in_paral=>s_reg1,out_paral=>s_reg2 ); --instanciation registre decalage3 u4:pi_po port map(clk3,r3,load3,in_paral=>s_reg2,out_paral=>s_reg3 ); --instanciation registre decalage4 u5:pi_po port map(clk4,r4,load4,in_paral=>s_reg3,out_paral=>s_reg4 ); --instanciation mux_transc u6:mux port map(sel,s_reg1,s_reg2,s_reg3,s_reg4,s_mux);

--instanciation transcodeur u7:transcod_affich port map(s_mux,s_t); --instanciation codeur select affich u8:code port map(sel,sel_aff); --instanciation dmux u9:dmux port map(vdd,sel1,a=>l0,b=>l1,c=>l2,d=>l3); --instanciation compteur1 u10:compteur port map(reset,sel); --instanciation compteur2 u11:compteur port map(reset,sel1); --instanciation commande u12:commande port map(key_det,load); end;

You're Reading a Free Preview

Télécharger
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->