Vous êtes sur la page 1sur 13

Licences professionnelles

DMSEEA

INFORMATIQUE INDUSTRIELLE :
Travaux Pratique d’Initiation à la Programmation VHDL avec
l’Outil ISEDESIGN SUITE de XILINX

Encadré par : Réalisé par :


Mr. SALBI Adil EDDERJOUN Khalil
BOUSSAOUD Oualid

Année universitaire : 2023 / 2024


INTRODUCTION
Ce deuxième TP en Xilinx ISE avait pour objectif de consolider nos compétences en simulation et de
nous familiariser davantage avec l'implémentation pratique de concepts VHDL. Initialement, nous
avons débuté par la simulation des programmes développés lors des travaux dirigés en classe. Cette
phase a permis de vérifier la fonctionnalité des codes VHDL dans un environnement virtuel, offrant
ainsi une opportunité précieuse pour détecter et corriger d'éventuelles erreurs avant la mise en œuvre
sur des dispositifs matériels.

Par la suite, le TP a introduit l'utilisation de fonctions séquentielles et concurrentielles en nous


demandant de concevoir deux programmes distincts : un compteur modulo 10 et un afficheur
7segments. La mise en pratique de fonctions séquentielles a été cruciale dans la réalisation du
compteur.
I. Conception du Compteur :
 Description de la logique de comptage mise en œuvre.

LIBRARY IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
USE ieee.NUMERIC_std.all;

entity CM10 is
port(clk, reset : in std_logic;
compteur : inout std_logic_vector (3 downto 0);
s : out std_logic_vector (6 DOWNTO 0));
end CM10;

architecture COMPTEUR10 of CM10 is


signal incompt : integer range 0 to 10 ;
begin
compteur <= std_logic_vector(to_unsigned (incompt, 4));
process(clk,reset)
begin
if reset ='1' then
iNcompt <= 0;
elsif rising_edge(clk) then

if incompt = 9 THEN iNcompt <= 0;


else iNcompt <= iNcompt +1;
end if;

end if;

end process;
process(incompt)
begin
if incompt = 0 THEN s <= "1111110";
ELSif incompt = 1 THEN s <= "0110000";
elsif incompt = 2 THEN s <= "1101101";
elsif incompt = 3 THEN s <= "1111001";
elsif incompt = 4 THEN s <= "0110011";
elsif incompt = 5 THEN s <= "1011011";
elsif incompt = 6 THEN s <= "1011111";
elsif incompt = 7 THEN s <= "1110000";
elsif incompt = 8 THEN s <= "1111111";
elsif incompt = 9 THEN s <= "1111011";
ELSE s <= "0000001";
END IF;
end process;
end COMPTEUR10;
Résultats de la simulation du compteur.

 La simulation a été basé sur deux partie


 Forçage des entrées :
o Clk : par une Horloge de période de 10ms.et d’une durée de 200ms
o Reset : par une constante de valeur 1 qui débute après 50ms et dure 10ms.pour la
remise à zéro du compteur après un comptage jusqu’à 4.
 Visualisation des sorties
o Afin de rendre la valeur du compteur facile a lire on a choisis l’affichage du
compteur en mode unsigned décimal.
o Pour l’afficheur on va essayer de mettre un synoptique permettant la vérification des
sorties.

S est un vecteur 6down to 0 ce que signifie a


aa
EXEMPLE : a
aa

qu’elle represente 7sorties en xilinx si on Pour la valeur 3 marquée en rouge sur la


f b f b
associe successivement les sorties simulation
a ;b ;c ;d ;e ;f ;g de l’afficheur a « S » on g g
S := abcdefg
peut imaginer que e c e c
S :=1111001
S := abcdefg d d

 Problèmes rencontrés :
La première erreur été que XILINX refuse d’utiliser des variables internes pour corriger ceci, nous
avons déclaré la bibliothèque IEEE.NUMERIC_STD. Le nom de la variable interne utilisé est
incompt sur le programme.
La résolution de la deuxième erreur, caractérisée par un décalage entre le compteur et l'affichage lors
de la simulation, a été effectuée en introduisant un nouveau processus. Les instructions d'affichage,
initialement incluses dans le premier processus, ont été séparées et placées dans ce nouveau
processus séquentiel. Cette modification a favorisé une synchronisation plus précise entre le
compteur et l'affichage, éliminant ainsi le décalage observé pendant la simulation
II. Conception de l'Afficheur 7 Segments :
 Détails sur la conception de l'afficheur 7 segments.
