2013-09-25 14 views
8

W symulacji działa to idealnie. Czy jest to najlepszy sposób sprawdzania zer zerowych dla kodu możliwego do syntezy. Jakie byłyby zasoby generowane?Porównanie długiego std_logic_vector do zera

signal vector_slv : std_logic_vector(2048 downto 0); 
... 
if (vector_slv = (vector_slv'range => '0')) then 
    -- do something... 

Czy istnieje jakikolwiek inny optymalny sposób wdrożenia tego rozwiązania z uwzględnieniem mapowania h/w (z optymalnym wykorzystaniem zasobów).

Byłbym bardziej zainteresowany zrozumieniem używanych zasobów.

Odpowiedz

5

Nie ma sposobu, który miałby mniejszy sens w syntezie. Napisz kod, który najlepiej wyraża Twoją intencję.

Jeśli porównujesz wektor dla wszystkich zer, wszystkie poniższe wyniki powinny dawać takie same wyniki lub powinieneś zgłosić poważny błąd przeciwko narzędziu!

signal vector_slv : std_logic_vector(2048 downto 0); 
constant zeros : std_logic_vector(vector_slv'range) := (others => '0'); 
... 
if vector_slv = (vector_slv'range => '0') then 
    -- do something... 
if vector_slv = zeros then 
    -- do something... 
if unsigned(vector_slv) = to_unsigned(0, vector_slv'length) then 
    -- do something... 

a nawet krótsze wektorów, które mieszczą się w całkowitej:

if intvar = 0 then 

będą dokładnie takie same jak każde 32-bitowy wektor porównania.

(BTW, trzeba pamiętać, nie ma potrzeby stosowania nawiasów wokół kondycji if - VHDL nie jest C :)

1

Jeśli chodzi o syntezę, tak, takie proste konstrukcje są zwykle optymalizowane dość dobrze przez narzędzie. Dokładny układ sprzętu zależy oczywiście od tego, jaki jest twój cel (FPGA, ASIC, ...).

Moja sugestia to przyjrzenie się wynikowi syntezy (np. Technology Map Viewer dla FPGA Altera). Jeśli synteza go skłoni, możesz ręcznie przekonwertować ją na drzewo binarne porównań z zerem, biorąc pod uwagę dostępne prymitywy technologiczne. Może to być jednak o wiele trudniejsze, niż się wydaje, szczególnie w przypadku układów FPGA (jest tam więcej niż LUT, z którymi można grać) i nie powinno być konieczne przy użyciu przyzwoitego narzędzia.

6

Jeśli zakres jest dostępny, tak jak w przykładowym kodzie, propozycja rozwiązania wygląda dobrze i oczekuję, że narzędzia do syntezy zostaną wykonane w taki sposób, aby obsługiwały konstrukcje .

Jeżeli zakres nie jest dostępny, a następnie porównać z zera może być wykonane jak:

library ieee; 
use ieee.numeric_std.all; 
... 
    if unsigned({std_logic_vector expression of any length}) = 0 then 
    -- do something... 

Spodziewam się, że narzędzia syntezy obsłużyć to samo było jak porównać z (vector_slv'range => '0').

Powiązane problemy