2017-03-27 4 views
0

J'essaie d'utiliser une fonction créée par moi-même (c'est la première fois que j'essaie, donc j'aurais probablement fait quelque chose de mal). Lorsque j'essaie de compiler, le message d'erreur suivant s'affiche: Erreur (13815): Erreur d'expression qualifiée VHDL sur Averageador.vhd (38): le type de division spécifié dans Qualified Expression doit correspondre au type non signé implicite pour l'expression par contexteErreur VHDL: le type spécifié dans Qualified Expression doit correspondre au type implicite pour l'expression par contexte

Divide est le nom de ma fonction. Cette fonction divise toute valeur non signée de 16 bits par une valeur non signée inconnue et donne le résultat sous la forme d'une valeur non signée à 32 bits, où 16 bits sont de chaque côté du point. C'est le code:

library IEEE; 
use IEEE.std_logic_1164.all; 
use IEEE.std_logic_arith.all; 

package propios is 

--function declaration. 
function divide (a : UNSIGNED; b: UNSIGNED) return UNSIGNED; 
end propios; --end of package. 

package body propios is --start of package body 
--definition of function 
function divide (a : UNSIGNED; b: UNSIGNED) return UNSIGNED is 
variable a_int : unsigned(a'length+7 downto 0):= (others => '0'); 
variable b_int : unsigned(b'length-1 downto 0):=b; 
variable r : unsigned(b'length downto 0):= (others => '0'); 
variable q : unsigned(31 downto 0):= (others => '0'); 
begin 
a_int(a'length+7 downto 16):=a; 
for i in a'length+7 downto 0 loop 
    r(b'length downto 1):=r(b'length-1 downto 0); 
    r(0) := a_int(i); 
    if (r>=q) then 
     r:=r-b_int; 
     q(i):='1'; 
    end if; 
end loop; 
return q; 
end divide; 
--end function 
end propios; --end of the package body 

Je retourne q qui est un non signé de 32 bits.

C'est un code dans lequel j'utilise la fonction et invite le message d'erreur:

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

library work; 
use work.propios.all; 

ENTITY test IS --Con alimentación de datos posición a posición, no vector de golpe. 

END test; 
Architecture simple of test is 
signal a:unsigned(15 downto 0); 
signal b:unsigned(13 downto 0); 
signal c: unsigned(31 downto 0); 
begin 


process 
begin 
a<="1100100110100111"; 
b<="00000000000010"; 
c<= divide(a,b); 


end process; 


end simple; 

Toutes les suggestions? Merci

+1

Vous ne montrez pas les déclarations pour vector32 et vector24. Ne pas croiser entre std_logic_arith (paquet propios) et numeric_std (Averagador). Ce n'est certainement pas portable, les deux déclarent signé et non signé, chaque déclaration est unique (utilisez numeric_std). Montrez-nous la fonction testbench qui échoue au lieu de Averageador. L'idée est de pouvoir reproduire le problème. Vous semblez mélanger des métaphores entre signé et non signé. Dans Averageador, il existe deux pilotes pour num_vectores, toutes les affectations doivent être dans le même processus. – user1155120

+0

'si posicion <=" 00000000 "alors la posicion est non signée, elle n'est jamais inférieure à 0. – user1155120

+0

Pour Averageador inter (paramètre de fonction a) longueur 24, a_int longueur 32' a_int (longueur a + 7 jusqu'à 16): = a ; 'générera une erreur dans la division des fonctions. IEEE Std 1076-2008 10.6.2 Affectations de variables simples, 10.6.2.1 paragraphes 5 et 7. Le sous-type de l'expression de droite n'appartient pas au sous-type cible, c'est une erreur. – user1155120

Répondre

1

Le problème est dû (comme l'utilisateur1155120 a déclaré) en utilisant le package std_logic_arith sur le package et numeric_std sur le test. Par conséquent, même si les deux sont appelés non signés, ils ne sont pas compatibles entre eux.

Les deux codes contenaient d'autres erreurs qui ont également été corrigées mais qui n'étaient pas liées à cette première erreur.

C'est le paquet avec une fonction pour diviser 2 nombres non signés avec 16bits après le coma:

library IEEE; 
use IEEE.std_logic_1164.all; 
use IEEE.numeric_std.all; 

package propios is 

--function declaration. 
function divide (a : UNSIGNED; b: UNSIGNED) return UNSIGNED; 
end propios; --end of package. 

package body propios is --start of package body 
--definition of function 
function divide (a : UNSIGNED; b: UNSIGNED) return UNSIGNED is 
variable a_int : unsigned(a'length+15 downto 0):= (others => '0');--Length is 16 bit longer than a 
variable b_int : unsigned(b'length-1 downto 0):=b; 
variable r : unsigned(b'length downto 0):= (others => '0'); 
variable q : unsigned(a'length+15 downto 0):= (others => '0');--Same length as a_int 
variable i: natural; 

begin 
a_int(a'length+15 downto 16):=a;--the MSBits are "a" and the rest will be 0's 
for i in a'length+15 downto 0 loop--division using a modified version of integer division (unsigned) with remainder as seen in: 
--https://en.wikipedia.org/wiki/Division_algorithm 
    r(b'length downto 1):=r(b'length-1 downto 0); 
    r(0) := a_int(i); 
    if (r>=b_int) then 
     r:=r-b_int; 
     q(i):='1'; 
    end if; 
end loop; 
return q; 
end divide; 
--end function 
end propios; --end of the package body 

Ceci est un test simple pour vérifier sa fonctionnalité:

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

library work; 
use work.propios.all; 

ENTITY test IS --Con alimentación de datos posición a posición, no vector de golpe. 

END test; 
Architecture simple of test is 
signal a:unsigned(23 downto 0); 
signal b:unsigned(13 downto 0); 
signal c: unsigned(39 downto 0); 
begin 


process 
begin 
a<="000000001100100110100111"; 
b<="00000000010010"; 
wait for 200ps; 
c<= divide (a , b); 

wait; 
end process; 


end simple; 

Pour vérifier le résultat Gardez à l'esprit que les 16 derniers bits du résultat sont derrière le point fixe.