Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3053 connectés 

  FORUM HardWare.fr
  Programmation
  Divers

  Erreur code vhdl

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Erreur code vhdl

n°2229515
ayo1
Posté le 29-05-2014 à 23:18:37  profilanswer
 

Bonsoir mes ami(e)s :
 
est ce que vous pouvez m'aider svp .
 
voici mon code :
 

Code :
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4. entity correla is
  5. port (
  6.          clk : in    std_logic ;
  7.          rst : in    std_logic  ;
  8.          data: in    std_logic_vector(11 downto 0)  ;
  9.      
  10.          code: in    std_logic_vector(15 downto 0 )  ;
  11.        
  12.          Q   :out    std_logic_vector(17 downto 0) )  ;
  13. end entity ;
  14. architecture arch of correla  is
  15.        type RAM is array (0 to 3) of std_logic_vector(3 downto 0) ;
  16.    
  17.        type ram16 is array (0 to 3) of signed(15 downto 0) ;
  18.         type Rom is array (0 to 3) of signed(16 downto 0) ;
  19.         signal CD    : RAM;
  20.         signal temp: ram16;
  21.         signal sum :Rom ;
  22.    
  23.        
  24.        
  25.      
  26.         signal AB    :signed (17 downto 0) ;
  27.        
  28. begin
  29.  
  30.     CD(0) <= code(15 downto 12);
  31.     CD(1) <= code(11 downto 8);
  32.     CD(2) <= code(7 downto 4);
  33.     CD(3) <= code(3 downto 0);   
  34.      étalement:process(clk,rst)
  35.          
  36.         begin
  37.                   if(rst='1') then
  38.                      Q  <=(others=>'0');
  39.                    
  40.                      temp(0)<=x"0000";
  41.                      temp(1)<=x"0000";
  42.                      temp(2)<=x"0000";
  43.                      temp(3)<=x"0000";
  44.                      sum(0)<=x"00000";
  45.                      sum(1)<=x"00000";
  46.                      
  47.                  
  48.                    else
  49.                         if(clk'event and clk ='1') then
  50.                            
  51.                              
  52.                                    
  53.                                       for i in 0 to 3 loop
  54.                                     temp(i) <= signed(data)*signed(CD(i));
  55.                                       end loop ;
  56.                                      
  57.                                       sum(0)<= temp(0)+temp(1) ;
  58.                                       sum(1)<= temp(2)+temp(3) ;
  59.                                      
  60.                                          AB<=sum(0)+sum(1) ;
  61.                                        
  62.                                          Q<=std_logic_vector(AB) ;
  63.                                        
  64. --                               
  65.                                  
  66.                                            
  67.                                  
  68.                              end if ;
  69.                      end if
  70.                                    
  71.                        
  72.                      
  73.             end process ;
  74. end architecture ;


 
voici l'erreur :
Error (10344): VHDL expression error at correla.vhd(70): expression has 16 elements, but must have 17 elements
 

Code :
  1. sum(0)<= temp(0)+temp(1) ;


 
Je vous remercie .

mood
Publicité
Posté le 29-05-2014 à 23:18:37  profilanswer
 

n°2229517
h3bus
Troll Inside
Posté le 29-05-2014 à 23:39:37  profilanswer
 

Oui il faut que sum fasse 17 bits pour gérer l'éventuel overflow.
 
Tu peux passer par un signal intermédiaire, regarder si il y a eu overflow et remettre sur 16 bits si ce n'est pas le cas.


---------------
sheep++
n°2229518
ayo1
Posté le 29-05-2014 à 23:55:50  profilanswer
 

vous avez une idée à propos la fonction ""resize ""  comment je peux l'utiliser ?!

n°2229521
h3bus
Troll Inside
Posté le 30-05-2014 à 00:12:40  profilanswer
 

C'est à dire comment tu peux l'utiliser? Tu en as besoin?
Qu'est ce que tu ne comprends pas dans cette fonction?


---------------
sheep++
n°2229523
sligor
Posté le 30-05-2014 à 00:29:03  profilanswer
 

sum(0)<= ('0' & temp(0)) + ('0' & temp(1));
 
autres trucs et astuces du genre là dedans:
http://www.synthworks.com/papers/v [...] d_2003.pdf


Message édité par sligor le 30-05-2014 à 00:29:32
n°2229524
ayo1
Posté le 30-05-2014 à 00:35:10  profilanswer
 

Oui effectivement !
 

n°2229526
h3bus
Troll Inside
Posté le 30-05-2014 à 08:26:25  profilanswer
 

Attention, ta méthode te fait perdre le bit de signe. Et tu peux te retrouver avec des valeurs qui n'ont rien à voir.
 
Je ne sais plus si l'attribut length est papplicable à un signal. si c'est la cas, cette version est plus sure:

Code :
  1. sum(0) <= resize(temp(0), temp(0)'length+1) +  resize(temp(1), temp(1)'length+1);


 
DE même pour être générique, tu peux déclarer tes signaux en fonction de la taille de tes entrées, Par exemple:

Code :
  1. type ram16 is array (0 to 3) of signed(code'high downto code'low);


 
Aussi, au lieu de faire des cast (signed) sur data et CD, pourquoi ne pas les déclarrer signed?


---------------
sheep++
n°2229528
ayo1
Posté le 30-05-2014 à 08:57:25  profilanswer
 

tu veux dire que je fasse un tableau pour le sihnal ""sum"" !?

n°2229530
ayo1
Posté le 30-05-2014 à 09:19:50  profilanswer
 

comme ça :
 
 type Rom is array (0 to 3) of signed(16 downto 0) ;
 
        signal sum :Rom ;
 
et aprés :
 
   sum(0) <= resize(temp(0), temp(0)'17) +  resize(temp(1), temp(1)'17);
 
ou bien !?  

n°2229532
h3bus
Troll Inside
Posté le 30-05-2014 à 09:23:48  profilanswer
 

Length est un attribut, seulement je ne sais pas si il va s'appliquer correctement à temp(x).
 
Mais ça s'écrit bien temp(0)'length + 1
 
temp(0)'length renvoie la taille de temp 0 (16 ici) et tu ajoute 1 pour ajouter un bit au signal.


---------------
sheep++
mood
Publicité
Posté le 30-05-2014 à 09:23:48  profilanswer
 

n°2229537
ayo1
Posté le 30-05-2014 à 09:54:12  profilanswer
 

ok ! merci


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Divers

  Erreur code vhdl

 

Sujets relatifs
macro code arduinodemande en VHDL
[HTML/PHP]Construction de code d'un site web.que pensez vous de cette extrait de code ?
Erreur d'execution '13' Incompatibilité de typeErreur install SQL 2008 R2
Vérificateur de code postalerreur javascript 55 dans indesign cs6
Problème : Type incompatible (erreur 13)Code pas totalement fonctionnel
Plus de sujets relatifs à : Erreur code vhdl


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR