Je peux faire l’addition, la soustraction et la division mais je ne peux pas faire de multiplication

Alaz Ozer

Je peux faire l’addition, la soustraction et la division mais je ne peux pas faire de multiplication


Voici mes fichiers topmodule et testbench. Quelle est mon erreur?

 library  IEEE ; 
 use  IEEE . NUMERIC_STD . ALL ; 

 entity  celcius_to_fah is   
   Port   (  c :   in   unsigned   ( 6   downto   0 ); f :   out   unsigned   ( 8   downto   0 )); 
   constant  coef :   unsigned ( 7   downto   0 ):= "00100000" ; 
 end  celcius_to_fah ; 

 architecture  dataflow_model of  celcius_to_fah is 
 begin f <=  coef2 * c ; 
 end  dataflow_model ; 

banc d’essai

 library  IEEE ; 
 use  IEEE . NUMERIC_STD . ALL ; 

 entity  sim is 
 end  sim ; 

 architecture  dataflow of  sim is 
   component  celcius_to_fah Port   (  c :   in   unsigned   ( 6   downto   0 ); f :   out   unsigned   ( 8   downto   0 )); 
   end   component ; 

   signal  ct :   unsigned   ( 6   downto   0 ):= "0000100" ; 
   signal  ft :   unsigned   ( 8   downto   0 ); 

 begin uut :  celcius_to_fah port   map ( c => ct ,  f => ft ); 

   process 
   begin 
     wait   for   5 ns ; ct <= "0001000" ; 
   end   process ; 

 end  dataflow ; 

Elliot Alderson

Quelle réponse attendez-vous pour ft, et quelle valeur voyez-vous réellement pour ft? Avez-vous essayé de faire le calcul sur du papier brouillon, alors voyez quel devrait être le résultat? Avez-vous essayé d’autres valeurs de ct pour voir si l’une d’entre elles pourrait produire une valeur correcte pour ft?

Alaz Ozer

enfin j’ai résolu ma question … j’ai appris que je dois définir une sortie vectorielle non signée 15 bits pour la multiplication car j’ai des entrées 7 bits et 8 bits. 7 + 8 = 15 bits. Ceci est une vraie déclaration mais je ne peux pas le prouver. Quelqu’un peut-il expliquer pourquoi je dois définir un vecteur de sortie 15 bits?

Spehro Pefhany

Qu’est-ce que coef2? Avez-vous suffisamment de bits pour le produit?

user8352

Aucun de vos fichiers de conception n’est un VHDL valide, les deux clauses q use manquantes ( use ieee.std_logic_1164.all; ) offrant une visibilité pour la déclaration de type std_ulogic lors de la conversion des littéraux de chaîne en tableaux non signés. Quel outil? coef2 n’est pas déclaré. « * » [unsigned, unsigned return unsigned] fournit un résultat dont la longueur est la somme de deux longueurs d’opérande.

Réponses


 Elliot Alderson

Maintenant que vous avez identifié la solution, je vais vous aider à comprendre pourquoi.

Vous multipliez un nombre de 7 bits avec une valeur maximale de 127 par un nombre de 8 bits avec une valeur maximale de 255. Si vous faites le calcul, vous constatez que la valeur maximale du produit est 32 385, ce qui nécessite au moins 15 bits pour être représenté comme un nombre binaire.

La valeur réelle que vous avez utilisée pour coef2 était de 32, donc pour les petites valeurs de c, vous avez obtenu la valeur correcte pour f. Si vous savez que le coefficient tiendra en 6 bits, vous n’aurez besoin que de 13 bits pour le produit.

Harry Svensson

N’oublions pas de mentionner que la multiplication des nombres en base

 

#de, #et, #la, #pas, division, Faire, je, l’addition, mais, multiplication, ne, peux, soustraction

 

google

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *