2010-10-28 12 views
16

Chcę mieć prosty moduł, który dodaje dwa std_logic_vectors. Jednak, używając poniższego kodu , operator + nie syntezuje.Błąd podczas dodawania 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; 

Komunikat o błędzie otrzymuję od XST

linii 17. + nie może mieć takich argumentów w tym kontekście.

Czy tęsknię za biblioteką? Jeśli to możliwe, nie chcę przekształcać danych wejściowych w liczby naturalne.

Dziękujemy

Odpowiedz

19

Jak chcesz kompilator wiedzieć, czy std_logic_vectors są podpisane lub niepodpisane? Implementacja dodatku nie jest taka sama w tych dwóch przypadkach, więc musisz wyraźnie powiedzieć kompilatorowi, co chcesz zrobić ;-)

Uwaga: Podświetlanie składni języka VHDL w StackOverflow jest brzydkie. Skopiuj/wklej ten kod do preferowanego edytora VHDL, aby łatwiej go odczytać.

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

Dobra rada @Aurelien do użycia numeric_std.

Należy pamiętać, że dodanie dwóch 32-bitowych wartości może dać 33-bitową wartość i zdecydować, w jaki sposób obsługiwać przepełnienie.

4

Nie używać std_logic_arith - Mam written about this (w pewnym zakresie :).

Wykonaj użyj numeric_std - i używaj odpowiedniego typu na swoich portach jednostek. Jeśli wykonujesz operacje arytmetyczne, użyj typów liczbowych (odpowiednio liczb całkowitych lub (nie) wektorów podpisanych). Będą doskonale syntetyzować.

std_logic_vector s są dobre dla

  • jeśli nie dbają o wartościach liczbowych (zestaw bitów kontrolnych, kilka losowych bitów danych)
  • kiedy nie wiesz o typie input (na przykład sumator, który może operować na podpisanych i niepodpisanych numerach na podstawie flagi kontrolnej).
+0

I polecam sprawdzić odnośnik Martina. – George

-1

Łatwy sposób na rozwiązanie tego błędu jest:
Dodaj bibliotekę z odpisać,
Po że kod rozpoczyna pracę.

Zastosowanie

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

jak @Martin Thompson powiedział, korzystanie z tej biblioteki nie jest zalecane. – grorel

+0

możesz wyjaśnić? –

+0

Wszystko jest w linku w odpowiedzi Martina Thompsona. 'std_logic_arith''std_logic_unsigned' i' std_logic_signed' to niestandardowe biblioteki opracowane przez streszczenie. 'numeric_std' jest standardową biblioteką. – grorel

Powiązane problemy