0% ont trouvé ce document utile (0 vote)
49 vues14 pages

UAL VHDL avec Affichage LCD et 7 Segments

rapport circuit

Transféré par

hafsalamrabat
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
49 vues14 pages

UAL VHDL avec Affichage LCD et 7 Segments

rapport circuit

Transféré par

hafsalamrabat
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

RAPPORT DE CIRUIT PROGRAMMABLE

Réalisation d’une UAL avec le logiciel QUARTUS II

Réalisé par :
- Hafsa LAMRABAT n° 18
- Aya ZOUIRE n° 28
- Hajar DRISSI n° 8
- Mohamed BOUTAHRI n° 7

Encadré par :
- Pr .Yassine ELAAFOU

Année universitaire :
- 2024 / 2025

GESI II

0
Introduction :
Ce rapport présente la réalisation d'une unité arithmétique et logique sur Quartus Altera, associée à un
afficheur à sept segments et une LCD pour afficher les résultats des opérations. L'unité arithmétique et logique,
capable d'effectuer des opérations de base telles que l'addition et la soustraction et les opérations logiques. Nous
détaillons les étapes de conception, la modélisation de ces opérations et l'interface avec l'afficheur à sept
segments. Enfin, les résultats de la simulation et de l'implémentation sur FPGA sont analysés pour valider
l'ensemble du système.

I. Réalisation d’une unité arithmétique et logique et affichage par LEDs :


- D’abord on choisit Cylone II et nom de la carte FPGA EP2C35672C6

- On commence par créer nouveau projet sur le logiciel Quartus Altera , puis on intègre le code VHDL
Apres avoir enregistré le code on l’a compilé .
- On clique après sur Pin planner dans lequel on a fait entré les données , pour chaque entrée et sortie du
code , on a attribué une LED .

1
- Enfin on a validé les résultats du code sur le Kit alter, en obtenant les résultats compatibles .

Pour les entrées on a choisit les Pins suivants :

A[1] → Pin L4 , A[0] → Pin L5 , B[1] → Pin L8 , B[0] → Pin L7 , op[2] → Pin AB25 , op[1] → Pin AB26,
op[0] → Pin AA23

Pour les sorties on a choisit les Pins suivants :

result[1] → PinAK5 , result[0] → Pin AJ6 , Zero → PinAC13

▪ Le code utilisé :
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL; -- Utilisation de la bibliothèque standard

entity UAL is
Port (
A : in STD_LOGIC_VECTOR(1 downto 0); -- Entrée A (2 bits)
B : in STD_LOGIC_VECTOR(1 downto 0); -- Entrée B (2 bits)

2
SEL : in STD_LOGIC_VECTOR(2 downto 0); -- Signal de sélection (3 bits)
CLK : in STD_LOGIC; -- Horloge pour les bascules D
Y : out STD_LOGIC_VECTOR(3 downto 0) -- Résultat (4 bits pour gérer le débordement)
);
end UAL;

architecture Behavioral of UAL is


signal Temp : STD_LOGIC_VECTOR(3 downto 0); -- Signal temporaire pour le résultat
begin
-- Processus combinatoire pour les opérations
process(A, B, SEL)
begin
case SEL is
-- Addition
when "000" =>
Temp <= std_logic_vector(resize(unsigned(A) + unsigned(B), 4));

-- Soustraction
when "001" =>
Temp <= std_logic_vector(resize(unsigned(A) - unsigned(B), 4));

-- Multiplication
when "010" =>
Temp <= std_logic_vector(resize(unsigned(A) * unsigned(B), 4));

-- Complément de A (NOT A)
when "011" =>
Temp <= std_logic_vector(resize(not unsigned(A), 4));

-- NAND (A NAND B)
when "100" =>
Temp <= std_logic_vector(resize(not (unsigned(A) and unsigned(B)), 4));

-- XNOR (A XNOR B)
when "101" =>
Temp <= std_logic_vector(resize(not (unsigned(A) xor unsigned(B)), 4));

-- AND (A AND B)
when "110" =>
Temp <= std_logic_vector(resize(unsigned(A) and unsigned(B), 4));

-- OR (A OR B)
when "111" =>
Temp <= std_logic_vector(resize(unsigned(A) or unsigned(B), 4));

3
-- Par défaut : sortie à 0
when others =>
Temp <= (others => '0');
end case;
end process;

-- Processus synchrone pour la bascule D


process(CLK)
begin
if rising_edge(CLK) then
Y <= Temp; -- Stocker le résultat à chaque front montant de l'horloge
end if;
end process;
end Behavioral;
▪ Résultat obtenus
Lorsque on met “op” a op[0] = 0 , op[ 1] = 0 , op[2] = 0 , et les entrées A et B a A[0] = 0 et A[ 1] = 0 et
B[0] = 0 et B[ 1] = 1
L’addition s’est effectuée et on a obtenu comme resultat [0] = 0 et resultat [ 1] = 1 alors oLEDR[ 1] va
s’allumer et ainsi de suite .