Nous avons élaboré le programme sous deux modes en concurrentielle a savoir sélectif par
l’instruction « with select ». Et conditionnel par l’instruction « when else »

AFFECTATION SELECTIVE AFFECTATION CONDITIONELLE

Library IEEE ; library IEEE;


USE IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; use ieee.std_logic_unsigned.all;

entity AFFICHEUR is entity whenelseaff is


port( E : in std_logic_vector ( 3 DOWNTO 0); port( e1 : in std_logic_vector( 3 downto 0);
s : out std_logic_vector( 6 downto 0 )); s : out std_logic_vector ( 6 downto 0));
end AFFICHEUR; end whenelseaff;

architecture AFFICHEUR7SEG of AFFICHEUR architecture AFFICHEUR7SEG of whenelseaff


is is
Begin Begin

with E select s <= "1111110" when e1= 0000 else


s <= "1111110" when "0000", "0110000" when e1= 0001 else
"0110000" when "0001", "1101101" when e1= 0010 else
"1101101" when "0010", "1111001" when e1= 0011 else
"1111001" when "0011", "0110011" when e1= 0100 else
"0110011" when "0100", "1011011" when e1= 0101 else
"1011011" when "0101", "1011011" when e1= 0110 else
"1011011" when "0110", "1110000" when e1= 0111 else
"1110000" when "0111", "1111111" when e1= 1000 else
"1111111" when "1000", "1111011" when e1= 1001 else
"1111011" when "1001", "0000001";
"0000001" when OTHERS;
End AFFICHEUR7SEG;
End AFFICHEUR7SEG;

  Résultats de la simulation de l'afficheur.


L’afficheur affiche du 0 jusqu’a 9 au-delà de 9 il affiche « - »

III. Fusion des deux programmes et leurs affichages sur deux afficheurs différents

 Détails sur la conception de l'afficheur 7 segments.


Afin d’afficher les deux programmes dans les deux premiers segments on doit satisfaire au
conditions d’affichage situé dans le manuel d’utilisation de la carte nexys3 et qui est comme suite :

Le circuit de contrôle d'affichage par balayage peut être utilisé pour afficher un nombre à
quatre chiffres sur cet affichage. Ce circuit pilote les signaux d'anode et les motifs de cathode
correspondants de chaque chiffre dans une succession continue et répétée, à une fréquence de mise à
jour plus rapide que l'œil humain ne peut détecter. Chaque chiffre est illuminé seulement un quart du
temps, mais parce que l'œil ne peut pas percevoir l'obscurcissement d'un chiffre avant qu'il ne soit à
nouveau illuminé, le chiffre apparaît continuellement illuminé. Si la fréquence de mise à jour ou
"rafraîchissement" est ralentie à environ 45 hertz, la plupart des gens commenceront à voir un
scintillement de l'affichage.
Pour que chacun des quatre chiffres apparaisse brillant et continuellement illuminé, les quatre chiffres
doivent être pilotés une fois toutes les 1 à 16 ms, pour une fréquence de rafraîchissement de 1 kHz à
60 Hz.
Par exemple, dans un schéma de rafraîchissement à 60 Hz, l'ensemble de l'affichage serait rafraîchi
une fois toutes les 16 ms, et chaque chiffre serait illuminé pendant ¼ du cycle de rafraîchissement,
soit 4 ms. Le contrôleur doit piloter les cathodes avec le motif correct lorsque le signal d'anode
correspondant est piloté. Pour illustrer le processus, si AN0 est activé pendant que CB et CC sont
activés, alors un "1" sera affiché dans la position du chiffre 1. Ensuite, si AN1 est activé pendant que
CA, CB et CC sont activés, alors un "7" sera affiché dans la position du chiffre 2. Si AN0 et CB, CC
sont activés pendant 4 ms, et ensuite A1 et CA, CB, CC sont activés pendant 4 ms dans une
succession sans fin, l'affichage affichera "17" dans les deux premiers chiffres. Un exemple de
chronogramme pour un contrôleur à quatre chiffres est fourni.
Pour notre cas on veut afficher de 0 à 9 , par des switches pour le premier afficheur et par un
compteur interne sur le deuxième afficheur.
Les etapes que nous avons suivi pour la réalisation du programme été comme suite :

premierement rédaction d’un code permettant le rafraîchissement à 1khz et basculement des


afficheurs avec association des valeurs a la variable qui commande l’afficheur:
vu que durant la simulation on a rencontré des problemes en associant que deux valeurs a BCD
nous avons decidé de mettre 12switches en remplacant les quatres qui reste par un vecteur qui serai
image de la valeur du compteur

--init des afficheurs--

