Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

Projet en Vhdl: Addition de vecteur en binaire



  1. #1
    Myda

    Projet en Vhdl: Addition de vecteur en binaire


    ------

    Bonjour a tous,
    Je suis étudiant et dans le cadre d'un cours d’Électronique numérique, je suis amené a réaliser un projet en Vhdl pour ensuite mettre çà sur Cpld et faire le montage. Mon projet concerne un jeu de blackjack avec deux joueurs qui jouent l'un contre l'autre.
    Quand je simule, mon code tourne mais ne fais pas ce que j’attends de lui..
    J'ai un compteur, et une série de bouton poussoir pour que le joueur demande un carte, passe, ou reset.
    Quand lance mon programme et que je le simule dans active-HDl, je demande une carte pour mon premier joueur, celui ci en reçoit une et puis plus rien ne se passe.
    Ce qui est bizarre, c'est que la carte que mon joueur reçoit est censée être la valeur du compteur, or quand celle ci est a 2 mon joueur reçoit 17.. De plus mon jeu est censer s’arrêter lorsque le joueur dépasse 21, or ici il s'arette alors qu'il a 17...
    Je me suis dit que c'était peut-être dans l'addition de mes vecteurs (joueur_1<=joueur_1+S_cnt) ou je ne sais quoi..
    Si jamais quelqu'un aurait une solution, je le remercie mille fois d'avance
    Je vous met mon code en dessous..
    SI j'amais je me suis tromper de section dans le forum, je m'excuse..

    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_arith.all;
    use ieee.std_logic_unsigned.all;
    use ieee.numeric_std.all ;
    Entity BJ is port(

    CLK, B1_start, B2_start,B1_end, B2_end, clear: in std_logic ;
    J1,J2ut std_logic_vector ( 4 downto 0 )
    );
    end BJ;

    Architecture Arch_BJ of BJ is
    -- attributions des pins selon SYNPLIFY sous ispLEVER

    signal etat_joueur,y,x,B1_stop,B2_sto p :std_logic;
    signal S_CNT:std_logic_vector(4 downto 0);
    signal joueur_1,joueur_2:std_logic_ve ctor(4 downto 0);

    -- process Counter
    begin

    process(CLK) begin
    if CLK'event and CLK='1' then
    if S_CNT < "01011" then-- compte de 0 à 11 seulement
    S_CNT <= S_CNT +1;

    else S_CNT <= "00000";
    end if;
    end if;
    end process;

    process (etat_joueur,B1_stop,B1_start, Joueur_2,B2_stop,joueur_1,B2_s tart,S_CNT,clear) begin
    if clear='1' then
    etat_joueur<='0';
    y<='0';
    x<='0';
    B1_stop<='0';
    B2_stop<='0';
    Joueur_1<= "00000" ;
    Joueur_2<= "00000" ;
    J1<= "00000" ;
    J2<= "00000" ;
    end if;

    if B1_end='1' then
    B1_stop<='1';
    end if;

    if B2_end='1' then
    B2_stop<='1';
    end if;

    if etat_joueur = '0' and B1_stop = '0' then
    if B1_start='1' then
    Joueur_1 <= Joueur_1 + S_CNT;
    end if;

    if Joueur_1 > "10101" then
    B1_stop<='1';
    B2_stop<='1';
    x<='1'; ---J2 gagne
    end if;

    if B1_stop ='1'and x='0' then
    etat_joueur<='1';
    end if;
    end if;

    if etat_joueur = '1' and B2_stop = '0' then
    if B2_start='1' then
    Joueur_2<=Joueur_2 + S_CNT;
    end if;

    if Joueur_2> "10101" then
    ---J1 gagne
    B1_stop<='1';
    B2_stop<='1';
    y<='1';
    end if;


    end if;
    end process;
    end arch_BJ ;

    Merci beaucoup

    -----

  2. Publicité
  3. #2
    jiherve

    Re : Projet en Vhdl: Addition de vecteur en binaire

    Bonsoir,
    en fait ton truc c'est un peu une machine à tirer le loto.
    Tu mélanges allégrement des signaux synchrones et asynchrones lesquels ne sont donc ni resynchronisés ni doté d'antirebond s'il s'agit de boutons poussoir.
    Par ailleurs tu recoures massivement à des affectation concurrentes, rien ne l'interdit mais il faut bien savoir ce que l'on fait.
    çà cela devrait fonctionner un peu mieu si tu rajoutes des anti rebond sur les boutons:
    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all ;-- contente toi de ces deux librairie cela évitera bien des surprises
    Entity BJ is port(
    
    CLK, B1_start, B2_start,B1_end, B2_end, clear: in std_logic ;
    J1,J2 : out std_logic_vector ( 4 downto 0 )
    );
    end BJ;
    
    Architecture Arch_BJ of BJ is
    -- attributions des pins selon SYNPLIFY sous ispLEVER
    
    signal etat_joueur:std_logic;
    signal S_CNT:std_logic_vector(4 downto 0);
    signal joueur_1,joueur_2:std_logic_vector(4 downto 0);
    
    -- process Counter
    begin
    
    process(CLK, clear) 
    begin
      variable y,x,B1_stop,B2_stop :std_logic;-- pour ne pas se payer de delta
      if clear ='1' then -- toujours tout initialiser
        etat_joueur <='0';
        y           :='0';
        x           :='0';
        B1_stop     :='0';
        B2_stop     :='0';
        Joueur_1    <= (others => '0');
        Joueur_2    <= (others => '0');
        J1          <= (others => '0');
        J2          <= (others => '0');
        S_CNT       <= (others => '0');
      elsif CLK'event and CLK='1' then -- au moins le clear est prioritaire
      
        if (unsigned S_CNT) < 11 then-- compte de 0 à 11 seulement
          S_CNT <= std_logic_vector((unsigned S_CNT) +1);
        else 
          S_CNT <= (others => '0');
        end if;
        
        if B1_end ='1' then
          B1_stop :='1';
        elsif etat_joueur = '0' and B1_stop = '0' then
          if B1_start='1' then
            Joueur_1 <= std_logic_vector(unsigned(Joueur_1) + unsigned(S_CNT));
          end if;
    
          if unsigned(Joueur_1) > 21 then
            B1_stop :='1';
            B2_stop :='1';
            x       :='1'; ---J2 gagne
          end if;
    
          if B1_stop ='1'and x = '0' then
            etat_joueur<='1';
          end if;
        end if;
    
        if B2_end ='1' then
          B2_stop :='1';
        elsif etat_joueur = '1' and B2_stop = '0' then
          if B2_start='1' then
            Joueur_2 <=std_logic_vector(unsigned(Joueur_2) + unsigned(S_CNT));
          end if;
    
          if unsigned(Joueur_2) then
            ---J1 gagne
            B1_stop :='1';
            B2_stop :='1';
            y       :='1';
          end if;
       end if;
      end if;  
    end process;
    end arch_BJ ;
    tu noteras que c'est indenté cela aide à la lecture, utilise Notepad ++ pour éditer
    JR
    l'électronique c'est pas du vaudou!

  4. #3
    Myda

    Re : Projet en Vhdl: Addition de vecteur en binaire

    Bonsoir,
    Merci énormément à vous,
    je viens de le lancer et de modifier quelques points et le programme fait exactement ce que j’attends de lui.
    Je n'avais pas vu en cours qu'on pouvait utiliser des "variables" et nous n'avions pas manipulé tout ce qui est unsigned.. etc en VHDL.. Je me disais bien que tout était un peu mélangé entre synchrone et asynchrone, merci de m'avoir éclairé.
    Il ne me restera plus qu'à définir mes sorties pour des LED et des afficheurs 7 segments et mettre tout ca sur circuit
    Merci encore

  5. #4
    jiherve

    Re : Projet en Vhdl: Addition de vecteur en binaire

    Bonsoir,
    Merci pour le retour.
    En VHDL comme ailleurs "make it simple" , attention aux entrées asynchrones, en simulation cela semble fonctionner, mais dans la vraie vie cela m...e lamentablement, donc systématiquement, sans réfléchir,une paire de bascules pour resynchroniser,sans perdre de vue que deux signaux concomitants dans leur domaine temporel ne le seront plus après resynchronisation, il y aura un écart temporel de +- une période de l'horloge de resynchronisation.
    JR
    l'électronique c'est pas du vaudou!

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    Myda

    Re : Projet en Vhdl: Addition de vecteur en binaire

    Rebonsoir,
    J'aimerai poser une dernière petite question .

    J'ai un problème avec mes sorties, en effet j'ai des problème lorsque mes sorties sont utilisées dans mes conditions "if"..
    J'ai essayer de palier au problème pour "joueur_2" et "joueur_1" en créant deux nouvelles variables "J_1" et J_2" auquel je donne la valeur de "joueur_2" et "joueur_1". Premier problème, les valeurs ont une periode de retard..
    A la limite ca ne me dérange pas trop car Joueur_2 prend par exemple les valeurs suivantes: 21-28-4, or il devrait s'aretter a 21.. Mais comme ma sortie J_1 prend les valeurs 21-28, c'est correct.

    Mon autre soucis est que j'aimerai qu'une LED s'allume pour indiquer quel joueur à gagner..
    J'ai penser a directement mettre les valeurs J1_win et J2_win en sortie.. mais vu qu'elles apparaissent dans certaines conditoins, ca ne marche pas.. Y aurait-il une solution simple?
    Je met mon code en dessous ( j'ai fait avec notepad++, j’espère que cela marchera)


    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all ;-- contente toi de ces deux librairie cela évitera bien des surprises
    Entity BJ is 
    	port(
    
    	CLK:in std_logic ; 
    	B1_start:in std_logic ; -- Le joueur 1 demande une carte
    	B2_start:in std_logic ;	-- Le joueur 2 demande une carte
    	B1_end:in std_logic ; -- Le joueur 1 arrette de demander des cartes
    	B2_end:in std_logic ; -- Le joueur 2 arrette de demander des cartes
    	clear:in std_logic ;  -- Réinitialise toute les valeurs à 0
    	
    	J_1 : out std_logic_vector ( 4 downto 0 );
    	J_2 : out std_logic_vector ( 4 downto 0 );
    	J2_win: out std_logic;
    	J1_win: out std_logic
    	
    	); 
    	
    	
    	
    --attribute loc : string; --Attribution des pins
    	
    
    --attribute loc of B1_start: signal is "p19";
    
    --attribute loc of B1_end: signal is "p19";
    
    --attribute loc of B2_start: signal is "p19";
    
    --attribute loc of B2_end: signal is "p19";
    
    --attribute loc of clear: signal is "p19";
     	
    end BJ;
    
    Architecture Arch_BJ of BJ is
    
    signal etat_joueur:std_logic;
    signal S_CNT:std_logic_vector(4 downto 0);
    signal joueur_1:std_logic_vector(4 downto 0);
    signal joueur_2:std_logic_vector(4 downto 0);
    -- process BlackJack
    begin
    
    process(CLK, clear,B1_start, B2_start,B1_end, B2_end) 	  
    
    variable B1_stop, B2_stop:std_logic;
    begin
    	-- pour ne pas se payer de delta
      if clear ='1' then   -- Initialisation
        etat_joueur <='0';
        J1_win      <= '0';
        J2_win      <= '0';
        B1_stop     :='0';
        B2_stop     :='0';
        Joueur_1    <= (others => '0');
        Joueur_2    <= (others => '0');
        J_1         <= (others => '0');
        J_2         <= (others => '0');
        S_CNT       <= (others => '0');	 
      
      elsif CLK'event and CLK='1' then -- Le clear est prioritaire
      
        if (unsigned (S_CNT)) < 11 then-- compte de 0 à 11 seulement
          S_CNT <= std_logic_vector((unsigned (S_CNT)) +1);
        else 
          S_CNT <= (others => '0');
        end if;
        
       
        if etat_joueur = '0' and B1_stop = '0' then
          if B1_start='1' then
            Joueur_1 <= std_logic_vector(unsigned(Joueur_1) + unsigned(S_CNT));
    		J_1<=Joueur_1;
          end if;
    
          if (unsigned(Joueur_1)) > 21 then
            B1_stop :='1';
            B2_stop :='1';
            J2_win <='1'; ---J2 gagne
          end if;
    	  if B1_end ='1' then
          B1_stop :='1';
    	  end if;
          if B1_stop ='1'and J2_win = '0' then
            etat_joueur<='1';
          end if;
        end if;
       
       
        elsif etat_joueur = '1' and B2_stop = '0' then
          if B2_start='1' then
            Joueur_2 <=std_logic_vector(unsigned(Joueur_2) + unsigned(S_CNT));
    		J_2<=Joueur_2;
          end if;
    	  if B2_end ='1' then
          B2_stop :='1';	
    	  end if;
          if (unsigned(Joueur_2)) > 21 then
            ---J1 gagne
            B1_stop :='1';
            B2_stop :='1';
            J1_win  <='1';
          end if; 
    	  
       end if;
      
    end process;
    end arch_BJ ;

    Merci beaucoup..

    Bel effort, mais il faut utiliser des balises CODE et non pas QUOTE pour du code
    Dernière modification par Jack ; 17/05/2012 à 10h54. Motif: Remplacement balises QUOTE par balises CODE

  9. #6
    jiherve

    Re : Projet en Vhdl: Addition de vecteur en binaire

    Bonjour,
    deux solutions :
    une pas terrible mais simple :déclarer les sorties en inout;
    l'autre celle que tu as choisie qui est la bonne, pour éviter le retards, sorts j_1 et j_2 du process clocké et fait une affectation asynchrone en dehors.
    J_1<=Joueur_1;
    J_2<=Joueur_2;
    Pour les autres sorties du procède de la même façon en créant des signaux internes que tu envoies ensuite sur les ports.
    Pour la lisibilité il est d'usage(au moins dans ma boite) que si un port "out" porte le nom "NOM" alors le signal relais sera "nom_i"; Comme çà tout le monde comprend, les majuscules c'est le port les minuscules le signal interne, c'est important d'adopter un certain formalisme car avec des fichiers de plusieurs milliers de ligne on se perd vite.
    JR
    l'électronique c'est pas du vaudou!

  10. Publicité
  11. #7
    Myda

    Re : Projet en Vhdl: Addition de vecteur en binaire

    J'ai suivis vos conseils, quelques peu modifier aussi le code pour ne plus que mes variables joueur_1 et Joueur_2 ait un bon comportement une foi 21 dépassé, et cela marche en simulation. Il faudrait que je teste cela sur ma cpld des que le labo sera ouvert.
    Encore une foi merci pour votre aide
    J'ai lu sur le forum que pour lutter contre l'effet des rebond, une solution était de mettre une résistance en parallèle avec une résistance.
    J'avais aussi vu qu'une commande Delay_ms(xx) pouvait faire l'affaire.. Est ce que simplement mettre un Delay_ms apres les operations faisant intervenir un bouton poussoir dans mon code, est-il suffisant?

  12. #8
    jiherve

    Re : Projet en Vhdl: Addition de vecteur en binaire

    re
    pour les rebonds c'est plutôt une résistance et un condensateur, mais cela ne suffit généralement pas.
    les délais sont non synthètiables donc inutiles.
    Dans un FPGA le mieux est de faire un petit filtre numérique:
    Code:
    signal bouton_out : std_logic;
    signal filtre : std_logic_vector(4 downto 0);
    begin
    
    process(CLK, clear) begin
      if clear ='1' then
        bouton_out  <= '0';
        filtre      <= (others => '1');
      elsif CLK'event and CLK='1' then -- il faut une horloge au environs de 1khz
       -- un bete registre à decalage
      filtre <= ((filtre(3 dowto 0) &  bouton_in);-- bouton in c'est le fil qui vient du bouton repos à '1' passe à '0' lors de l’appui
      -- un vote majoritaire si 2 ou plus des bascules sont à 0 alors on dit que c'est bon
      case fitre (4 downto 2) is 
        when "000" | "001"| "010"|"100" =>
          bouton_out  <= '1'; 
        when others =>
          bouton_out  <= '0';
        end case;
      
      end if;  
    end process;
    Si tu n'as pas d'horloge BF divises ton horloge de base pour obtenir un signal qui jouera le role d'enable
    JR
    Dernière modification par jiherve ; 17/05/2012 à 17h56.
    l'électronique c'est pas du vaudou!

  13. #9
    Myda

    Re : Projet en Vhdl: Addition de vecteur en binaire

    Oui, je me suis trompé..
    Je suis un peu perdu la, je pensais qu'un délai était suffisant.. J'ai pas très bien compris comment fonctionne le filtre..
    Ce filtre doit s'implémenter pour chaque bouton poussoir..?
    Je suis désolé, c'est mon premier cours d'électronique et mis a part nous dire de nous débrouiller, je n'ai rien vu a propos des rebonds..

  14. #10
    jiherve

    Re : Projet en Vhdl: Addition de vecteur en binaire

    Re
    oui il en faut un par bouton.
    Le vote majoritaire c'est comme aux élections (d'où le nom) la majorité l'emporte, ici le "case" valide les cas ou l’état du bouton dit "appuyé".
    Les deux premières bascules servent à s’affranchir de la métastabilité qui est l’état ou toute bascule physique entre si l'on ne respecte pas le Tsetup ou le Thold, ce qui correspond à une fenêtre temporelle durant laquelle le fonctionnement de la bascule est indéterminé, 99% des fonctionnements erratiques des circuits logiques proviennent de l'ignorance de ce comportement.
    JR
    JR
    l'électronique c'est pas du vaudou!

  15. #11
    Myda

    Re : Projet en Vhdl: Addition de vecteur en binaire

    Re,
    Donc si je comprend bien le raisonnement, Bouton_in serait par exemple mon B1_start ( la valeur de mon bouton poussoir), et Bouton_out serait la valeur filtrée de mon bouton poussoir. Donc dans la suite de mon code je devrait utiliser Bouton_out..
    Je dois donc rajouter des process pour chaque bouton poussoir..

  16. #12
    jiherve

    Re : Projet en Vhdl: Addition de vecteur en binaire

    Re
    oui c'est çà
    Ceci dit un seul process suffit le VHDL est par nature une description du parallélisme.
    JR
    l'électronique c'est pas du vaudou!

  17. Publicité
  18. #13
    Myda

    Re : Projet en Vhdl: Addition de vecteur en binaire

    Bonjour, encore moi...
    J'ai implémenté les filtres et cela a l'air de fonctionner correctement
    J'ai cherché des afficheurs 7 segments dans une multitude magasin pour finir par en trouver..
    J'ai acheter deux montages de 3 afficheurs(en piece jointe). Je me demandais si le montage permettait de faire quelque chose de special ou si ca revenait simplement a 3 afficheurs séparés..
    Je dois afficher des nombres de 0 à 21, et je me demandais si j'allais devoir jouers avec les bits pour envoyer les dizaines sur un afficheurs et les unités sur l'autre ou si il y avait une facon beaucoup plus simple..
    J'ai des décodeurs 4511 et des afficheurs MAN71A..
    Merci..
    Images attachées Images attachées

  19. #14
    jiherve

    Re : Projet en Vhdl: Addition de vecteur en binaire

    Bonsoir,
    ce sont des afficheurs multiplexés , commande des segment commune donc un seul 4511 mais il faudra piloter les anodes ou les cathodes de façon séparées.
    cherche sur le web un schéma il y en a pléthore.
    JR
    l'électronique c'est pas du vaudou!

  20. #15
    zikos-7

    Re : Projet en Vhdl: Addition de vecteur en binaire

    Stp est ce que tu peux me passer ton code pour le voir ?? parce que j'essaye de faire la mm chose mais ça ne marche pas.

Discussions similaires

  1. addition VHDL
    Par damsgood dans le forum Électronique
    Réponses: 5
    Dernier message: 18/06/2010, 20h47
  2. addition binaire
    Par moussa97 dans le forum Électronique
    Réponses: 1
    Dernier message: 20/05/2009, 19h14
  3. addition soustraction binaire
    Par moussa97 dans le forum Électronique
    Réponses: 0
    Dernier message: 30/04/2009, 20h14
  4. addition binaire
    Par gagliardibruno dans le forum Électronique
    Réponses: 5
    Dernier message: 15/12/2007, 23h14
  5. Addition en VHDL
    Par tekken dans le forum Électronique
    Réponses: 3
    Dernier message: 27/04/2007, 21h08
Découvrez nos comparatifs produits sur l'informatique et les technologies.