4
II. Affichage de l’UAL sur l’afficheur 7 segments :
Dans cette partie on va réaliser l’unité arithmétique et logique avec le code VHDL de sorte que les résultats
s’affichent sur l’afficheur 7 segments de la carte FPGA.
➔ Le code VHDL :

Library IEEE;
use ieee_std_logic_1164.all;
use ieee_numeric_std.all;
Entity UAL
Port (A, B: in std_logic_vector (2 downto 0);
op: in std_logic_vector (2 downto 0),
result: buffer std_logic_vector (2 downto 0); -- entree et sortie a la fois
Zero: out std_logic;
Segments: out std_logic_vector (6 downto 0));
end UAL;
Architecture Behavioral of UAL is
function to_7seg ( input: std_logic_vector (2 downto 0)
return std_logic_vector is
Begin
case input is
when "000" => return "1111110 ";
when "001" => return "0110000";
when: "010" => return "1101101";
when "011"=> return "1111001";
when "100" => return "0110011";
when "101"=> return "1011011";
when "110" => return "1011111";
when "111" => return "1110000";
when others => return "0000000";
end case;
end function;

5
begin
process (A, B, op)
variable temp_result: unsigned (2 downto 0);
begin
case op is
when "000" => temp_result <= unsigned (A) + unsigned (B);
result <= std_logic_vector (temp_result);
when" 001" => result <= A and B;
when "010" => result <= A or B;
when "011" => tamp_result <= unsigned(A) - unsigned (B);
result = std_logic_vector (temp-result);
when others => temp_result <= unsigned (A) + unsigned (B);
result <= std_logic-_vector (temp_result);
end case,
if result <= "000" then zero='1';
else zero <= '0';
end if;
segments <= to_7seg (result);
end process;
end Behavioral;

➔ Association des pins pour connecter le code dans Quartus avec la carte Alter :
- Pour les entrées on a choisi les pins suivants :
A[2] → Pin_AC27, A[1] → Pin_L4 , A[0] → Pin_L5 , B[2] → Pin_T9, B[1] → Pin_L8 , B[0] →
Pin_L7 , op[2] → Pin_ AB25 , op[1] → Pin_AB26, op[0] → Pin_AA23, result[2]
- Pour les sorties on a choisi les Pins suivants :
segments[6] → Pin_AD12 , segments[5] → Pin_AD11 , segments[4] → Pin_AF10, segments[3] →
Pin_AD10, segments[2] → Pin_AH9, segments[1] → Pin_AF9, segments[0] → Pin_AE8, Zero → PinAC13
-

6
III. Intégration de l’unité arithmétique et logique ave LCD
➢ Description générale de LCD

Un circuit programmable LCD (Liquid Crystal Display) est un circuit électronique conçu pour contrôler et
afficher des informations sur un écran LCD. Cela peut être décrit comme un circuit programmable pour écran
LCD.

Un tel circuit permet de :

• Contrôler les segments d’un écran LCD.


• Programmer différents modes d’affichage.
• Gérer des fonctions comme l’intensité, le contraste, et les animations.
• Communiquer avec des microcontrôleurs ou des microprocesseurs via des protocoles comme I²C, SPI
ou UART.

➢ Composants typiques :

1. Écran LCD : Un écran à cristaux liquides qui affiche des données visuelles.
2. Microcontrôleur : Gère la logique et envoie les signaux nécessaires à l’écran.
3. Pilote LCD : Une puce dédiée pour interfacer le microcontrôleur avec l’écran LCD.
4. Alimentation : Fournit l'énergie nécessaire pour le fonctionnement du circuit.
5. Interfaces programmables : Permettent d'envoyer des instructions (par exemple, programmation via
Arduino, Raspberry Pi, etc.).

➢ Utilisation typique :

• Montres numériques et horloges.


• Afficheurs dans les appareils électroménagers.
• Panneaux de contrôle pour l'électronique industrielle.
• Projets de développement DIY.

➔ Intégrer une unité arithmétique et logique (UAL) avec un LCD pour afficher les résultats des
opérations peut être réalisé en combinant une conception VHDL pour l'UAL et une interface pour
contrôler l'affichage LCD. Voici un guide pour y parvenir.

7
➢ Étapes principales

1. UAL (Unité Arithmétique et Logique) :


o Créez une unité en VHDL capable d'effectuer des opérations de base (addition, soustraction,
AND, OR, etc.).
o L'UAL aura des entrées pour les opérandes et une sortie pour le résultat.
2. Interface LCD :
o Configurez une interface en VHDL pour communiquer avec un écran LCD (généralement en
mode 4 bits ou I2C).
o Envoyez les données calculées par l'UAL vers l'écran pour les afficher.
3. Top-level (Intégration) :
o Connectez l'UAL et l'interface LCD dans un module principal.
o Ajoutez une logique pour sélectionner les opérations et afficher le résultat sur le LCD.

➢ Code VHDL
1. UAL (Unité Arithmétique et Logique) :

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.NUMERIC_STD.ALL;

entity UAL_2bits is

