2017-09-18 1 views
-1

Est-ce que quelqu'un sait pourquoi ce code VHDL ne compile pas? (J'utilise ModelSim)Est-ce que quelqu'un sait pourquoi ce code VHDL ne compile pas?

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_ARITH.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL; 
use ieee.NUMERIC_STD.all; 

Entity PartC IS 
Generic (constant N: natural := 1); 
Port 
( A : IN std_logic_vector(15 downto 0); 
S0,S1,Cin : IN std_logic; 
    F : OUT std_logic_vector(15 downto 0)); 
End Entity PartC; 

Architecture CCC of PartC IS 
Begin 
    F <= std_logic_vector(unsigned(A) srl N) when S1='0' And S0='0' 
    Elsif std_logic_vector(unsigned(A) ror N) when S1='0' And S0='1' 
    Elsif std_logic_vector(unsigned(A) ror Cin) when S1='1' And S0='0' 
    Elsif std_logic_vector(unsigned(A) sra N); 
End CCC; 
enter code here 

Ceci est une partie de 16 bits ALU qui accepte les deux entrées de 16 bits et les valeurs AB et fournit 16 bits de sortie F.

+0

Quel est le message d'erreur? – Paebbels

+0

(vcom-1078) L'identificateur "unsigned" n'est pas directement visible. Impossible de résoudre le type d'expression de l'expression infixe. ** Erreur: (vcom-1583) Convecteur de type illégal de 'inconnu' à 'ieee.std_logic_1164.STD_LOGIC_VECTOR' (le type d'opérande n'est pas connu). –

+3

Trop de bibliothèques non standard, masquant numeric_std.unsigned. Supprimez std_logic_arith et std_logic_unsigned. (Aussi, une certaine confusion entre Else et Elsif) –

Répondre

2

Vous semblez vous fier à la version Mentor du paquet std_logic_arith qui inclut srl, ror, sra etc. alors que la version Synopsys du paquet std_logic_arith ne l'est pas.

Il existe deux problèmes lors de l'utilisation de ce package. Il y a d'abord une erreur de syntaxe où elsif s devrait être else s et la seconde il n'y a pas de ror défini avec une distance de rotation qui est un std_logic (ou std_ulogic, le type de base).

corriger ces:

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_arith.all; -- Mentor 

entity partc_mentor is 
    generic (constant n: natural := 1); 
    port ( 
     a:   in std_logic_vector(15 downto 0); 
     s0, s1, cin: in std_logic; 
     f:   out std_logic_vector(15 downto 0) 
    ); 
end entity partc_mentor; 

architecture ccc of partc_mentor is 
begin 
    f <= std_logic_vector(unsigned(a) srl n) when s1 = '0' and s0 = '0' else 
     std_logic_vector(unsigned(a) ror n) when s1 = '0' and s0 = '1' else 
     std_logic_vector(unsigned(a) ror conv_integer(unsigned'("") & cin)) 
              when s1 = '1' and s0 = '0' else 
     std_logic_vector(unsigned(a) sra n); 
end ccc; 

Et votre code analyse ensuite. Notez que cin est promu à une valeur de tableau non signé en concaténant une chaîne null. L'expression qualifiée consiste à distinguer les opérateurs de concaténation dans lesquels le type de la chaîne nulle ne serait pas facilement apparent.

Cela peut également être effectué à l'aide des packages dérivés IEEE numeric_std. Cependant, sra est sorti du paquet avant la révision -2008, qui introduit également le paquet numeric_std_unsigned pour fournir la fonctionnalité trouvée dans le paquet Synopsys std_logic_arith_unsigned et fournit une arithmétique non signée sur les valeurs de std_logic_vector. (Mentor ne fournit pas un package comparable).

L'utilisation d'un outil d'analyse simulateur ou la synthèse (compilateur) qui prend en charge les -2008 versions des progiciels standard IEEE ressemblerait à ceci:

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std_unsigned.all; 

entity partc_ieee is 
    generic (constant n: natural := 1); 
    port ( 
     a:   in std_logic_vector(15 downto 0); 
     s0, s1, cin: in std_logic; 
     f:   out std_logic_vector(15 downto 0) 
    ); 
end entity partc_ieee; 

architecture ieee of partc_ieee is 
begin 
    f <= a srl n     when s1 = '0' and s0 = '0' else 
     a ror n     when s1 = '0' and s0 = '1' else 
     a ror to_integer("" & cin) when s1 = '1' and s0 = '0' else 
     a sra n; 

end architecture ieee; 

Ce code analyse également et dépend de la fonction to_integer définie dans numeric_std_unsigned. Avec aucun autre opérateur de concaténation visible avec un paramètre correct qui est une valeur std_logic/std_ulogic, il n'y a pas besoin d'une expression qualifiée.