2012-11-18 23 views
5

Czy istnieje sposób użycia predefiniowanych typów z STD_LOGIC_1164 lub STD_NUMERIC do reprezentowania liczby całkowitej od 0 do 2^32-1? (biorąc pod uwagę domyślny typ całkowity z zakresu od -2^31-1 do 2^31-1)Jak reprezentować liczbę całkowitą większą niż integer'high?

Potrzebuję wprowadzić 32-bitowy licznik i szukałem sposobu na zapisanie kodu przy użyciu typu całkowitego zamiast std_logic_vector .. Dowolny wzór tego?

Lub, lepiej zapytał: Jak najlepiej deklarować 32-bitową (bez podpisu) liczbę całkowitą obsługującą operacje>/<, =, + - /?

Tahnks z góry

Edit1: Jedną z opcji znalazłem zadeklarować sygnał jako std_logic_vector (31 downto 0) i wykonywać konwersje, gdy robi porównań + lub - operacje .. ex: Counter < = licznik + std_logic_vector (unsigned (value) + 1). Nadal nie znalazłem sposobu na podział (w przypadku, gdy na przykład potrzebna jest 1/4 wartości licznika)

+0

Preferuj numeric_std na std_logic_vector, gdzie możesz. Aby podzielić na 4 (lub potęgę 2), spójrz na operatorów zmian w numeric_std lub samodzielnie pokrój wektor. wyjście <= "00" i wejście (31 do 2); –

Odpowiedz

7

Używając typów liczb całkowitych, nie może (przynajmniej nie przenośnie, mogą istnieć niektóre narzędzia VHDL, które wykraczają poza minimum i oferują 64-bitową liczbę całkowitą)

Używając IEEE.numeric_std, możesz zadeklarować Unsigned z pełnym 32-bitowym zakresem (lub 53-bitowym, jeśli chcesz) i powinien zrobić wszystko, co chcesz.need, chyba że źle zrozumiem, o co prosisz.

+0

To rzeczywiście rozwiązało problem. Deklarowałem mój sygnał jako unsigned (31 downto 0) i teraz obsługuje on operacje, których potrzebowałem (czasami używając std_logic_vector (counter) do mapowania do wyjść). Dziękuję za odpowiedź. – mbrandalero

+1

W jaki sposób można zapisać duże liczby całkowite do pliku tekstowego za pomocą write() i writeline()? Zwykle konwertuję na taką liczbę całkowitą jak to_integer (unsigned (sig1)). Nie mogę uwierzyć, że używamy HDL, który nie może natywnie pisać dużych liczb do plików. –

2
use ieee.numeric_std.all; 

a następnie użyć typu unsigned danych - to działa jak bitowym wektorem z operacji matematycznych zdefiniowanych dla niego. Możesz wybrać, ile bitów chcesz. Na przykład:

signal mynum : unsigned(234 downto 0) 
Powiązane problemy