2017-07-06 4 views
0

J'utilise Quartus Prime Pro.
je traite une fonction en tant que telle:VHDL ne peut pas correspondre contexte d'appel pour to_unsigned dans la fonction définie par l'utilisateur

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

function round_resize (a : unsigned; b : integer) return unsigned is 
    variable c : signed (a'length - 1 downto 0); --problem child 
    variable d : signed (b - 1 downto 0); 
begin 
    c := a + to_signed(2**(b-2), a'length); 
    d := to_unsigned(c(c'length-2 downto (c'length-b-1))); 
    return d; 
end function; 

Mais j'obtiens l'erreur:

Error(13643): VHDL error at file.vhd(109): can't determine definition of operator ""+"" -- found 0 possible definitions

Je changé l'enfant problème à ceci:

c := to_unsigned(a + to_signed(2**(b-2), a'length), a'length); 

Mais je obtenez l'erreur suivante:

Error(13815): VHDL Qualified Expression error at cpmmod.vhd(110): to_unsigned type specified in Qualified Expression must match signed type that is implied for expression by context

Quoi d'autre puis-je essayer de faire ce travail?

+0

Eh bien, vous pourriez [respecter les types] (https://i.stack.imgur.com/5z9aA.jpg) mais on ne sait pas pourquoi vous faites tout cela. – user1155120

+0

@ user1155120 Je ne comprends vraiment pas pourquoi vous ne mettez pas cela dans une réponse ... au lieu de cela, vous êtes juste un lien vers une image du code qui a une réponse! Pourquoi aller si tout cet effort, mais refuse toujours d'afficher une réponse? – JHBonarius

Répondre

4

Vous essayez d'ajouter un signe avec une valeur signée. Vous pouvez convertir l'un des deux pour obtenir le même type sur les variables avant de les ajouter.

2

Nathanael est correct.

Pour comprendre ce qui se passe, vous devez comprendre deux concepts:

i) les opérateurs VHDL sont des fonctions

Lorsque vous utilisez un opérateur, vous appelez vraiment une fonction. Dans le package numeric_std, il existe de nombreuses définitions de divers opérateurs. Par exemple, une définition de l'opérateur + est

function "+" (L, R: UNSIGNED) return UNSIGNED; 

ii) VHDL utilise surcharge

Si vous regardez dans le package numeric_std, vous verrez de nombreuses définitions des + opérateurs:

function "+" (L, R: UNSIGNED) return UNSIGNED; 
    function "+" (L, R: SIGNED) return SIGNED; 
    function "+" (L: UNSIGNED; R: NATURAL) return UNSIGNED; 
    function "+" (L: NATURAL; R: UNSIGNED) return UNSIGNED; 
    function "+" (L: INTEGER; R: SIGNED) return SIGNED; 
    function "+" (L: SIGNED; R: INTEGER) return SIGNED; 

Chacun a une combinaison différente de types d'arguments et de types de retour. Le compilateur peut déterminer lequel appeler par cette combinaison (appelé la signature ). Cette idée est appelée surchargeant. Cela ne fonctionne que s'il y a exactement une fonction possible à appeler. S'il y en a plus d'un, le compilateur ne sait pas lequel appeler; s'il y en a moins d'un, le compilateur n'a pas de fonction à appeler ...

... et c'est votre problème. Si vous regardez les signatures des fonctions d'opérateur + dans numeric_std énumérés ci-dessus, vous verrez qu'il n'y a aucun + opérateurs définis qui combinent SIGNED et UNSIGNED types. Par conséquent, dans votre cas, le compilateur n'a aucune fonction à appeler et la surcharge échoue.

Vous devez réfléchir soigneusement à l'arithmétique que vous souhaitez implémenter, puis convertir tout en SIGNED ou UNSIGNED comme bon vous semble. Vous faites cela facilement en utilisant conversions de type, parce que SIGNED et UNSIGNED sont étroitement liés types (ils sont les deux tableaux de std_logic indexés par un nombre entier).