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.
Quel est le message d'erreur? – Paebbels
(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). –
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) –