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

Pb code vhdl!!!



  1. #1
    grandmax

    Pb code vhdl!!!


    ------

    Salut tt le monde, je n'arrive pas à synthétiser un simple
    monostable en VHDL . En fait c pour faire un anti rebond
    voici le code :

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;

    ---- Uncomment the following library declaration if instantiating
    ---- any Xilinx primitives in this code.
    --library UNISIM;
    --use UNISIM.VComponents.all;

    entity antirebond is
    Port ( freqmux : in STD_LOGIC;-- signal horloge
    bp : in STD_LOGIC;-- signal bouton poussoir
    minset : out STD_LOGIC:='0'); sortie
    end antirebond;

    architecture Behavioral of antirebond is

    signal counter:std_logic_vector(3 downto 0);

    begin

    process(bp,freqmux)
    begin
    if(bp'event and bp='1')then
    if(freqmux'event and freqmux='1')then
    if(counter<"1111")then
    counter<=counter+1;minset<='1' ;
    elsif(counter="1111")then
    counter<="0000";minset<='0';
    end if;
    end if;
    end if;
    end process;

    end Behavioral;


    et voici l'erreur généré sous xilinx ISE webpack:

    Performing bidirectional port resolution...

    Synthesizing Unit <antirebond>.
    Related source file is "C:/Xilinx/rebond/antirebond.vhd".
    ERROR:Xst:1534 - Sequential logic for node <minset> appears to be controlled by multiple clocks.
    ERROR:Xst:739 - Failed to synthesize logic for signal <minset>.
    ERROR:Xst:1431 - Failed to synthesize unit <antirebond>.

    Est ce que quelqu'un pourrait m'expliquer mon erreur , je
    comprends pas pourquoi on ne peut pas faire ca.

    -----

  2. Publicité
  3. #2
    Jack
    Modérateur

    Re : Pb code vhdl!!!

    C'est à cause de la ligne:
    minset : out STD_LOGIC:='0'); sortie

    je suppose.

    Pourquoi ce :=0 ?

    Si tu l'enlèves, que dis le compilateur?

    A+

  4. #3
    grandmax

    Question Re : Pb code vhdl!!!

    ba en fait , je déclare minset = 0 au début pour la simulation du code sous modelsim, mais si je l'enlève j'ai la même erreur!grrrr:

  5. #4
    jiherve

    Re : Pb code vhdl!!!

    Bonsoir
    manque un reset ou équivalent pour initialiser le tout!
    Car "counter" il vaut quoi au démarrage ?
    Y a du mail avant de pouvoir faire du code niveau DO254!
    JR

  6. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  7. #5
    Jack
    Modérateur

    Re : Pb code vhdl!!!

    Bonsoir
    manque un reset ou équivalent pour initialiser le tout!
    Car "counter" il vaut quoi au démarrage ?
    C'est juste, mais ça va juste empêcher un simulateur de calculer les signaux.

    Mais ça ne doit pas empêcher le compilateur de compiler.

    Je voudrais bien revoir le code avec la petite modif que j'ai demandée.

    A+

  8. A voir en vidéo sur Futura
  9. #6
    grandmax

    Re : Pb code vhdl!!!

    bonjour tt le monde , le compilateur me donne la même erreur si j'enlève le :='0' dans la déclaration des E/S.

  10. Publicité
  11. #7
    Jack
    Modérateur

    Re : Pb code vhdl!!!

    Dans la ligne:

    minset : out STD_LOGIC:='0'); sortie

    comment se fait-il que "sortie" ne soit pas en commentaire?

    A+
    Dernière modification par Jack ; 26/11/2006 à 09h09.

  12. #8
    Jack
    Modérateur

    Re : Pb code vhdl!!!

    En fait, je pense que tu as 2 problèmes majeurs:

    Ton système étant synchrone, c'est de cette manière qu'il faudra gérer l'appui sur le BP. Les lignes suivantes ne conviennent donc pas (2 évènement asynchrones):
    if(freqmux'event and freqmux='1')then
    if(counter<"1111")then

    De plus, les lignes suivantes ne conviennent pas pour piloter l'état de minset:
    counter<=counter+1;minset<='1' ;
    elsif(counter="1111")then
    counter<="0000";minset<='0';

    c'est ce qui est détecté par ton compilateur qui dit que minset possède plusieurs sources.

    Ton code devrait plutôt ressembler à ceci:

    Code PHP:
    architecture Behavioral of antirebond is
    signal counter
    :std_logic_vector(3 downto 0);
    begin
        process
    (bp,freqmux)
            
    begin
                
    if(freqmux'event and freqmux='1')then
                    if(bp='
    1')then
                        if(counter<"1111")then
                            counter<=counter+1;minset<='
    1' ;
                        else counter<="0000";minset<='
    0';
                    end if;
                end if;
            end if;
        end process;
    end Behavioral; 
    Je ne sais pas s'il est opérationnel, mais il est syntaxiquement exact.

    A+

  13. #9
    grandmax

    Re : Pb code vhdl!!!

    salut tt le monde !
    Jack , le code que tu me propose est bon au niveau de la syntaxe , mais cela ne marhe toujours pas , la sortie minset passe à '1' mais ne revient jamais à '0'!
    Images attachées Images attachées

  14. #10
    Jack
    Modérateur

    Re : Pb code vhdl!!!

    C'est normal car le compteur ne sera remis à 0 que s'il atteint 1111, ce qui n'est pas le cas dans ta simul.

    Je n'ai fait que corriger ton erreur, mais je n'ai rien changé à la philosophie de ton code.

    Je te laisse progresser.

    Il faudrait d'ailleurs que tu donnes exactement les caractéristiques de ton monostable pour qu'on puisse te proposer éventuellement une solution (redéclenchable, retard au démarrage, etc.)

    A+

  15. #11
    grandmax

    Re : Pb code vhdl!!!

    "1111" ca fait bien 15 en décimal , or sur la sim ya bien plus
    que 15 coups de clock , et ma sortie minset ne revient pas à '0'. peut etre qu'on sait mal compris.Moi ce que je voudrais c que au premier front montant de BP , minset passe à '1'--> aprés on compte 15 coups d'horloge de l'entrée freqmux ,puis qu'on réinitialise minset à '0'.

  16. #12
    Jack
    Modérateur

    Re : Pb code vhdl!!!

    Laisse BP à 1 suffisamment longtemps et ta sortie passera à 1.

    Il faut respecter une échelle des temps concrète. Dans ta simul, tu appuies sur le BP durant un temps inférieur à la µs.

    Affiche également la valeur du compteur dans tes chronogrammes, ce sera plus parlant.

    A+

  17. Publicité
  18. #13
    grandmax

    Re : Pb code vhdl!!!

    n'y aurait il pas moyen d'incrémenter le compteur indépendamment de la variable BP, moi j'aurais aimais faire ca:
    sur front montant de bp : on met minset à '1'.
    ensuite , si minset est à '1' alors on incrémente "counter "
    en fonction de "freqmux ".
    quand counter ="telle valeur" alors on remet minset à '0'.
    J'ai deja essayé en faisant deux process différent mais ca marche pas , paske apparemment on pa modifier une valeur(ici minset)dans deux process différent.
    en fait c faire du comptage (sur front d'horloge de freqmux) à partir d'un front montant sur BP et non lorsque BP ='1'.
    Dernière modification par grandmax ; 29/11/2006 à 13h56.

  19. #14
    Jack
    Modérateur

    Re : Pb code vhdl!!!

    Je ne fais pas assez souvent de vhdl pour conserver des automatismes et te donner une solution.

    J'aurai peut-être une peu de temps la semaine prochaine pour me pencher sérieusement sur le problème.

    Mais c'est un problème simple de logique synchrone et tu devrais t'en sortir d'ici là.

    A+

  20. #15
    jponnoua

    Re : Pb code vhdl!!!

    Bonjour a tous !

    Il se trouve que j'essaye de coder l'algorithme de Montgomery en VHDL, et que je butte sur un petit problème : voici mon code :

    process(A,B,M)
    variable q,s_int,s_intold,expr1,expr2 : std_logic_vector(N-1 downto 0):=(others => '0');

    begin

    boucle : for i in 0 to 0 loop -- 0 à 0 pour debugger.
    if((s_int(0) or (A(i) and B(0))) = '0') then q(i) := '0';
    else q(i) := '1';
    end if;

    if(q(i)='0') then expr2 := (others => '0');
    else expr2 := M;
    end if;
    if(A(i)='0') then expr1 := (others => '0');
    else expr1 := B;
    end if;
    s_int := (s_int or expr1 or expr2);
    U <= s_int;

    end loop boucle;
    ...

    end process;

    Alors le problème est le suivant : un bit en sortie sur U est undefined. J'ai réussi à repérer la ligne qui pose problème : s_int := (s_int or expr1 or expr2);
    Il se trouve que quand j'initialise une nouvelle variable à la valeur de s_int et que je remplace cette expression par la suivante s_int := (s_intold or expr1 or expr2); l'erreur disparait. Cependant cette solution ne peut me convenir car il faudrait par la suite que je mette à jour s_intold car je suis dans une boucle : s_intold <= s_int; et la rebelotte, je retombe sur mon erreur de départ avec un bit undefined. Please help me ! =)

Discussions similaires

  1. vhdl
    Par pol5700 dans le forum Électronique
    Réponses: 117
    Dernier message: 29/03/2007, 23h29
  2. vhdl
    Par eagle_75 dans le forum Électronique
    Réponses: 5
    Dernier message: 29/03/2007, 19h52
  3. Simulation code vhdl
    Par persus9 dans le forum Électronique
    Réponses: 4
    Dernier message: 30/11/2006, 09h35
  4. code source en vhdl [déplacé]
    Par koko720 dans le forum Électronique
    Réponses: 2
    Dernier message: 20/11/2006, 14h09
  5. Code VHDL pour un SPI
    Par JoeBlo dans le forum Électronique
    Réponses: 4
    Dernier message: 08/04/2006, 22h09
Découvrez nos comparatifs produits sur l'informatique et les technologies.