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
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
'si posicion <=" 00000000 "alors la posicion est non signée, elle n'est jamais inférieure à 0. – user1155120
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