Précédent   Forum du club des développeurs et IT Pro > Autres langages > Autres langages > VHDL
VHDL Forum d'entraide sur VHDL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 26/12/2012, 14h09   #1
seni404
 
Inscription : 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;
seni404 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 13h02   #2
mith06
Membre confirmé
 
Ingénieur développement matériel électronique
Inscription : juillet 2010
Messages : 152
Détails du profil
Informations professionnelles :
Activité : Ingénieur développement matériel électronique
Secteur : Industrie

Informations forums :
Inscription : juillet 2010
Messages : 152
Points : 243
Points : 243
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...
mith06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 20h07   #3
titiri
Membre régulier
 
Inscription : juin 2009
Messages : 37
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 37
Points : 77
Points : 77
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...
titiri est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h47.


 
 
 
 
Partenaires

Hébergement Web