VHDL Comment ajouter un std_logic_vector avec un signal std_logic ensemble?

StackOverflow https://stackoverflow.com/questions/1592582

  •  22-09-2019
  •  | 
  •  

Question

J'ai

douta   : in    std_logic_vector (3 downto 0);
doutb   : in    std_logic_vector (3 downto 0);
c0  : in    std_logic;
f1  : in    std_logic;
f0  : in    std_logic;
res : out   std_logic_vector (3 downto 0);

Je suis en train de construire simple ALU, et l'une des fonctions de cette ALU offre est quand

f1 and f0 both = 1 
res = douta plus b plus c0

j'ai donc écrit

f1 = '1' and f0 = '1' then res <= douta + doutb + c0;

mais de toute évidence son travail ne va pas parce que le type de données de douta et doutb est std_logic_vector alors que co est juste std_logic

et je suis cette erreur lors de la compilation

' Error 603 line 34 : Incompatible types for arithmetic operator: LHS=std_logic_vector!18, RHS=std_logic

une idée comment je peux résoudre ce problème?

modifier ont également essayé

f1 = '1' and f0 = '1' then res <= douta + doutb + ("000" & c0);

mais toujours pas de chance, cette fois le compilateur dit

LHS=std_logic_vector!7, RHS=array_1_of_std_logic_3_d_0
Était-ce utile?

La solution 3

Oh, je pense avoir trouvé une solution, besoin d'ajouter la bibliothèque suivante

use ieee.std_logic_arith.all;

et ce que nous avons essayé fonctionnera :) Merci à @jdehaan

Autres conseils

S'il vous plaît ne pas utiliser std_logic_vector si vous allez faire de l'arithmétique sur eux. Utilisez ieee.numeric_std et utiliser les types de signed ou unsigned. Ensuite, vous pouvez simplement ajouter votre « 0 » ou « 1 » à elle.

La solution d'utiliser std_logic_arith.all est un fudge en utilisant une bibliothèque non standard, ce qui peut vous mettre dans des problèmes de portabilité lorsque vous changez toolchains.

J'ai écrit une page plus détaillée à ce sujet: http://parallelpoints.com/node/3

Il y a eu des discussions à ce sujet sur comp.lang.vhdl ici: http://groups.google.com/group/comp.lang.vhdl/browse_thread/thread/549e1bbffd35914d/83cc0f19350fc392?hl=en&q= groupe:. comp.lang.vhdl + numeric_std # 83cc0f19350fc392 et aussi dans la FAQ comp.lang.vhdl

Vous pouvez transformer c0 en std_logic_vector. Il a été longtemps que j'ai fait VHDL ...

if f1 = '1' and f0 = '1' then
 if c0 = '1' then
   res <= douta + doutb + "0001";
 else
   res <= douta + doutb;
 end if;
end if;

Ceci est probablement pas performant, peut-être le compilateur de silicium synthétise donc quelque chose de bien, peut-être qu'il est une meilleure idée de l'écrire afin que c0 est modifié dans un vecteur, puis ajoutez les trois douta, doutb et le convertisseur c0. Une autre option serait de faire les calculs bit pour bit mais qu'est-ce que vous avez le compilateur?

Il peut sembler ridicule, mais parfois le compilateur produit un meilleur résultat si vous donnez quelques conseils comme celui-ci (juste essayer de sortir et vérifier la sortie, par un petit exemple pas une grosse affaire):

if f1 = '1' and f0 = '1' then
 if c0 = '1' then
   res <= douta + doutb + "0001";
 else
   res <= douta + doutb + "0000";
 end if;
end if;

Un autre conseil, si vous écrivez si ce et les résultats sont quelque peu étrange, introduire un autre pour fixer les états indécis (certains compilateurs se comportent mal si elles ont trop de liberté!). Mais c'est de mon expérience qui est déjà en revenir à l'année 2004 !!!

Vous n'avez pas besoin de convertir le std_logic à un std_logic_vector faire l'addition. Il suffit de faire l'addition comme il est, et assurez-vous que « res » a assez de bits pour contenir la réponse max. Dans ce cas res doit être 5 bits de large pour qu'il déborder maintenant.

Et comme nit de style, ne nommez pas vos ports d'entrée "dout". C'est une mauvaise forme. Appelez-les ici din, parce que ce qu'ils sont. Et dans l'architecture que instantie ce que vous connectez le port de sortie d'un autre composant nommé « dout » aux « vacarme » de ce composant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top