Port (

A : in STD_LOGIC_VECTOR(1 downto 0); -- Opérande A

B : in STD_LOGIC_VECTOR(1 downto 0); -- Opérande B

Op : in STD_LOGIC_VECTOR(1 downto 0); -- Code de l'opération : 00=Add, 01=AND,


10=OR

Result : out STD_LOGIC_VECTOR(1 downto 0) -- Résultat de l'opération

);

end UAL_2bits;

8
architecture Behavioral of UAL_2bits is

begin

process (A, B, Op)

begin

case Op is

when "00" => Result <= std_logic_vector(unsigned(A) + unsigned(B)); -- Addition

when "01" => Result <= A and B; -- AND

when "10" => Result <= A or B; -- OR

when others => Result <= (others => '0'); -- Valeur par défaut

end case;

end process;

end Behavioral;

2. Interface LCD simplifiée

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

entity LCD_Interface_2bits is

Port (

clk : in STD_LOGIC; -- Horloge

reset : in STD_LOGIC; -- Réinitialisation

data : in STD_LOGIC_VECTOR(1 downto 0); -- Données à afficher (2 bits)

lcd_rs : out STD_LOGIC; -- Signal Register Select

lcd_rw : out STD_LOGIC; -- Lecture/Écriture (0 = Écriture)

lcd_e : out STD_LOGIC; -- Signal Enable

lcd_data : out STD_LOGIC_VECTOR(3 downto 0) -- Données en mode 4 bits

9
);

end LCD_Interface_2bits;

architecture Behavioral of LCD_Interface_2bits is

signal init_done : STD_LOGIC := '0'; -- Indique si le LCD est initialisé

signal current_state : STD_LOGIC_VECTOR(3 downto 0); -- État du FSM pour l'envoi

begin

process (clk, reset)

begin

if reset = '1' then

init_done <= '0';

current_state <= (others => '0');

elsif rising_edge(clk) then

if init_done = '0' then

-- Logique d'initialisation du LCD (à compléter selon datasheet)

init_done <= '1'; -- Initialisation terminée

else

-- Convertir les 2 bits en une forme lisible pour le LCD

case data is

when "00" => lcd_data <= "0000"; -- Affiche 0

when "01" => lcd_data <= "0001"; -- Affiche 1

when "10" => lcd_data <= "0010"; -- Affiche 2

when "11" => lcd_data <= "0011"; -- Affiche 3

when others => lcd_data <= "1111"; -- Valeur par défaut

end case;

lcd_rs <= '1'; -- Envoi de données

10
lcd_rw <= '0'; -- Écriture

lcd_e <= '1'; -- Pulse Enable (à gérer dans le temps réel)

end if;

end if;

end process;

end Behavioral;

3. Intégration (Top-Level Module)


library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

entity UAL_LCD_System_2bits is

Port (

clk : in STD_LOGIC;

reset : in STD_LOGIC;

A : in STD_LOGIC_VECTOR(1 downto 0); -- Opérande A

B : in STD_LOGIC_VECTOR(1 downto 0); -- Opérande B

Op : in STD_LOGIC_VECTOR(1 downto 0); -- Opération

lcd_rs : out STD_LOGIC; -- LCD Register Select

lcd_rw : out STD_LOGIC; -- LCD Read/Write

lcd_e : out STD_LOGIC; -- LCD Enable

lcd_data : out STD_LOGIC_VECTOR(3 downto 0) -- LCD Data

);

end UAL_LCD_System_2bits;

architecture Structural of UAL_LCD_System_2bits is

11
signal result : STD_LOGIC_VECTOR(1 downto 0); -- Résultat de l'UAL

begin

-- Instanciation de l'UAL

UAL_inst : entity work.UAL_2bits

port map (

A => A,

B => B,

Op => Op,

Result => result

);

-- Instanciation de l'interface LCD

LCD_Interface_inst : entity work.LCD_Interface_2bits

port map (

clk => clk,

reset => reset,

data => result, -- Envoi du résultat au LCD

lcd_rs => lcd_rs,

lcd_rw => lcd_rw,

lcd_e => lcd_e,

lcd_data => lcd_data

);

end Structural;

➔ Interprétation :

Le module principal intègre l'UAL et l'interface LCD :

• Les entrées A, B, et Op sont transmises à l'UAL pour le calcul.

12
• La sortie Result de l'UAL est connectée à l'entrée data de l'interface LCD.

Cela signifie que tout résultat produit par l'UAL sera automatiquement envoyé au LCD pour affichage.

Ce module gère la coordination de tout le système. Par exemple :

Si A = "11" (3 en décimal), B = "01" (1 en décimal), et Op = "01" (AND logique), le résultat sera "01" (1
en décimal), qui sera affiché sur le LCD.

➢ Conclusion

Au terme de ce projet, la conception et la réalisation d’une unité arithmétique et logique (UAL) sur un
circuit programmable ont permis de démontrer l’efficacité des FPGA dans le traitement et l’affichage de
résultats complexes. Les fonctionnalités implémentées, notamment l’exécution d’opérations arithmétiques et
logiques, ainsi que l’affichage des résultats sur des LED, un afficheur 7 segments, et un écran LCD, ont montré
la flexibilité et la polyvalence des circuits programmables.

13

Vous aimerez peut-être aussi