Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1

    Inscrit en
    mai 2012
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : mai 2012
    Messages : 7
    Points : -1
    Points
    -1

    Par défaut Synchronisation entre deux process

    Bonsoir à tous,

    je suis débutante en VHDL, je veux écrire un simple programme qui fait la synchronisation entre 2 process, lorsque l'un fonctionne l'autre non. Pour cela j'ai utilisé une variable im qui va prendre la valeur 1 pour que le 2ème process puisse fonctionner, et puis pour que le 1er re-fonctionne elle doit changer de valeur à 0. Le programme n'accepte pas cette 2ème attribution de valeur à la méme variable, il m'affiche "im has multiple source".
    Voilà le code
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    LIBRARY ieee ;
    use ieee.std_logic_unsigned.all;
    USE ieee.std_logic_1164.all ;
    USE ieee.std_logic_arith.all ;
    use ieee.numeric_std.all;
    
    entity t is 
      port(
         
        clk : in std_logic;
    
        d_in : in std_logic;
       
         d_out :out std_logic;
     im_out : out std_logic
       
        );
    end entity;
    
    ARCHITECTURE corp of t is
       signal im:integer:=0;
       begin 
            process(clk) --process 1
                begin
            if (clk'event and clk='1') then
            d_out <= d_in;
              im <= 1;
            end if;
          end process;
          process (clk)
            begin
            if (clk'event and clk='1' and im=1) then
              im_out <= d_in;
               im <= 0;
            end if;
          end process;
         
          
        end corp;

  2. #2
    Membre expérimenté

    Ingénieur développement matériel électronique
    Inscrit en
    juillet 2010
    Messages
    296
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : juillet 2010
    Messages : 296
    Points : 501
    Points
    501

    Par défaut

    Salut,

    Tu ne peux pas accéder en écriture à la même variable depuis deux process différents. Si tu raisonne en terme de synthèse cela correspond à un court-circuit sur ton signal im...

  3. #3
    Membre régulier
    Inscrit en
    juin 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : juin 2009
    Messages : 52
    Points : 95
    Points
    95

    Par défaut

    Bonsoir,

    mith06 : OK avec vous sur le principe, pas d'accord sur la terminologie. Un signal n'est pas une variable, c'est un objet. Liste des objets VHDL:
    • signal : objet doté d'un historique de valeur
    • constant : objet dont la valeur ne peut être changée
    • variable (ou shared variable): objet avec son unique valeur courante


    L'énorme différence entre un signal et une variable est qu'un signal génère un "évènement" (le fameux 'event que l'on peut utiliser sur une horloge) alors qu'une variable non : lorsqu'une variable change de valeur, elle ne génère PAS d'évènement. Donc par exemple pas de "wait until now=5 us" (attente infinie).
    Fin de la précision

    Quelques conseils :
    1. pour la synthèse, n'utilisez pas les "integer" mais plutôt les "std_logic_vector". Un integer (surtout tel que vous l'avez écrit, non contraint en "range" est toujours synthétisé sur 32bits). Les types std_logic, std_logic_vector, énumérés sont toujours OK. Les integers & dérivés, les réels, les boolean, les string & char ne sont pas conseillés voire non/mal supportés par les outils
    2. n'utilisez qu'un unique process avec une écriture conventionnelle. N'oubliez pas que vous visez une cible matérielle et que votre CPLD / FPGA possède une architecture physique prédéterminée. Chaque bascule doit avoir un reset asynchrone (partie "if rst='1' then ...") et une entrée synchrone (partie "elsif rising_edge(clk) then ..."). Ces deux parties sont les deux seules
      Code :
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      architecture rtl of xxx is
          signal MonSLV : std_logic_vector(aaa downto bbb);
      begin
      
      process(rst,clk)
      begin
      if rst='1' then
         MonSLV <= (others=>'0');
      elsif rising_edge(clk) then
         ...
      end if;
      end process;
      
      end architecture rtl;


    Au niveau scolaire, beaucoup d'enseignants "poussent" les étudiants à écrire un process par signal . Ils feraient mieux de vous pousser comme suit : "un signal par boucle et une boucle pour chaque signal" . Car en faisant cela, ils laissent sous-entendre que la liste de sensibilité et/ou la structure du process est "bidouillable" à souhait... C'est une hérésie totale !! La preuve, sans le faire exprès, votre 2ème process a une détection du front montant pour le moins exotique...

    Aller, courage, le VHDL c'est comme le vélo. C'est très dur au début, après ça va beaucoup mieux...

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •