2017-03-27 4 views
0

Ich versuche eine von mir erstellte Funktion zu verwenden (es ist das erste Mal, dass ich es versuche, damit ich etwas falsch gemacht habe).VHDL-Fehler: Der in Qualified Expression angegebene Typ muss dem vom Ausdruck implizierten Typ entsprechen

Wenn ich versuche zu kompilieren, bekomme ich die folgende Fehlermeldung: Fehler (13815): VHDL Qualified Expression Fehler bei Averageador.vhd (38): divide Typ in Qualified Expression angegeben muss vorzeichenlosen Typ entsprechen, der für Ausdruck durch Kontext impliziert wird

Divide ist der Name meiner Funktion. Diese Funktion teilt jeden vorzeichenlosen 16-Bit-Wert durch einen unbekannten vorzeichenlosen Wert und gibt das Ergebnis als vorzeichenlosen 32-Bit-Festkommawert an, wobei 16 Bit auf jeder Seite des Punkts liegen. Dies ist der 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 

Ich gebe q zurück, das ist ein 32-Bit unsigned.

Dies ist ein Code, in dem ich die Funktion verwenden und fordert die Fehlermeldung:

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; 

Irgendwelche Vorschläge? Danke

+1

Sie zeigen die Deklarationen für vector32 und vector24 nicht an. Überqueren Sie nicht std_logic_arith (Paket Propios) und numeric_std (Ageragador). Es ist definitiv nicht portierbar, beide deklarieren signiert und unsigniert, jede Deklaration ist eindeutig (benutze numeric_std). Zeigen Sie uns die Funktionstestbank, die anstelle von Averageador ausfällt. Die Idee ist, das Problem reproduzieren zu können. Sie scheinen Metaphern zwischen signiert und unsigniert zu mischen. In Averageador gibt es zwei Treiber für num_vectores, alle Zuordnungen sollten im selben Prozess sein. – user1155120

+0

'wenn posicion <=" 00000000 "dann ist posicion unsigned, es ist nie weniger als 0. – user1155120

+0

Für Averageador inter (Funktionsparameter a) Länge 24, a_int Länge 32' a_int (a'Länge + 7 bis 16): = a ; 'erzeugt einen Fehler in der Funktion divide. IEEE Std 1076-2008 10.6.2 Einfache Variablenzuweisungen, 10.6.2.1 Absätze 5 und 7. Der Subtyp des Ausdrucks auf der rechten Seite gehört nicht zum Ziel-Subtyp, das ist ein Fehler. – user1155120

Antwort

1

Das Problem wird verursacht (wie user1155120 sagte), indem das Paket std_logic_arith auf dem Paket und numeric_std auf dem Test verwendet. Selbst wenn beide als nicht signiert bezeichnet werden, sind sie daher nicht miteinander kompatibel.

Beide Codes enthielten andere Fehler, die ebenfalls korrigiert wurden, aber nicht mit diesem ersten Fehler zusammenhingen.

Dies ist das Paket mit einer Funktion zum Teil 2 unsigned Zahlen mit 16 Bit nach dem Koma:

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 

Dies ist ein einfacher Test, um seine Funktionalität zu überprüfen:

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; 

das Ergebnis zu überprüfen Bedenken Sie, dass die letzten 16 Bits des Ergebnisses hinter dem Fixpunkt liegen.

Verwandte Themen