apprentissage VHDL - Page 2
Discussion fermée
Page 2 sur 3 PremièrePremière 2 DernièreDernière
Affichage des résultats 31 à 60 sur 76

apprentissage VHDL



  1. #31
    invite369d2cfd

    Re : apprentissage VHDL


    ------

    SVP je suis débutante en VHDL, je veux un code pour remplir une matrice qui prend en entrée une valeure à chaque cout d'horloge, pour cela j'ai tapé ce code mais à l'éxcution j'ai remarqué que ça fonctionne pas comme il faut, en faite la matrice est remplit totalement par la méme valeure
    <code>
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_arith.all;
    use ieee.std_logic_unsigned.all;
    use ieee.std_logic_signed.all;
    use ieee.numeric_std.all;

    use work.type_pkg.all;
    use work.type_matx.all;

    entity matrice is

    port (
    matx:in matrix;
    a:in bit;
    but bit;
    clk:in std_logic
    );
    end matrice;

    architecture arch_matrice of matrice is
    signal i,j:integer:=2;
    signal mat:matrix;
    signal tab:tabx;
    signal aa:bit;
    begin
    process(mat,clk)
    begin

    for i in 0 to 2 loop
    for j in 0 to 2 loop

    if (clk'event and clk='1')then

    mat(i,j)<=a ;

    end if;
    i<=i+1;
    end loop;
    end loop;

    end process;
    end arch_matrice;
    </code>

    -----

  2. #32
    jiherve

    Re : apprentissage VHDL

    Bonjour,
    1 : éviter l'overloading donc avec:
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    cela suffit
    2 : inutile de déclarer i,j et inutile d’incrémenter i l'instruction loop fait çà très bien toute seule.
    3 : même si cela n'est pas indispensable penser à placer des labels devant chaque boucle début et fin:
    lbl1 : for i in 0 to ...
    ....
    end loop lbl1;
    4 : il faudrait placer "a" dans la liste de sensibilité du process, par contre "mat" n'a rien à y faire.
    5 : pour que la matrice (qui est donc une array de std_logic i presume) prenne des valeurs différentes il faut que "a" change à chaque coup d'horloge et de façon synchrone avec icelle est ce le cas ?
    JR
    l'électronique c'est pas du vaudou!

  3. #33
    invite369d2cfd

    Re : apprentissage VHDL

    merci pour votre réponse
    oui je veux que "a" prend des valeurs différentes à chaque cout d'horloge (à chaque clk) .
    pour cela j'ai corrigé le code de cette façon mais lors de la simulation j'ai pas trové le résultat souhaté
    <code>

    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;

    use work.type_pkg.all;
    use work.type_matx.all;

    entity matrice is

    port (
    -- matx:in matrix;
    a:in bit;
    but bit;
    clk:in std_logic
    );
    end matrice;

    architecture arch_matrice of matrice is

    signal mat:matrix;
    signal tab:tabx;
    signal aa:bit;
    begin
    process(a,clk)
    begin
    label1 : for i in 0 to 2 loop
    if (clk'event and clk='1')then

    label2 : for j in 0 to 2 loop
    if (clk'event and clk='1')then

    mat(i,j)<=a ;
    end if;
    end loop label2;
    end if;
    end loop label1;

    end process;
    end arch_matrice;
    </code>

  4. #34
    jiherve

    Re : apprentissage VHDL

    bonsoir,
    non le if clk.. doit être en dehors des boucles cela déclare en fin de compte un processus synchrone (donc des bascules après synthèse), et rien ici ne laisse supposer que "a" change à chaque coup d'horloge puisse c'est une entrée de l'entité.
    voilà un code qui fonctionne
    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    
    use work.type_pkg.all;
    use work.type_matx.all;
    
    entity matrice is
    
    port (
    -- matx:in matrix;
        a:in bit;
        but bit;
       clk:in std_logic;
       reset : in std_logic
    );
    end matrice;
    
    architecture arch_matrice of matrice is
    
    signal mat:matrix;
    signal tab:tabx;
    signal aa:bit;
    signal  i,j : integer range 0 to 2.
    begin
    process(reset,clk)
    begin
      if reset = '1' then
        mat <= (others => '0');
        i <= 0;
        j <= 0;
      elsif (clk'event and clk='1')then
        mat(i,j)<= a ;
        if j < 2 then 
          j <= j+1;
        else
          j <= 0;
          if i < 2 then
            i <= i+1;
          else
            i <= 0;
          end if;
        end if;
      end if;
    end process;
    end arch_matrice;
    </code>
    Le boucles s’exécutent en entier à chaque coup d'horloge donc toute la matrice est chargée avec la valeur "a".
    TOUJOURS prévoir un reset pour des process clocké car sinon on ne sait rien de l’état des bascules au démarrage du process.
    Ma réponse précédente bien que juste était inadaptée.
    l'électronique c'est pas du vaudou!

  5. #35
    invite369d2cfd

    Re : apprentissage VHDL

    merci infiniment

  6. #36
    invite369d2cfd

    Re : apprentissage VHDL

    bonsoir,
    j'ai déclaré mon matrice de cette façon: type matrix is array(0 to 2,0 to 2) of bit
    puis j'ai écrit: mat <= (others => ('0','0')) pour rendre les valeurs de la matrice à zéro
    le programme m'a mentionné un warnings vcom-1192) At index #2, array length is 3; aggregate length is 2.
    j'ai pas compris où est l'erreur
    merci d'avance

  7. #37
    jiherve

    Re : apprentissage VHDL

    Bonsoir,
    Pour déclarer un type d'ordre 2
    il faut déclarer d'abord :
    subtype (ou type) vec (nom arbitraire) is array (0 to 2) of bit (ou tout autre type connu);
    type matrice is array (0 to2) of vec;
    signal mat : matrice;
    pour l'initialisation oui une erreur de ma part : mat <= (others => (others ='0'));
    là on a une matrice d'ordre 2.
    Sorry
    JR
    Dernière modification par jiherve ; 05/05/2012 à 22h04.
    l'électronique c'est pas du vaudou!

  8. #38
    invite369d2cfd

    Re : apprentissage VHDL

    Un grand merci

  9. #39
    invite369d2cfd

    Re : apprentissage VHDL

    j'ai écrit le code si dessous mais le probléme c'est que je veux remplir la matrice à partir du tableau(tab) dans un seul cout d'horloge pour des buts d'optimisation, merci de m'aider pour rendre le remplissage se fait dans un seul cout d'horloge (clk)

    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    use work.type_pkg.all;
    
    entity matrice is
      
    port (
    
      a:in bit;
      clk:in std_logic;
      reset:in std_logic
      );
     end  matrice;
     
    architecture arch_matrice of matrice is
      signal mat: matrix;
      signal mat2: matrix;
      signal tab : bit_vector(8 downto 0);
      signal aa:bit;  
      signal  k,l : integer range 0 to 2;
      signal  i,j : integer range 0 to 2;
      signal n : integer range 0 to 8; 
    begin 
    process(reset,clk,mat,mat2)
    begin
       if reset = '1' then 
        mat <= (others => (others =>'0')); 
        i <= 0;
        j <= 0;
        mat2 <= (others => (others =>'0')); 
        k <= 0;
        l <= 0;
      elsif (clk'event and clk='1')then
       
       for n in 0 to 8 loop 
         mat(i,j)<= tab(n) ;
        if j < 2 then 
          j <= j+1;
        else
          j <= 0;
          if i < 2 then
            i <= i+1;
          else
            i <= 0;
          end if;
        end if;
          mat2(k,l)<= tab(n) ; 
        if k < 2 then 
          k <= k+1;
        else
          k <= 0;
          if l < 2 then
            l <= l+1;
          else
            l <= 0;
          end if;
        end if;
      end loop;
      end if;
    
    end process;
    end arch_matrice;

  10. #40
    jiherve

    Re : apprentissage VHDL

    Bonsoir,
    ce n'est pas possible, sauf à disposer d'un composant type NOVRAM qui est l'association d'une RAM et d'une EEPROM, malheureusement cela n'existe pas dans un FPGA, mais on pourait le faire en utilisant une array de registres, c'est tres lourd et couteux en hard.
    Cependant on peut initialiser une RAM au moment de la configuration du FPGA (.hex ou .mif chez Altera) il faut alors utiliser une RAM instanciée de la bonne façon (Megawizard chez Altera).
    JR
    Dernière modification par jiherve ; 16/05/2012 à 20h21.
    l'électronique c'est pas du vaudou!

  11. #41
    invite369d2cfd

    Re : apprentissage VHDL

    merci pour votre attention,
    mon probléme c'est l'optimisation car si je dispose d'un tableau de grande taille ça se serait couteux en temps pour remplir la matrcie puisque à chaque cout d'horloge, une case sera remplit. je suis débutante en FPGA et j'arrive pas à résoudre ce probléme comme vous l'avez expliqué

  12. #42
    jiherve

    Re : apprentissage VHDL

    Bonjour,
    il y a un cas comme signalé précédemment qui permet de faire çà si les valeurs d'initialisation sont des constantes, mais attention la matrice sera implémentée dans des registres.
    Tu déclares une constante de type mat dont tu donnes la valeur :
    constant val_init : matrix := ((...,...,...),(...,...,...), etc);
    ensuite dans ton process clocké tu écris:
    if init = '1' then
    mat <= val_init;
    end if;
    voila c'est fait mais attention à la taille du résultat, si les matrices sont grosses cela explose le FPGA.
    JR
    l'électronique c'est pas du vaudou!

  13. #43
    invite369d2cfd

    Re : apprentissage VHDL

    merci jiherve,
    lors de la simulation de ce code, j'ai remarqué que la boucle FOR.. LOOP n'est pas entrain de fonctionner et la matrice n'est pas entrain de prendre ses valeurs à partir du tableau, j'ai pas compris l'erreur de ce programme.. merci de m'aider

    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    use work.type_pkg.all;
    
    entity matrice is
      
    port (
      tab : in bit_vector(0 to 8);
      a:in bit;
      clk:in std_logic;
      reset:in std_logic
      );
     end  matrice;
     
    architecture arch_matrice of matrice is
      signal mat: matrix;
      signal mat2: matrix;  
      signal  k,l : integer range 0 to 2;
      signal  i,j : integer range 0 to 2;
      signal n : integer range 0 to 8; 
    begin 
    process(reset,clk,mat,mat2)
    begin
       if reset = '1' then 
        mat <= (others => (others =>'0')); 
        i <= 0;
        j <= 0;
        mat2 <= (others => (others =>'0')); 
        k <= 0;
        l <= 0;
      elsif (clk'event and clk='1')then
       
       for n in 0 to 8 loop 
         mat(i,j)<= tab(n) ;
        if j < 2 then 
          j <= j+1;
        else
          j <= 0;
          if i < 2 then
            i <= i+1;
          else
            i <= 0;
          end if;
        end if;
          mat2(k,l)<= tab(n) ; 
        if k < 2 then 
          k <= k+1;
        else
          k <= 0;
          if l < 2 then
            l <= l+1;
          else
            l <= 0;
          end if;
        end if;
      end loop;
      end if;
    
    end process;
    end arch_matrice;

  14. #44
    jiherve

    Re : apprentissage VHDL

    Bonsoir
    encore une fois il ne faut pas déclarer l'index de boucle c'est implicite et encore une fois il faut bien comprendre ce que fait une boucle for :
    cela créé une série d'affectations concurrentes qui font que à chaque coup d'horloge qui fait avancer les index i,j alors mat(i,j) fini toujours par recevoir la dernière valeur de mat c'est a dire la valeur tab(8), mis à plat le code c'est:
    mat(i,j) <= tab(0);
    ... gestion i,,j
    mat(i,j) <= tab(1);
    ... gestion i,,j
    mat(i,j) <= tab(8);
    ... gestion i,,j
    pour la partie gérant les index comme c'est 9 fois le même code au final il n'en reste qu'un (et ce n'est pas C Lambert )
    il faut supprimer la boucle et écrire :
    mat(i,j) <= tab( i*3 + j);--là cela fonctionne.
    idem pour l'autre mais j'avoue ne pas comprendre le besoin de déclarer les index l,k qui ne sont que des copies de i,j

    JR
    Dernière modification par jiherve ; 19/05/2012 à 18h34.
    l'électronique c'est pas du vaudou!

  15. #45
    invite369d2cfd

    Re : apprentissage VHDL

    un grand merci jiherve, oui c'a marché
    je vous remercie infiniment

  16. #46
    jiherve

    Re : apprentissage VHDL

    Re
    à ton service!
    JR
    l'électronique c'est pas du vaudou!

  17. #47
    invite369d2cfd

    Re : apprentissage VHDL

    salut, je veux creer un package pour déclarer une matrice ayant NL et NC de type généric
    pour cela j'ai tapé le code suivant mais j'ai trouvé des erreurs comment puis-je m'en sortir
    merci d'avoir m'aider

    Code:
    package type_pcg is 
    generic(NL:integer:=3;
    NC:integer:=2
    );
    type matrix is array(0 to NL,0 to NC)of bit;
    end type_pcg;

  18. #48
    jiherve

    Re : apprentissage VHDL

    Bonsoir,
    Un package ne comporte pas de generic.
    çà çà marche:
    Code:
    package type_pcg is 
    constant NL : integer := 3;
    Constant NC : integer := 2;
    type matrix is array(0 to NL,0 to NC)of bit;
    end type_pcg;
    JR
    l'électronique c'est pas du vaudou!

  19. #49
    invite369d2cfd

    Thumbs up Re : apprentissage VHDL

    merci ça marché

  20. #50
    jiherve

    Re : apprentissage VHDL

    Re
    Je m'en doutais un peu!
    JR
    l'électronique c'est pas du vaudou!

  21. #51
    invite369d2cfd

    Re : apprentissage VHDL

    Bonjour,
    Je veux placer le corps de package dans le méme fichier que l'entité, mais j'ai trouver que le programme m'a fait sortir des erreurs inattendus: "unknoun identifier "std_logic" . De plus, je veux que les variables NL et NC soient généric mais ça se fait pas à l'intérieur du package où je peux les déclarer comme généric
    Voila le bout de code
    Merci d'avoir m'aider
    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    use ieee.std_logic_arith.all;
    
    package type_pkg is
    constant NL : integer := 3;
    Constant NC : integer := 3;
      type matrix is array(0 to NL,0 to NC) of bit;
    end package type_pkg;
    
    use work.type_pkg.all;
    
    entity essai is
     port (
        tab : in bit_vector(0 to ((NL*NC)-1));
      tab2 : inout bit_vector(0 to ((NL*NC)-1));
      tab3 : inout bit_vector(0 to ((NL*NC)-1));
      reset:in std_logic;
        clk:in std_logic
        
       );
    end  essai;

  22. #52
    Nicocloud


  23. #53
    jiherve

    Re : apprentissage VHDL

    Bonsoir,
    tu as oublié de redeclarer les librairie IEEE avant ton entité, ne declare pas en même temp numeric_std et std_logic_arith risque de conflits du à l'overloading, il vaux mieux faire des fichiers séparés c'est plus propre et plus facile à utiliser et maintenir.

    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    --use ieee.std_logic_arith.all;
    
    package type_pkg is
    constant NL : integer := 3;
    Constant NC : integer := 3;
      type matrix is array(0 to NL,0 to NC) of bit;
    end package type_pkg;
    
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    use work.type_pkg.all;
    
    entity essai is
     port (
        tab : in bit_vector(0 to ((NL*NC)-1));
      tab2 : inout bit_vector(0 to ((NL*NC)-1));
      tab3 : inout bit_vector(0 to ((NL*NC)-1));
      reset:in std_logic;
        clk:in std_logic
        
       );
    end  essai;
    Comme d'hab çà fonctionne mieux maintenant.
    JR
    l'électronique c'est pas du vaudou!

  24. #54
    invite369d2cfd

    Re : apprentissage VHDL

    SVP quelqu'un qui peut m'aider
    je veux déclarer deux variables NL et NC qui présentent la taille de la matrice, et qui doivent étre générique et saisis par l'utilisateur. mais je trouve un probléme dans le code (ils ne sont connus dans le package)
    voila le bout de code que j'ai tapé:
    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    
    package type_pkg is
      type matrix is array(0 to NL,0 to NC) of bit;
    end package type_pkg;
    
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    use work.type_pkg.all;
    
    
    entity essai is
      generic (NL,NC : integer);
     port (
       NL : in std_logic;
       NC in std_logic;
        tab : in bit_vector(0 to 7);
      tab2 : inout bit_vector(0 to 7);
      tab3 : inout bit_vector(0 to 7);
      reset:in std_logic;
        clk:in std_logic
        
       );
    end  essai;

  25. #55
    jiherve

    Re : apprentissage VHDL

    Bonjour
    dans une entité l'usage de generic est légal mais au moins il ne faudrait pas réutiliser les nom en en changeant le type!
    JR
    l'électronique c'est pas du vaudou!

  26. #56
    invite369d2cfd

    Re : apprentissage VHDL

    merci beaucoup

  27. #57
    invite369d2cfd

    Re : apprentissage VHDL

    Bonsoir, dans le cadre de l'implémentation d'un entrelaceur convolutionnel, je dois implémenter l'unité de retard qui contient des registres à décalage de telle
    façon que l’entrelaceur est composé de 12 registres FIFO Chaque octet du flux, présenté cycliquement à l’une des 12 branches de l’entrelaceur, est décalé
    en sortie de 17 x j positions, où j est l’indice de la branche. Ainsi, le premier octet d’une trame (l’octet de synchro) n’est pas décalé, le 2ème est décalé de 17 positions, le 3ème de 34 positions… le 12ème de 17 x 11 = 187 positions, et on recommence un cycle : le 13ème n’est pas décalé,
    le 14ème est décalé de 17 positions…
    , voila la figure ci jointe.
    pour le réaliser j'ai essayé ce code ,mais le recommencement du cycle j'ai pas su le réaliser c à d comment lui dire lorsque tu arrive au 13 tu dois revenir au
    départ. sachant que j'ai 36 octet (symbole) en entrée
    Code:
    entity conv is
     port (
       clk : in std_logic; 
        reset : in std_logic;
        data_in : in bit_vector(0 to 35); 
        data_out : inout bit_vector );
    end  conv;
    
    architecture arch_conv of conv is
     signal  i: integer range 0 to 35;
    begin 
       process(clk,reset)
    begin
    if reset = '1' then 
     data_out(0)<=data_in(0);
     elsif (clk'event and clk='1')then
        data_out(i+17)<=data_in(i);
        if i <35 then 
         i <= i+1;
        end if;
    end if;
    
    end process;
    end arch_conv;
    merci d'avoir m'aider

  28. #58
    jiherve

    Re : apprentissage VHDL

    Bonsoir,
    ton code est donc celui d'une branche, quelle est l’architecture mère?
    Et çà compile ton code avec une sortie non contrainte ?
    autrement la piste c'est d'utiliser la fonction modulo (mod).
    JR
    l'électronique c'est pas du vaudou!

  29. #59
    invite369d2cfd

    Re : apprentissage VHDL

    voila le code pour les 12 branches des 12 premiers symboles, le 13 éme (le suivant doit commencer de nouveau: branche n° 0), autrement je veux introduire une boucle répététive aprés chaque 12 symboles, elle commence de nouveau.
    Code:
    entity conv is
     port (
       clk : in std_logic; 
        reset : in std_logic;
        data_in : in bit_vector(0 to 35); 
        data_out : inout bit_vector );
    end  conv;
    
    architecture arch_conv of conv is
     signal  i: integer range 0 to 35;
    begin 
       process(clk,reset)
    begin
    if reset = '1' then 
     data_out(0)<=data_in(0);
     elsif (clk'event and clk='1')then
        data_out(i+17)<=data_in(i);
        if i <11 then 
         i <= i+1;
        end if;
    end if;
    
    end process;
    end arch_conv;

  30. #60
    jiherve

    Re : apprentissage VHDL

    bonsoir,
    cela ne répond pas à ma question, ici je ne vois qu'un seul composant comment sont ils interconnectés.
    fais donc un schéma bloc de ce que tu veux.
    JR
    l'électronique c'est pas du vaudou!

Page 2 sur 3 PremièrePremière 2 DernièreDernière

Discussions similaires

  1. apprentissage
    Par invite89f3adc2 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 30/06/2007, 12h00
  2. Relativité et apprentissage
    Par invite4ef352d8 dans le forum Physique
    Réponses: 18
    Dernier message: 11/10/2006, 19h17
  3. apprentissage
    Par invited2e22de3 dans le forum Biologie
    Réponses: 9
    Dernier message: 16/03/2005, 09h14
  4. l'apprentissage (ou re apprentissage)
    Par invite4b816bc1 dans le forum [ARCHIVE] Philosophie
    Réponses: 1
    Dernier message: 15/01/2005, 17h21
Découvrez nos comparatifs produits sur l'informatique et les technologies.