Chcę zaprojektować blok kombinacyjnej logiki przy użyciu VHDL, ale czasami syntezowany wynik zawiera niezamierzone zatrzaśnięcie.
Jakich wskazówek kodowania muszę przestrzegać, aby uniknąć wnioskowania syntezatora o zatrzaski?
Przykład: w małym segmencie kodu powinienem używać instrukcji if-else?
Odpowiedzi:
Aby uniknąć zatrzaśnięć, musisz upewnić się, że wszystkie wyjścia są przypisane we wszystkich możliwych gałęziach kodu.
na przykład,
wygeneruje zatrzask, ponieważ w pierwszym warunku wartość b (1) nie jest określona, więc kompilator zdecydował, że chcesz zachować tam poprzednią wartość b (1). Jednym ze sposobów napisania tego, który nie generowałby zatrzasku, jest:
Tutaj wyraźnie stwierdzasz, że b powinien zachować swoją starą wartość, a następnie zastąp b (0) nową wartością.
Innym sposobem jest podanie wartości domyślnej ba, jak w odpowiedzi @ TomiJ.
Jeśli opublikujesz kod, na którym się zatrzaskujesz, możemy pomóc Ci znaleźć konkretny powód.
źródło
b <= b
pozwoliło uniknąć zatrzaśnięcia, ponieważ nadal wymaga zachowania stanu sygnału.Jeśli używasz procesów do logiki kombinacyjnej (i odradzam to tylko z tego powodu), upewnij się, że każda ścieżka przez proces przypisuje coś do każdego sygnału napędzanego przez proces. Żadne z wyników nie może być zależne od żadnego z wyników „ostatniego uruchomienia” procesu.
W przeciwnym razie wnioskujesz o zatrzasku, ponieważ przy następnym planowaniu procesu musi on zachować wartość sygnału, który nie otrzymał nowej wartości ostatnim razem.
Wolę zachować czysto kombinacyjną logikę jako ciągłe przypisania i używać procesów dla logiki taktowanej, wtedy nie dostaję zatrzasków.
źródło
Cztery zasady, aby uniknąć zatrzasków:
Ponadto, jeśli masz kilka procesów kombinacyjnych, upewnij się, że nie tworzysz pętli.
Kilka stylów kodowania może pomóc ci przestrzegać tych zasad, na przykład styl w odpowiedzi @ TomiJ. Jak zauważa @Martin Thompson, może być lepiej unikać logiki kombinacyjnej razem. Zamiast tego umieść wszystko w taktowanym procesie.
źródło
Jak zauważyli @fbo i @Martin Thompson, musisz upewnić się, że każdemu sygnałowi sterowanemu przez proces przypisana jest pewna wartość w każdej gałęzi procesu, a wartość ta nie może zależeć od poprzedniego stanu któregoś z wyjść procesu.
Najłatwiejszym sposobem, aby to zapewnić, jest przypisanie wartości domyślnej do każdego wyjścia na samym początku procesu, na przykład (przykład z opcją fbo):
źródło