VHDL: Trouver/reporting bits largeur/longueur de integer (vs std_logic_vector)?
Dire que j'ai besoin d'un signal pour représenter les nombres de 0 à 5; évidemment, cela a besoin de 3 bits de std_logic d'être représenté (je.e si MAXVAL=5, alors bitwidth= {wcalc "floor(logtwo($MAXVAL))+1"
}).
Je suis conscient que je pourrais faire:
SIGNAL myLogicVector : STD_LOGIC_VECTOR(2 downto 0) := 5;
avec laquelle j'avais spécifier explicitement un tableau de trois std_logic bits, et de définir la valeur initiale; ensuite, j'ai pu utiliser le RAPPORT pour imprimer la longueur (dans ce cas, 3):
report("Bit width of myLogicVector is "& integer'image(myLogicVector'length));
Donc bon. Mais, disons que j'utilise un entier (nombre) type de lieu:
SIGNAL myInteger : NATURAL range 0 to 5 := 5;
Je suppose qu'ici le "compilateur" (l' "synthétiseur"), automatiquement en déduire qu'il a besoin de 3 bits de longueur de stockage, que cet entier est varié avec des valeurs entre 0 et 5. Si c'est le cas, mon question est: est-il possible de faire en quelque sorte imprimer cette bits largeur/longueur/taille dans un RAPPORT?
Le truc, c'est, bien sûr, que quelque chose comme cela:
report("Bit width of myInteger is "& integer'image(myInteger'length));
... échoue (par exemple, avec "HDLParsers:3389 - Préfixe de l'attribut 'la longueur doit être un objet de tableau"), depuis aussi loin que je me recueillir, tous ces attributs comme 'length
et 'range
ne sont applicables qu'à tableaux (Comprendre VHDL Attributs), tandis qu'un entier (naturel) n'est pas un tableau, c'est d'un nombre 🙂 (VHDL vecteur de conversion d'entier question)
Encore une fois, je suis conscient que je pourrais peut-être utiliser un log2 (Le calcul de la largeur d'un entier non signé de la variable valeur maximale?) - mais ce que j'aimerais c'est juste pour voir rapidement (lors de la synthèse) nombre de "bits", le "synthétiseur' alloué pour une éventuelle synthétisés de la conception, et donc environ combien serait être utilisé dans des conditions de finale de ressources FPGA (surtout si je ne l'utiliserais 'génériques' en quelque sorte à calculer une valeur maximale pour un entier).
Bien, merci d'avance pour toutes les réponses,
Cheers!
EDIT: un peu de contexte: je suis en utilisant ISE Webpack 9.2; je suis en train d'utiliser "générique" des variables/constantes en tant que paramètres, puis utiliser des équations pour calculer les valeurs maximales pour les compteurs. Ce calcul, je suppose que se produit a 'compiler' temps (et qui serait "Synthétiser" dans ISE - ne pas mettre en Œuvre la Conception"), et c'est là où je veux les messages de rapport (et en fait, j'ai les ai donc, pour std_logic_vector bon, dans la synthèse du journal - toutefois, le même rapport des messages pour moi se produire au début de la simulation comportementale de trop, ce qui est bien).
Et le but de ces messages est de s'assurer à la fois que mes équations sont OK, et que le synthétiseur de ne pas essayer d'en déduire un 32 bits compteur - même si je veux compter juste de 0 à 5 🙂
Salut @George, merci pour votre commentaire! J'ai ajouté un peu de précisions pour l'OP; je suppose que ce que je veux, c'est des messages à "compiler" le temps (à l'exception, de la façon dont je le vois, pour ISE au moins: le temps de compilation = synthèse?!)
Non, vous ne pouvez pas attribuer de la valeur de nombre entier de 5 à un vecteur. Vous pouvez essayez d'attribuer les bits de la chaîne littérale "101".
Salut @Philippe, merci pour le commentaire! Je pense qu'on peut toujours utiliser une conversion comme "
std_logic_vector(to_unsigned(5, x'length)
" - mais alors, vous devez spécifier le nombre de bits de largeur à la main; j'ai été autrement la recherche d'un moyen pour le synthétiseur de me dire automatiquement la nécessaire bits largeur 🙂 Cheers!
OriginalL'auteur sdaau | 2011-03-04
Vous devez vous connecter pour publier un commentaire.
Selon les spec, elle devrait l'être, mais il n'est pas nécessaire. IEEE 1076.6-2004:
Je peux dire définitivement au moins un outil de synthèse ne pas utilisation gamme de cette manière que j'ai eu pour déboguer la vérification formelle miscompares.
Pour Xilinx Fpga, le XST rapport de synthèse sera de dire lequel des éléments de stockage ont les bits non utilisés, mais pas de simples fils.
Salut sdaau. Vous n'avez pas besoin d'exécuter PAR pour obtenir le registre de comptage. C'est fait avec XST qui est la première étape. Regardez dans le .syn fichier.
Merci pour l'astuce, @Adam12!
Ce n'est pas correct. La contrainte de plage fait partie de la sous-type d'indication. Il n'ya aucune raison pourquoi un outil de synthèse ne serait pas le prendre en compte en amont, avant la logique d'optimisation.
ENTIER est près de 32 bits, mais pas tout à fait. La langue spec appels pour +/- (2^32)-1 pour être pris en charge, mais pas de -2^32.
OriginalL'auteur
En principe, la représentation d'une VHDL entier n'est pas défini.
Dans la pratique, on peut normalement supposer qu'une synthèse de l'outil utiliser un 2 en complément de la représentation, en tenant compte de la contrainte de plage. Par conséquent, la relation entre la contrainte de plage et de la mise en œuvre bits largeur est simple, même si les rapports le peu de largeur de l'intérieur de VHDL n'est pas.
OriginalL'auteur Jan Decaluwe
Cela peut être résolu comme suit:
D'abord, déclarer un nouveau sous-type correspondant à la plage qui doit être utilisé pour
myInteger
. (Puis déclarermyInteger
comme un signal de ce type, et non pas directement de l'intervalle entier).Ensuite, déclarer un mannequin de type tableau à l'aide de la plage déclaré que l'indice de gamme, et ensuite utiliser le
'length
de que:OriginalL'auteur mkrieger1
Vous pouvez toujours utiliser:
rapport("Bits largeur de myInteger est "& entier image(myInteger c'est parti - myInteger'Right));
OriginalL'auteur Gonzalo Pacheco