Zbudowałem licznik mod-16, a wynikiem wyjściowym jest INTEGER (wszystkie przykłady, które widziałem, użyły INTEGER).
Zbudowałem dekoder szesnastkowy na 7-segmentowy, a jego wejściem jest STD_LOGIC_VECTOR (napisałem to w ten sposób, ponieważ łatwo było zmapować tabelę prawdy).
Chciałbym podłączyć wyjście licznika do wejścia dekodera, ale dostaję błędy „niezgodności typów” podczas próby kompilacji w QuartusII.
Czy istnieje sposób konwersji z typu INTEGER na typ STD_LOGIC_VECTOR na liście VHDL?
Powiedzmy, że twój 4-bitowy licznik miał wyjście INTEGER SOME_INTEGER i chciałeś go przekonwertować na 4-bitowy STD_LOGIC_VECTOR
Można go również użyć do zainicjowania wektorów znaczącymi liczbami
Myślę, że może być konieczne dodanie „użyj IEEE.STD_LOGIC_ARITH.ALL;” i / lub STD_LOGIC_UNSIGNED.
Operacją uzupełniającą jest conv_integer (wektor). Lubię tego używać, kiedy dokonuję porównań. Więc mógłbym zadeklarować
A potem mogę użyć tego w instrukcji if
EDYCJA: Nie powinno być konieczne deklarowanie zmiennej jako liczby całkowitej. Zamiast tego spróbuj zmienić deklarację na std_logic_vector. Operatory + i - działają na wektorach std_logic_vectors.
źródło
Możesz być zainteresowany korzystaniem z typów
unsigned
isigned
odieee.numeric_std
. Są kompatybilnestd_logic_vector
, ale mają interpretację numeryczną (dwójkową lub 2-dopełniającą). Istnieje również opcja wprowadzenia takiej interpretacjistd_logic_vector
, ale nie jest to zalecane .źródło
Jak głosi główna odpowiedź, zalecana metoda jest następująca:
Chciałbym jednak wyjaśnić, dlaczego jest to zalecane i dlaczego VHDL ma tak pozornie skomplikowany sposób przekształcania liczb całkowitych na wektory standardowe.
Wszystko sprowadza się do tego, jak narzędzia te postrzegają te typy.
Vector_logic_vector to dosłownie kilka zer lub jedynek. Mam 10001. Jaki to numer? Cóż, to zależy. Czy jest podpisany czy niepodpisany? SLV nie wie ani nie obchodzi. Ile bitów? Jak długi jest twój SLV?
Liczba całkowita jest podpisana i zwykle 32 bity (jeśli dobrze pamiętam).
Etap 1: Spraw, aby moja liczba całkowita była krótsza i niepodpisana. To jest ta część:
Etap 2: Następnie weź te bity i użyj ich do sterowania my_slv.
(Uwaga na temat terminologii.
A <= B
W VHDL jest odczytywana na głos, ponieważ „A kieruje B”)W połączeniu daje to:
Pochodząc z tradycyjnego programowania, bardzo łatwo utknąć w programistycznym sposobie myślenia. Ale w VHDL kod, który piszesz, ma fizyczne implikacje sprzętowe. Wiedza, dlaczego ta metoda działa i jest zalecana, jest o krok bliżej do zastanowienia się nad tym, co piszesz w kategoriach sprzętowych.
Dodatkowa wskazówka: funkcje poprzedzone przez to_ to te, które skracają / zmieniają operandy. Sprawiają, że stają się niepodpisane, mają określoną długość lub oba. Dlatego to_unsigned wymaga określenia długości. Funkcje bez to_ (w tym przykładzie prosty std_logic_vector (...)) są używane, gdy typy są już bezpośrednio kompatybilne. „Weź te bity i włóż je do tego typu, nie wymaga modyfikacji”. Nie mają one argumentu długości, ponieważ obie strony są już takie same. Więc konstruując takie rzeczy, nie muszę tego sprawdzać, po prostu myślę o tym, jak zmieniam dane.
źródło
Aby przekonwertować liczbę całkowitą na std_logic_vector, masz kilka opcji. Za pomocą numeric_std:
lub
Za pomocą std_logic_arith:
std_logic_arith nie jest standardem ieee, ale większość narzędzi kompiluje go do biblioteki IEEE i jest szeroko stosowana.
źródło