process (clk)
begin
if rising_edge(clk) then
refresh_coMPT <= refresh_coMPT + 1;
if refresh_coMPT = 1000 then
refresh_coMPT <= 0;
if digit_count = 4 then
digit_count <= 0;
else
digit_count <= digit_count + 1 ;

case digit_count is
when 0 =>
digit <= "1110";
bcd <= sw(15 downto 12);
when 1 =>
digit <= "1101";
BCD <= s;
when 2 =>
digit <= "1011";
bcd <= sw(6 downto 4);
when 3 =>
digit <= "0111";
bcd <= sw(3 downto 0);
when others =>
digit <= "1111";
end case;
end if;
end if;
end if;
end process;
par la suite nous avons rediger la description du code du compteur

--compteur--

process(clk_com,reset_com)
begin
if reset_com ='1' then iNcompt <= 0;
elsif rising_edge(clk_com) then
if incompt = 9 THEN iNcompt <= 0;
else iNcompt <= iNcompt +1;
end if;
end if;
end process;
---compteur
process (incompt)
begin
if incompt = 0 THEN s <= "0000";
ELSif incompt = 1 THEN s <= "0001";
elsif incompt = 2 THEN s <= "0010";
elsif incompt = 3 THEN s <= "0011";
elsif incompt = 4 THEN s <= "0100";
elsif incompt = 5 THEN s <= "0101";
elsif incompt = 6 THEN s <= "0110";
elsif incompt = 7 THEN s <= "0111";
elsif incompt = 8 THEN s <= "1000";
ELSE s <= "1001";
END IF;
end process;

Et pour finire un programme pour asociation du signal de commande aux afficheurs


--BCD--
process (BCD)
begin
case bcd is
when "0000" =>
SevenSegment <= "0000001"; ---0
when "0001" =>
SevenSegment <= "1001111"; ---1
when "0010" =>
SevenSegment <= "0010010"; ---2
when "0011" =>
SevenSegment <= "0000110"; ---3
when "0100" =>
SevenSegment <= "1001100"; ---4
when "0101" =>
SevenSegment <= "0100100"; ---5
when "0110"=>
SevenSegment <= "0100000"; ---6
when "0111" =>
SevenSegment <= "0001111"; ---7
when "1000" =>
SevenSegment <= "0000000"; ---8
when "1001" =>
SevenSegment <= "0000100"; ---9
when others =>
SevenSegment <= "1111111"; ---null
end case;
end process;

Structure du programme final

library ieee;
use ieee.std_logic_1164.ALL;
USE IEEE.std_logic_unsigned.all;
USE IEEE.numeric_std.all;

entity bcd is
Port (Clk : in STD_LOGIC;
 Résultats de la simulation de la fusion des programmes afficheur-compteur.

Dans la simulation :
Nous avons affecter une horloge de 1us pour l’horloge gérant le rafraichissement des afficheurs , et
pour celle du compteur 5ms
Sur l’illustration :
SW : représente les switches .
S : sortie du compteur .
Digit : sélectionneur des afficheurs.
Seven segment : L’affichage du résultat sur les afficheurs .
Conclusion :
En conclusion, la réalisation de ces trois programmes pour la carte Nexys3 démontre l'application
concrète des concepts théoriques en électronique numérique et en programmation embarquée.
L'afficheur et le compteur à sept segments sont des composants fondamentaux dans de nombreux
systèmes embarqués, offrant une interface utilisateur intuitive et permettant de suivre des données en
temps réel.

De plus, en ajoutant un troisième code pour la fusion et l'affichage des deux programmes sur deux
afficheurs différents de la même carte, nous avons enrichi notre projet en démontrant la capacité de
contrôler plusieurs périphériques simultanément. Cette capacité est cruciale dans de nombreuses
applications où la visualisation de multiples ensembles de données est nécessaire pour une prise de
décision efficace et rapide.

À travers ce projet, nous avons acquis une compréhension plus approfondie de la manière dont les
périphériques d'affichage et les compteurs peuvent être contrôlés et intégrés dans des systèmes
électroniques. Ces compétences sont précieuses dans de nombreux domaines, notamment
l'automatisation, la domotique, les technologies de l'information et bien d'autres encore.

En continuant à explorer et à expérimenter avec des cartes de développement telles que la Nexys3,
nous sommes en mesure d'approfondir notre expertise en conception de circuits intégrés et en
développement de logiciels embarqués, ouvrant ainsi la voie à de nouvelles innovations et
applications dans le domaine de l'électronique et de l'informatique.

Vous aimerez peut-être aussi