Jestem trochę zdezorientowany, jeśli powinienem używać liczb całkowitych w VHDL do sygnałów syntezy i portów itp.
Używam std_logic w portach najwyższym poziomie, ale wewnętrznie I został za pomocą liczb całkowitych dystansowych wszędzie. Natknąłem się jednak na kilka odniesień do osób, które mówią, że powinieneś używać tylko podpisanego / niepodpisanego dla kodu kierowanego na syntezę.
Poszedłem i przerobiłem mój obecny projekt, aby użyć niepodpisanego ... i, cóż, jest znacznie brzydszy.
Czy używanie liczb całkowitych jest złą praktyką? Jaki jest problem? Czy istnieje niepewność co do szerokości, na którą narzędzie odwzorowuje liczby całkowite?
Odpowiedzi:
Liczby całkowite są w porządku w syntezie, używam ich cały czas.
W porządku!
Być świadomym:
unsigned
signed
Na górze:
Kiedy używasz typów wektorów, używasz
ieee.numeric_std
, nieieee.std_logic_arith
prawda?Używam
integer
s tam, gdzie mogę, ale jeśli jawnie chcę „najazdu liczników n-bitowych”, zwykle używamunsigned
.źródło
Jan Decaluwe napisał całą białą księgę na temat problemów liczb całkowitych a wektorów bitowych. Spodziewam się, że jego odpowiedzi będą używać liczb całkowitych, gdy tylko będzie to możliwe . http://www.jandecaluwe.com/hdldesign/counting.html
źródło
Nie ma nic złego w używaniu liczb całkowitych do RTL per se , ale istnieją powody, dla których niektórzy tego unikają. To naprawdę jest pytanie o subiektywną „najlepszą praktykę” i ostatecznie będziesz musiał dowiedzieć się, co wolisz. Jako pomoc podzielę się swoim doświadczeniem i przemyśleniami na ten temat.
Zasadniczo jestem za używaniem (ograniczonych) liczb całkowitych, także podczas pisania do syntezy. Czasami to robię, ale w praktyce zwykle trzymam się
signed
iunsigned
. Rozwiążę dlaczego.W każdym razie będziesz zmuszony użyć wektoryzowanych typów danych w części swojego projektu:
Prawie żaden adres IP dostawcy lub IP strony trzeciej nie użyje
integer
typu portówNp. Podczas wysyłania danych przez BlockRam, nawet jeśli wnioskujesz i dlatego nigdy nie potrzebujesz interfejsu z żadnym adresem IP / makro / prymitywem, najprawdopodobniej i tak będziesz musiał przekonwertować na typ wektorowy
Nawet jeśli żadna z powyższych sytuacji, będzie przede wszystkim trzeba interfejs do czegoś innego w pewnym momencie (port najwyższego poziomu, jeśli nic innego)
Ponieważ nie możesz użyć
integer
pełnego projektu, możesz pominąć to wszystko razem, ponieważ:W niektórych momentach i tak będziesz musiał przeprowadzić konwersję, co
integer
w pierwszej kolejności pozbawia Cię sensuPonadto w przypadku symulacji konwersje te będą zwykle wywoływane za pomocą wektorów
'U'
lub'X'
przed resetem lub w innym czasie, a każde takie wywołanie funkcji wygeneruje komunikaty ostrzegawcze z funkcji pakietu, zaśmiecające ostrzeżenia / monity symulacjiWady używania
integer
:W przeciwieństwie do typów wektorowych, liczby całkowite nie mają
'U'
i'X'
; Uważam, że są bardzo pomocne w symulacjach. Widzisz, jak niezainicjowane sygnały rozprzestrzeniają się w projekcie, i prawdopodobnie zareagujesz, jeśli zobaczysz wiele niezainicjowanych sygnałów po resecie. Nie będzie tak w przypadku liczb całkowitych.W przypadku liczb całkowitych istnieje większe ryzyko błędnego dopasowania symulacji / syntezy podczas dodawania lub odejmowania, co powoduje niedopełnienie / przepełnienie. (Jak już wskazał ktoś inny.)
Typowe przypadki, w których uważam, że
integer
to naprawdę dobra opcja:Do sygnałów debugowania / liczników monitorowanych przez chipScope / signalTap itp.
Całkowicie wewnętrzna reprezentacja liczników, które nigdy nie wchodzą ani nie wychodzą z twojego kodu. Tak, istnieją takie przypadki, na przykład jeśli piszesz FIFO i są zapisy martwe-zaliczanie / czyta tworząc sygnały
full
,empty
,almostFull
itd. (Jednak arytmetyki na wskaźnikach jest lepszy sposób niż martwy liczy w tym przypadku. ..)Moje własne wnioski: czasami używam liczb całkowitych, ale oszczędnie i głównie w przypadkach opisanych powyżej. Nie widzę dużego narzutu w używaniu
unsigned
isigned
zamiast liczb całkowitych, a zatem zwykle trzymam się ich.źródło