J'ai construit un compteur mod-16, et le résultat de sortie est un INTEGER (tous les exemples que j'ai vus utilisaient INTEGER).
J'ai construit un décodeur d'affichage hexadécimal à 7 segments, et son entrée est un STD_LOGIC_VECTOR (écrit de cette façon car il était facile de cartographier la table de vérité).
Je voudrais connecter la sortie du compteur à l'entrée du décodeur, mais j'obtiens des erreurs de `` discordance de type '' lorsque j'essaie de compiler dans QuartusII.
Existe-t-il un moyen de convertir d'un type INTEGER en un type STD_LOGIC_VECTOR dans une liste VHDL?
Disons que votre compteur 4 bits avait une sortie INTEGER SOME_INTEGER, et que vous vouliez la convertir en un STD_LOGIC_VECTOR 4 bits
Vous pouvez également l'utiliser pour initialiser des vecteurs avec des nombres significatifs
Je pense que vous devrez peut-être ajouter "use IEEE.STD_LOGIC_ARITH.ALL;" et / ou STD_LOGIC_UNSIGNED.
L'opération complémentaire est conv_integer (vecteur). J'aime l'utiliser lorsque je fais des comparaisons. Je pourrais donc déclarer
Et puis, plus tard, je peux l'utiliser dans une instruction if
EDIT: vous ne devriez pas avoir besoin de déclarer la variable comme un entier. Essayez de remplacer la déclaration par std_logic_vector à la place. Les opérateurs + et - fonctionnent sur std_logic_vectors.
la source
Vous pouvez être intéressé par l'utilisation des types
unsigned
etsigned
deieee.numeric_std
. Ils sont compatibles avecstd_logic_vector
, mais ont une interprétation numérique (binaire ou complément à 2). Il y a aussi la possibilité de mettre une telle interprétationstd_logic_vector
, mais ce n'est pas recommandé .la source
Comme le dit la réponse principale, la méthode recommandée est la suivante:
Cependant, je voudrais expliquer pourquoi cela est recommandé et pourquoi VHDL a une manière si compliquée de convertir des entiers en std_logic_vectors.
Cela revient à la façon dont ces types sont vus par les outils.
Un standard_logic_vector est littéralement un groupe de 1 ou de 0. J'ai 10001. De quel numéro s'agit-il? En fait ça dépend. Est-il signé ou non signé? Ce SLV ne sait pas ou ne se soucie pas. Combien de bits? Eh bien, combien de temps dure votre SLV?
Un entier est signé, et généralement 32 bits (si je me souviens bien).
Étape 1: rendre mon entier plus court et non signé. Voilà cette partie:
Étape 2: Ensuite, prenez ces bits et utilisez-les pour piloter le my_slv.
(Une note sur la terminologie.
A <= B
En VHDL est lue à haute voix comme "A est entraîné par B")Combiné, cela vous donne:
En venant d'un contexte de programmation traditionnel, il est très facile de rester coincé dans une manière de penser la programmation. Mais en VHDL, le code que vous écrivez a des implications physiques sur le matériel. Savoir pourquoi cette méthode fonctionne et est recommandée est un pas de plus vers la réflexion sur ce que vous écrivez en termes matériels.
Astuce bonus: les fonctions préfixées par to_ sont celles qui raccourcissent / modifient les opérandes. Ils les rendent non signés ou d'une certaine longueur ou les deux. C'est pourquoi to_unsigned vous oblige à spécifier la longueur. Les fonctions sans to_ (straight std_logic_vector (...) dans cet exemple) sont utilisées lorsque les types sont déjà directement compatibles. "Prenez ces bits et remplissez-les de ce type, aucune modification requise". Ceux-ci n'ont pas d'argument de longueur car les deux côtés sont déjà identiques. Donc, quand je construis des choses comme ça, je n'ai pas besoin de le chercher, je pense juste à la façon dont je modifie les données.
la source
Pour convertir un entier en std_logic_vector, vous avez plusieurs options. Utilisation de numeric_std:
ou
Utilisation de std_logic_arith:
std_logic_arith n'est pas un standard ieee, mais la plupart des outils le compilent dans la bibliothèque IEEE et il est largement utilisé.
la source