p
u
b
l
i
c
i
t
é
publicité
  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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 chevronné

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

    Informations forums :
    Inscription : juillet 2010
    Messages : 309
    Points : 614
    Points
    614

    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 habitué
    Inscrit en
    juin 2009
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : juin 2009
    Messages : 61
    Points : 119
    Points
    119

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
      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...

Discussions similaires

  1. [2005] Synchronisation entre deux bases
    Par mister3957 dans le forum MS SQL-Server
    Réponses: 2
    Dernier message: 06/08/2007, 12h46
  2. synchronisation entre deux threads
    Par chabfive dans le forum APIs
    Réponses: 9
    Dernier message: 03/11/2006, 12h17
  3. Réponses: 14
    Dernier message: 02/05/2005, 18h14
  4. partager ressource entre deux process
    Par buzzz dans le forum Windows
    Réponses: 6
    Dernier message: 16/02/2005, 10h36
  5. TList partagée entre deux process.
    Par swirtel dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/01/2005, 11h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo