VHDL exercice 7 segments
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

VHDL exercice 7 segments



  1. #1
    invited5729797

    VHDL exercice 7 segments


    ------

    Bonjour à tout le monde !

    Je suis actuellement en train de faire un petit exercice de VHDL assez simple. Mais je bug sur certain points depuis un moment :/
    si quelqu'un aurait la gentillesse de m'aider sa serais super

    Voici les données

    L'affichage 7 segments de votre carte doit afficher le nombre (en décimal) entré en binaire sur les switches S5 (MSB) à S8(LSB).

    =>Si s1 est actif, l'affichage affiche un tiret.
    =>Si s2 est actif, l'affichage est éteint. s2 est prioritaire sur s1.


    Mon idée était la suivante :

    J'ai voulais mettre le tout dans un process. Après est'il possible de mettre mon switch select dans mon process ?

    je vous remercie d'avance =)

    --Déclaration des librairies--
    Library IEEE;
    use IEEE.Std_Logic_1164.all;


    --Déclaration des entrées et sorties--
    entity EX is
    port(s1,s2,s5,s6,s7,s8: in std_logic;
    a,b,c,d,e,f,g : out std_logic);

    end EX;
    --------------------------------------


    --Déclaration des signaux--
    architecture EX_arch of EX is
    signal segments : Std_logic_vector (7 downto 1);
    signal switch : std_logic_vector (4 downto 1);
    ---------------------------
    begin




    process(s1,s2, segments)
    begin
    if(s2 = '1' and (s1 = '1' or s1 = '0')) then--s2 prend la priorité sur s1
    segments <= "1111111";
    elsif(s1 = '1' and s2 = '0') then--s1 actif si s2 = 0
    segments <= "1111110";
    else


    end if;
    end process;

    --gestions de segments en fonction de switch--
    with switch select

    segments <= "0000001" when "0000",
    "1001111" when "0001",
    "0010010" when "0010",
    "0000110" when "0011",
    "1001100" when "0100",
    "0100100" when "0101",
    "0100000" when "0110",
    "0001111" when "0111",
    "0000000" when "1000",
    "0000100" when "1001",
    "0001000" when "1010",
    "1100000" when "1011",
    "0110001" when "1100",
    "1000010" when "1101",
    "0110000" when "1110",
    "0111000" when "1111";


    --gestion des sorties--
    (a,b,c,d,e,f,g) <= segments;
    switch <= (s5,s6,s7,s8);


    end EX_Arch;

    -----

  2. #2
    Jack
    Modérateur

    Re : VHDL exercice 7 segments

    Il est pourtant clairement spécifié dans les règles participatives du forum info programmation que les problèmes de VHDL doivent être postés dans le forum électronique.

    http://forums.futura-sciences.com/pr...ves-forum.html

  3. #3
    jiherve

    Re : VHDL exercice 7 segments

    Bonsoir,
    on va faire çà par étapes:
    Code:
    process(s1,s2, segments)
      begin
       -- if(s2 = '1' and (s1 = '1' or s1 = '0')) then--s2 prend la priorité sur s1
       if(s2 = '1') then  
          segments <= "1111111";
       --elsif(s1 = '1' and s2 = '0') then--s1 actif si s2 = 0
       elsif(s1 = '1' ) then--s1 actif si s2 = 0
        segments <= "1111110";
       else
    
    
    end if;
    end process;
    as tu compris ?
    JR
    l'électronique c'est pas du vaudou!

  4. #4
    invited5729797

    Re : VHDL exercice 7 segments

    Bonsoir,

    Merci pour la réponse.

    En fait, j'avais commencer avec ta solution. Mais dans ce cas là, la condition quand S1 = '1' et S2 = '1' n'est pas gérée non. ?Vu que S2 doit prendre la priorité et éteindre l'affichage.
    Est'il possible,de mettre mon switch select. Dans la condition else dans mon process ?

    Je voudrais pouvoir, afficher avec mon switch (S5 à S8) donc 4 bits. Les valeurs de 0 à 15 en héxa (0 à F). Uniquement quand S1 et S2 = '0'. Je pensais, faire un switch select en fonction de (S5 à S8).Pour afficher mes différente valeurs sur mon afficheur.

    Et si s1 = '1' l'afficheur affiche un tiret.
    Et si s2 = '1' l'afficheur est éteint.
    Et si s1 et s2 = '0' alors là, il affiche les valeurs obtenues en fonction du switch (S5 à S8)


    Merci bien de l'aide ^^

  5. A voir en vidéo sur Futura
  6. #5
    jiherve

    Re : VHDL exercice 7 segments

    Bonsoir,
    lorsque l'on écrit une séquence if ,elsif, else il y a une priorité implicite qui fait que le elsif n'est pris en compte que si la condition du if est fausse, de même le else ne sera pris en compte que si le if et le elsif sont faux tous les deux.
    ensuite bien que le VHDL autorise les affectations concurrentes il faut que le décodage du "switch " soit fait dans le process au moyen d'un CASE et pas d'un Switch, un CASE se termine toujours par un "when others" qui capture à la fois le dernier cas explicite du choix mais aussi tous ceux auxquels on ne pense pas le VHDL autorisant 9 etats possible pour un std_logic (H,L,X etc etc) , par ailleurs une concaténation s'effectue avec le signe "&" et n'est possible que dans un sens.
    le code avec les bons commentaires
    Code:
    --Déclaration des librairies--
    Library IEEE;
    use IEEE.Std_Logic_1164.all;
    
    
    --Déclaration des entrées et sorties--
    entity EX is
    port(s1,s2,s5,s6,s7,s8: in std_logic;
    a,b,c,d,e,f,g : out std_logic);
    
    end EX;
    --------------------------------------
    
    
    --Déclaration des signaux--
    architecture EX_arch of EX is
    
    
    ---------------------------
    begin
    
    process(s1,s2,s5,s6,s7,s8)
      variable switch : std_logic_vector (3 downto 0);
      variable segments : std_logic_vector (6 downto 0);
      begin
       if(s2 = '1') then  -- si s2 = 1 quelque soit la valeur de s1
          segments := "1111111";
       elsif(s1 = '1' ) then-- si s1 =1 et s2 = 0
         segments := "1111110";
       else -- si  s1 = 0 et s2 = 0
          switch := (s5 & s6 & s7 & s8);-- ici on lit les signaux d'entrée de l'entité
          case switch is
            when "0000" =>
              segments := "0000001";
            when "0001" =>
              segments := "1001111";
            when "0010" =>
              segments := "0010010";
            when "0011" =>
              segments := "0000110";
            when "0100" =>
              segments := "1001100";
            when "0101" =>
              segments := "0100100";
            when "0110" =>
              segments := "0100000";
            when "0111" =>
              segments := "0001111";
            when "1000" =>
              segments := "0000000";
            when "1001" =>
              segments := "0000100";
            when "1010" =>
              segments := "0001000";
            when "1011" =>
              segments := "1100000";
            when "1100" =>
              segments := "0110001";
            when "1101" =>
              segments := "1000010";
            when "1110" =>
              segments := "0100000";
            when others => -- "1111" 
              segments := "0111000";
          end case;
        end if;
        -- affectations des sorties de l'entité
        a <= segments(6);
        b <= segments(5);
        c <= segments(4);
        d <= segments(3);
        e <= segments(2);
        f <= segments(1);
        g <= segments(0);
    
     
    end process;
    
    end;
    utilise Notepad++ pour écrire ton code et respecte les indentations(ne pas utiliser de tabulation mais des espaces) cela sera plus lisible
    si tu as des questions je reste à l'écoute

    JR
    Dernière modification par jiherve ; 01/11/2014 à 20h42.
    l'électronique c'est pas du vaudou!

  7. #6
    invited5729797

    Re : VHDL exercice 7 segments

    Re bonsoir

    Merci beaucoup pour le coup de main. Sa marche bien, et désoler pour la présentation. J'utilise notepad et ensuite je fais print screen du code ?
    Juste une dernière question, dans le process pourquoi, je n'ai pas besoin de mettre la variable segments ?

    Par contre, j'utilise quartus d'Altera pour la programmation. Et il n'accepte pas la forme d'écriture ":=" j'utilise "=>"je ne sais pas trop pourquoi.

    Le case et très semblable au switch non ?

    Bonne soirée

  8. #7
    jiherve

    Re : VHDL exercice 7 segments

    Bonsoir,
    cela compile très bien sous quartus!!!
    Si tu doit écrire <= c'est que tu n as pas gardé mon code car "segment" est déclaré comme une variable et pas comme un signal et c'est pour çà que "segment" n'est pas dans la liste de sensibilité du process.
    CASE est beaucoup plus puissant que Switch.
    pour publier du code : "aller en mode avancé" puis balise "code" (le #) et un classique ctrl C, ctrl V entre les balises
    JR
    l'électronique c'est pas du vaudou!

  9. #8
    stefjm

    Re : VHDL exercice 7 segments

    Bonjour,
    C'est purement combinatoire, du coup, je ne vois pas l'intérêt d'une description séquentielle par process.
    Une bête affectation conditionnelle suffit . <= ... when (...) else...
    Non?
    Je rate un truc?
    Moi ignare et moi pas comprendre langage avec «hasard», «réalité» et «existe».

  10. #9
    jiherve

    Re : VHDL exercice 7 segments

    Bonjour,
    Ici le process est, comme tout process, implicitement séquentiel mais au final cela ne se traduit que par du combinatoire, entre l'entrée et la sortie il n'y a qu'un delta.
    On pourrait effectivement l'écrire de façon différente mais cela sera beaucoup plus lourd et à mon avis moins clair, une unique séquence when .. else serait illisible, bien sur on pourrait jouer avec la concurrence en parallélisant des séquences de ce type, il faudra alors faire très attention à l'ordre d’écriture, the last to talk win.
    JR
    l'électronique c'est pas du vaudou!

  11. #10
    stefjm

    Re : VHDL exercice 7 segments

    Citation Envoyé par jiherve Voir le message
    Bonjour,
    Ici le process est, comme tout process, implicitement séquentiel mais au final cela ne se traduit que par du combinatoire, entre l'entrée et la sortie il n'y a qu'un delta.
    On pourrait effectivement l'écrire de façon différente mais cela sera beaucoup plus lourd et à mon avis moins clair, une unique séquence when .. else serait illisible, bien sur on pourrait jouer avec la concurrence en parallélisant des séquences de ce type, il faudra alors faire très attention à l'ordre d’écriture, the last to talk win.
    JR
    Ouf, c'est bien ce qu'il me semblait!
    Par contre, je ne vois pas trop pourquoi la séquence "when else" serait plus illisible que la séquence "case when" : les informations sont les mêmes et la mise en forme du code aussi...
    Moi ignare et moi pas comprendre langage avec «hasard», «réalité» et «existe».

  12. #11
    jiherve

    Re : VHDL exercice 7 segments

    Re
    le début :
    segments <= "1111111" when (s2 = '1') else "1111110" when (s1 = '1') else "0000001" when (switch ="0000") else "1001111" (when switch ="0001")else "0010010" when (switch ="0010") else "0000110" when (switch ="0011") else....
    Cela fait bien sur exactement la même chose mais c'est moins joli à mon gout, l'emballage dans un process aide à la structuration du code.
    JR
    l'électronique c'est pas du vaudou!

  13. #12
    stefjm

    Re : VHDL exercice 7 segments

    On peut l'écrire joli :
    Code:
    segments  <=  "1111111" when (s2 = '1') 
             else "1111110" when (s1 =  '1') 
             else "0000001" when (switch = "0000")
             else "1001111" when (switch  = "0001")
             else "0010010" when (switch = "0010")
             else "0000110" when (switch =" 0011") 
             else....;
    Moi ignare et moi pas comprendre langage avec «hasard», «réalité» et «existe».

  14. #13
    jiherve

    Re : VHDL exercice 7 segments

    Re
    tu as gagné !
    JR
    l'électronique c'est pas du vaudou!

  15. #14
    invited5729797

    Re : VHDL exercice 7 segments

    Hello,

    En faite, j'ai l'habitude de tout mettre dans un process. On devait faire un exercice avec un compteur. Du coup quand il y a pas de clock, je n'ai pas besoin de mettre dans un process ?

    Le when else est propre et simple en faite =).

    MC

  16. #15
    stefjm

    Re : VHDL exercice 7 segments

    Bonjour,
    La description par process est séquentielle, et on peut décrire séquentiellement une fonction combinatoire.
    A priori, si le process est bien écrit, les deux descriptions donnent exactement le même résultat.
    jiherve complétera si besoin.
    Cordialement.
    Moi ignare et moi pas comprendre langage avec «hasard», «réalité» et «existe».

Discussions similaires

  1. commande d'ascenseur avec VHDL la carte vhdl
    Par invite2b1f3b55 dans le forum Électronique
    Réponses: 6
    Dernier message: 02/06/2014, 03h41
  2. Segments LCD
    Par gcortex dans le forum Électronique
    Réponses: 5
    Dernier message: 01/10/2013, 17h45
  3. LCD 7 segments
    Par invited99eaf40 dans le forum Électronique
    Réponses: 3
    Dernier message: 09/02/2010, 23h11
  4. Câblage Afficheur 7 segments sur 8051 via un décodeur BCD 7 Segments
    Par invite79668502 dans le forum Électronique
    Réponses: 5
    Dernier message: 24/09/2009, 20h53
  5. Point flottant en VHDL et vhdl-200x
    Par invite6eee6b27 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 02/09/2008, 20h47
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...