Współczesne układy FPGA mają wbudowane bloki DSP, najnowsze układy FPGA mają nawet wbudowane jednostki zmiennoprzecinkowe zgodne z IEEE-754.
Możliwe jest utworzenie encji / modułu DSP za pomocą GUI po wybraniu w nim wymaganych parametrów, a następnie umieszczeniu go w projekcie.
Kiedy musimy wykonać takie mikromanagowanie w projekcie instancji w rzeczywistych blokach DSP, a kiedy po prostu wpisujemy operator „*” w kodzie i pozwalamy narzędziu do syntezy obsługiwać szczegóły niskiego poziomu? Który jest lepszy?
Istnieje wiele różnych rodzajów algorytmów mnożenia, jeśli chodzi o mnożenie binarne. Od teraz mamy wbudowane bloki DSP na krzemie, a nawet wbudowane zmiennoprzecinkowe mnożniki, czy to oznacza, że wszystkie te algorytmy nie stały się faktycznie przestarzałe.
Odpowiedzi:
Zrobiłem to kilka razy sam.
Zasadniczo narzędzia do projektowania będą wybierać między implementacją tkaniny a wycinkiem DSP na podstawie ustawień syntezy.
Na przykład, dla Xilinx ISE, w ustawieniach procesu syntezy, Opcjach HDL, jest ustawienie „-use_dsp48” z opcjami: Auto, AutoMax, Tak, Nie. Jak można sobie wyobrazić, kontroluje to, jak mocno narzędzia starają się umieścić Plasterki DSP. Miałem kiedyś problem polegający na tym, że pomnożyłem liczbę całkowitą przez 3, co wywnioskowało wycinek DSP - tyle że już ręcznie wywnioskowałem każdy wycinek DSP w układzie, więc syntezator nie powiódł się! Zmieniłem ustawienie na Nie, ponieważ już używałem każdego wycinka dsp.
Jest to prawdopodobnie dobra zasada (właśnie wymyśliłem): jeśli twój projekt jest taktowany mniej niż 50 MHz, i prawdopodobnie będziesz używał mniej niż 50% wycinków DSP w układzie, to po prostu użyj *, + i - operatorzy. spowoduje to wywnioskowanie wycinków DSP bez rejestrów potokowych. To naprawdę ogranicza maksymalną prędkość. (Nie mam pojęcia, co się stanie, gdy użyjesz podziału)
Jeśli jednak wygląda na to, że zamierzasz przeprowadzić wycinki bliżej maksymalnej prędkości wycinka DSP (333 MHz dla klasy Spartan 6 o normalnej prędkości) Jeśli zamierzasz użyć wszystkich wycinków, powinieneś ręcznie wywnioskować je .
W takim przypadku masz dwie opcje.
Opcja 1: ręcznie użyj surowego szablonu instancji DSP. Opcja 2: użyj bloku IP z Xilinx Core Generator. (Chciałbym skorzystać z tej opcji. W tym samym czasie dowiesz się wszystkiego o genach podstawowych, które pomogą w przyszłości)
Przed wykonaniem którejkolwiek z tych czynności przeczytaj pierwszą parę stron instrukcji obsługi wycinka DSP. W przypadku Spartan 6 (DSP48A1) byłby to Xilinx doc UG389: http://www.xilinx.com/support/documentation/user_guides/ug389.pdf
Najpierw rozważ opcję Core Generator. Zwykle tworzę projekt testowy w Core Generatorze dla części, z którą pracuję, w której tworzę dowolną liczbę bloków IP tylko po to, aby nauczyć się systemu. Następnie, gdy jestem gotowy do dodania jednego do mojego projektu w ISE, klikam prawym przyciskiem myszy Hierarchię projektu, klikam nowe źródło i wybieram „IP (CORE Generator & Architecture Wizard)”, aby móc edytować i ponownie generować blok bezpośrednio z mojego projektu.
W Core gen, spójrz na różne bloki IP, z których możesz wybierać - jest ich kilkadziesiąt, z których większość jest całkiem fajna.
Rdzeń Mnożnika jest tym, na co powinieneś najpierw spojrzeć. Sprawdź każdą stronę i kliknij przycisk arkusza danych. Ważnymi częściami są liczby bitów całkowitych, etapy potoku (opóźnienie) i wszelkie sygnały sterujące. Tworzy to najprostszy możliwy blok, zabierając wszystkie niepotrzebne porty.
Kiedy w ubiegłym roku budowałem filtr IIR rzędu 5 na 3, musiałem skorzystać z ręcznego szablonu tworzenia instancji, ponieważ budowałem bardzo niestandardową implementację, z 2 wycinkami DSP taktowanymi 4x szybciej niż częstotliwość próbkowania. To był całkowity ból.
źródło
Jeśli chcesz tylko pomnożyć dwie liczby i odpowiadają one blokowi DSP,
*
operator powinien wywnioskować blok DSP. Jeśli nie, odeślij narzędzie do syntezy :)Jednak, aby skorzystać z bardziej złożonych kombinacji funkcji DSP, często wymaga bezpośredniej instancji bloku i konfiguracji jego parametrów. Przykłady rzeczy, które mogą nie być dobrze odwzorowane przez wnioskowanie (na przykładzie Xilinx DSP48E1 ):
A zwłaszcza kombinacje powyższych.
Narzędzia do syntezy nie są jeszcze wystarczająco dobre, aby zmapować całkowicie dowolne kombinacje logiki i arytmetyki tak skutecznie, jak można się spodziewać.
źródło
Jeśli obecne są bloki DSP, powinieneś ich użyć, jeśli możesz, ponieważ będzie to bardziej wydajne niż używanie LUT do tego samego. Chyba że nie potrzebujesz mnożenia o wysokiej wydajności, w takim przypadku powinieneś wdrożyć, powiedzmy, potokowy sumator i rejestr przesuwny, aby zaoszczędzić miejsce.
Zanim przejdę do narzędzi GUI, przyjrzę się wnioskowaniu o blokach DSP. Podręcznik Xilinx XST zawiera „przepisy” HDL na tworzenie instancji bloków DSP z czystym verilog / VHDL. Zasadniczo, jeśli dodasz wystarczającą liczbę rejestrów przed i / lub po multiplikatorach, XST użyje bloku DSP do automatycznego wykonania operacji. Możesz sprawdzić dzienniki syntezy, aby sprawdzić, czy poprawnie wnioskuje o blokach DSP. Zakładam, że Altera ma coś podobnego.
Nawiasem mówiąc, zastanawiałem się nad tym kilka minut temu, ponieważ obecnie pracuję nad implementacją twistera Mersenne, która używa tylko mnożnika dla początkowego materiału siewnego. Moja implementacja pierwszego przejścia nie spełnia terminu, ale funkcjonalność jest poprawna. XST umieścił także operację zwielokrotniania w blokach DSP, jednak nie jest zoptymalizowany, więc działa o około połowę szybciej, niż bym chciał. Prawdopodobnie wrócę mnożnik za pomocą techniki shift-and-add, która zajmie 32 razy więcej cykli zegara, ale nie będzie już wymagała mnożnika sprzętowego.
źródło
Zależy to od tego, ile potrzebujesz optymalizacji i ile przenośny powinien być twój projekt. To trochę jak oprogramowanie, optymalizacja przy użyciu odrobiny asemblera lub pozwalanie kompilatorowi na wybór instrukcji. Możesz także mieć pewne kompromisy między rozmiarem a prędkością, abyś nie mógł sobie pozwolić na kombinatoryczny mnożnik podwójnej precyzji.
Nie wiedziałem, gdzie są wbudowane multiplikatory FP w FPGA.
Rzeczywisty operator mnożenia zgodny z IEEE P754 odpowiedni dla CPU wymaga więcej niż dużego mnożnika: Musisz dodać wykładniki, przesunąć normalne, zarządzać nieskończonością i kilka najczęściej bezużytecznych flag (niedokładne, niedopełnienie ...)
źródło
Przeczytałem ten dokument http://www2.warwick.ac.uk/fac/sci/eng/staff/saf/papers/fpl2014-ronak.pdf :
Chciałbym znaleźć źródło ich narzędzi, by sprawdzić ich wyniki.
źródło