VHDL-93 permet des conversions de types et fonctions de conversion dans les listes d'association. Une fonction de conversion est un cas particulier d'une fonction avec un seul argument.
Regardons à la déclaration de to_bit
:
function to_bit(s : std_ulogic; xmap : bit := '0') return bit;
Bien que to_bit(s)
ressemble à une fonction de conversion valide, ce n'est pas, parce que la déclaration contient deux arguments. Le deuxième argument xmap
est utilisé comme résultat lorsque is_x(s)
est vrai.
Ceci est pas un bug ModelSim, mais peut-être le message d'erreur est un peu cryptique. ModelSim chiffre que to_bit
est censé être une fonction de conversion, mais refuse de l'utiliser, car il a un second argument, et n'est donc pas une fonction de conversion valide.
Une fonction simple emballage peut résoudre le problème:
function to_bit(s : std_ulogic) return bit is
begin
return to_bit(s, '0');
end;
Notez que la fonction peut aussi avoir le nom to_bit
, parce que VHDL supporte la surcharge de fonction. Ce serait bien d'avoir ceci dans le paquet std_logic_1164.
Si j'écris une fonction wrapper à "to_bit" dans un paquet, puis si j'utilise cette fonction, alors cela fonctionne.Code 'package: mgc_package paquet est mgc_to_Bit fonction (p: std_ulogic) bit de retour; paquet final; Le corps du package mgc_package est function mgc_to_Bit (p: std_ulogic) le bit de retour est begin return to_bit (p); fin; corps de l'embout; VHDL Cas: travail de bibliothèque; utilise work.mgc_package.all; l'architecture a un est .... commencent inst: b carte du port (IN11 => mgc_to_Bit (in1)); fin a; ' Si je peux utiliser une fonction sur réelle dans un portmap, alors pourquoi ne puis-je pas utiliser la fonction" to_bit "elle-même? – Dharmendra
to_bit est défini dans le paquet standard, donc en fait c'est la même situation ... aucune idée de pourquoi cela devrait fonctionner – BennyBarns
La réponse Christian U. montre pourquoi une fonction de conversion fonctionnerait. Voir 4.3.3.2 Listes d'associations, * fonction de conversion * (6.5.7.1 en -2008), le problème est le nombre de paramètres surmontés en -2008 (6.5.6.3 clauses Port) en associant un signal implicitement déclaré à la cible d'une affectation simultanée de la valeur de l'expression (par exemple un appel de fonction avec un sous-type globalement statique pour une marque de type retour). – user1155120