2010-10-28 10 views
16

Ich möchte ein einfaches Modul haben, das zwei std_logic_vectors hinzufügt. Wenn Sie jedoch den folgenden Code mit dem Operator + verwenden, wird er nicht synthetisiert.Fehler beim Hinzufügen von std_logic_vectors

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

entity add_module is 
     port(
    pr_in1 : in std_logic_vector(31 downto 0); 
    pr_in2 : in std_logic_vector(31 downto 0); 
    pr_out : out std_logic_vector(31 downto 0) 
     ); 
end add_module; 

architecture Behavior of add_module is 

begin 

    pr_out <= pr_in1 + pr_in2; 

end architecture Behavior; 

Die Fehlermeldung, die ich von XST bekommen

Linie 17 + kann nicht haben solche Operanden in diesem Zusammenhang.

Vermisse ich eine Bibliothek? Wenn möglich, möchte ich die Eingaben nicht in natürliche Zahlen umwandeln.

Vielen Dank

Antwort

19

Wie wollen Sie die Compiler wollen, wissen, ob Ihr std_logic_vectors oder unsigned unterzeichnet? Die Adder-Implementierung ist in diesen beiden Fällen nicht identisch. Sie müssen also dem Compiler explizit mitteilen, was er tun soll ;-)

Hinweis: VHDL-Syntaxhervorhebung in StackOverflow ist beschissen. Kopieren Sie diesen Code in Ihren bevorzugten VHDL-Editor, um ihn einfacher zu lesen.

library IEEE; 
use IEEE.std_logic_1164.all; 
-- use IEEE.std_logic_arith.all; -- don't use this 
use IEEE.numeric_std.all; -- use that, it's a better coding guideline 

-- Also, never ever use IEEE.std_unsigned.all or IEEE.std_signed.all, these 
-- are the worst libraries ever. They automatically cast all your vectors 
-- to signed or unsigned. Talk about maintainability and strong typed language... 

entity add_module is 
    port(
    pr_in1 : in std_logic_vector(31 downto 0); 
    pr_in2 : in std_logic_vector(31 downto 0); 
    pr_out : out std_logic_vector(31 downto 0) 
); 
end add_module; 

architecture Behavior of add_module is 
begin 

    -- Here, you first need to cast your input vectors to signed or unsigned 
    -- (according to your needs). Then, you will be allowed to add them. 
    -- The result will be a signed or unsigned vector, so you won't be able 
    -- to assign it directly to your output vector. You first need to cast 
    -- the result to std_logic_vector. 

    -- This is the safest and best way to do a computation in VHDL. 

    pr_out <= std_logic_vector(unsigned(pr_in1) + unsigned(pr_in2)); 

end architecture Behavior; 
0

Guter Rat von @Aurelien numeric_std zu verwenden.

Bedenken Sie, dass das Hinzufügen von zwei 32-Bit-Werten zu einem 33-Bit-Wert führen und entscheiden kann, wie Sie den Überlauf behandeln möchten.

4

Nicht verwenden std_logic_arith - Ich habe written about this (zu einer gewissen Länge :).

Verwenden Sie numeric_std - und verwenden Sie den richtigen Typ für Ihre Entity-Ports. Wenn Sie arithmetisch arbeiten, verwenden Sie numerische Typen (entweder ganze Zahlen oder Vektoren mit oder ohne Vorzeichen). Sie werden sich perfekt synthetisieren.

std_logic_vector s sind gut für

  • wenn Sie numerische Werte (ein Satz von Steuerbits, einige zufällige Datenbits) do not care
  • , wenn Sie über die Art der die nicht wissen, Eingabe (sagen wir einen Addierer, der basierend auf einem Kontrollflag sowohl mit vorzeichenbehafteten als auch mit nicht signierten Nummern arbeiten kann).
+0

Ich empfehle Martin Link Check-out. – George

-1

Der einfache Weg, um diesen Fehler zu lösen ist:
Bibliothek von unsign hinzufügen,
Danach Code zu arbeiten beginnt.

Verwenden

ieee.std_logic_unsigned.all; 
pr_out <= pr_in1 + pr_in2; 
+0

als @Martin Thompson sagte, die Verwendung dieser Bibliothek wird nicht empfohlen. – grorel

+0

können Sie erklären? –

+0

Alles ist in der Verbindung in Martin Thompson Antwort. 'std_logic_arith''std_logic_unsigned' und' std_logic_signed' sind nicht standardisierte Bibliotheken, die von synopsis entwickelt wurden. 'numeric_std' ist die Standardbibliothek. – grorel