Inż. Arkadiusz Pantoł IV rok Koło Naukowe Techniki Cyfrowej dr inż. Wojciech Mysiński opiekun naukowy FPGA IMPLEMENTATION OF FAST FOURIER TRANSFORM ALGORITHM IMPLEMENTACJA ALGORYTMU SZYBKIEJ TRANSFORMATY FOURIERA W UKŁADZIE PROGRAMOWALNYM FPGA Keywords: FPGA, DSP, FFT, Xilinx, zynq, digital electronics Słowa kluczowe: FPGA, DSP, FFT, Xilinx, zynq, elektronika cyfrowa A b s t r a c t The most efficient way to create an FFT processor is to implement it in programmable structure, because FPGA s can execute multiple operations in one clock cycle everything depends on implementation method. This article describes method of implementation of the most important digital signal processing algorithm Fast Fourier Transform in Zynq SoC device.. Wstęp.. Szybka transformata Fouriera Transformata Fouriera umożliwia dekompozycję badanego sygnału okresowego ciągłego na N sygnałów sinusoidalnych (lub kosinusoidalnych) o różnych amplitudach oraz częstotliwościach. Przyporządkowując częstotliwościom konkretne amplitudy w układzie współrzędnych amplituda częstotliwość uzyskuje się reprezentację sygnału okresowego w dziedzinie częstotliwości. Transformata Fouriera dla sygnałów ciągłych okresowych dana jest wzorem: Niestety niemożliwe jest zaimplementowanie powyższej formuły w układzie cyfrowym. Powyższe wyrażenie realizuje transformatę Fouriera od minus do plus nieskończoności. Rozmiary pamięci RAM (służące do przechowywania próbek sygnału badanego) są wartościami skończonymi, co oznacza że pamięci te mogą przechowywać maksymalnie N próbek sygnału. Dlatego też klasyczna transformata Fouriera nie może zostać wykorzystana do analizy sygnałów cyfrowych. Rozwiązaniem tego problemu jest dyskretna transformata Fouriera - DFT, w której definiowany jest rozmiar transformaty. Poniżej przedstawiono formułę wyrażającą rezultat transformaty dyskretnej:
Gdzie. DFT najczęściej realizowane jest w postaci skończonej pętli po N próbkach sygnału, w której realizowane są operacje mnożenia oraz sumowania liczb zespolonych. Niestety taki sposób realizacji wiąże się z długim czasem wykonywania operacji DFT. Szybszą odmianą DFT jest szybka transformata Fouriera (FFT Fast Fourier Transform). Algorytm ten dzieli dużą transformatę na wiele mniejszych transformat, przez co wzór nie jest realizowany wprost. W pierwszym etapie FFT, N punktowy sygnał w dziedzinie czasu przetwarzany jest na N pojedynczych punktów w dziedzinie częstotliwości. Realizowane jest to przy pomocy inwersji bitowej, która zamienia kolejność bitów poszczególnych próbek. Aby z tych pojedynczych próbek uzyskać ciągłe widmo częstotliwościowe należy powtórzyć ten proces, cofając się krok po kroku. W drugą stronę niestety niemożliwe jest zastosowanie inwersji bitowej. W tym celu wykorzystuje się tzw. struktury motylkowe... Informacje dotyczące użytego układu scalonego Do realizacji założeń projektowych wykorzystano płytę prototypową, firmy Digilent z układem Zynq 7000. Poniżej podano podstawowe parametry użytego układu scalonego: dwa rdzenie 3 bitowe, typu ARM Cortex A9, maksymalna częstotliwość taktowania rdzenia 650MHz, maksymalna częstotliwość pracy układu FPGA 450MHz, 4400 makrokomórek, każda z sześciowejściową tablicą LUT, 80 makrokomórek DSP, Wbudowany przetwornik analogowo cyfrowy.3. Podstawowe informacje dotyczące realizowanego algorytmu W strukturze programowalnej zaimplementowana została 04 punktowa transformata typu Radix-4, która wymaga mniejszej liczby etapów niż standardowa wersja algorytmu FFT (Radix). Liczba etapów wyrażona jest wzorem, gdzie N to rozmiar transformaty. W tym przypadku algorytm wymagał będzie pięciu etapów. W celu zaoszczędzenia cennych zasobów układu FPGA (w głównej mierze elementów DSP48E) zdecydowano się zaimplementować architekturę typu SPDF (single-path delay feedback), w której próbki wejściowe ładowane i przetwarzane są szeregowo, co sprawia, iż na każdy etap przypadają dwie struktury motylkowe () oraz jeden moduł sumująco-mnożący (). Pomimo tego, że dane ładowane są szeregowo wiele operacji mnożenia oraz sumowania jest wykonywane równolegle, co sprawia, że implementacja tego algorytmu ma w dalszym ciągu przewagę nad tradycyjną realizacją DFT.
. Architektura procesora FFT.. Struktura modułu FFT Jak już wcześniej wspomniano struktura zbudowanego procesora FFT podzielona została na pięć etapów, z tym że każdy etap składa się z dwóch struktur motylkowych () oraz jednego modułu (sumująco-mnożący). Każdy moduł wyposażony jest w dwie pamięci ROM, przechowujące wartości funkcji sinus oraz inus, odpowiednio przemnażane przez próbki wejściowe. Struktura systemu przedstawiona jest na poniższym rysunku: Etap Etap Etap 3 N = 5 N = 56 N = 8 N = 64 N = 3 N = 6 7 8 sin 8 9 0 sin 6 0 sin kontroler sin 3 4 4 5 6 N = 8 N = 4 N = N = mag moduł Etap 4 Etap 5 Rys.. Struktura zaimplementowanego procesora FFT w strukturze FPGA Ze względu na to, że w układach cyfrowych niemożliwe jest bezpośrednie działanie na liczbach zespolonych zdecydowano się na osobne przetwarzanie zarówno części rzeczywistej jak i urojonej. Ułatwia to późniejsze operacje na wyjściowej liczbie zespolonej (przykładowo obliczanie modułu, przesunięcia fazowego itp..) Na każdym etapie przetwarzania po operacjach sumowania oraz mnożenia, wielkości wyjściowe są skalowane oraz zaokrąglane, dlatego też długości bitowe słów wyjściowych nie przekraczają 3 bitów. W strukturze procesora znajduje się także moduł kontrolera, który w odpowiedni sposób przełącza połączenia w modułach oraz generuje adres dla pamięci ROM przechowującej wartości funkcji sinus oraz kosinus. Do zaprojektowania wszystkich modułów wykorzystano język SystemVerilog. Całość systemu jest parametryzowana, co pozwala na wykorzystanie każdego modułu wielokrotnie, w różnych konfiguracjach (różne długości słów wejściowych oraz wyjściowych).
.. Moduł Nazwa modułu została zaczerpnięta z języka angielskiego Multiply and Accumulate. Moduł ten odpowiedzialny jest za przemnażanie próbek wejściowych przez odpowiednie wartości funkcji sinus i inus oraz zsumowanie rezultatów. Realizuje on poniższą operację: Gdzie to wartości funkcji sinus oraz inus na poszczególnych etapach FFT. Zostały one zapisane na stałe w pamięciach ROM, po uprzednim wygenerowaniu tych wartości w programie Matlab. Poniżej przedstawiono strukturę modułu mnożąco sumującego: ROM ROM sin A*sin(x) A B*(x) Asin(x)+B(x) i = 0 B B*sin(x) A(x)-Bsin(x) i = A*(x) Rys.. Struktura zaprojektowanej jednostki Moduł ten odpowiedzialny jest za mnożenie dwóch liczb zespolonych. Ze względu na to, że części składowe liczb zespolonych przetwarzane są przy pomocy osobnych ścieżek należało wykorzystać cztery elementy mnożące oraz dwa sumatory. Aby zwiększyć maksymalną dopuszczalną częstotliwość sygnału zegarowego dla tego modułu wykorzystano technikę pipeliningu, która polega na umieszczaniu elementów opóźniających na wejściach i wyjściach układów arytmetycznych. Rys. 3. Zastosowanie techniki pipeliningu, niebieskie prostokąty to elementy opóźniające
Odpowiednie zastosowanie pipeliningu skutkuje tym, że elementy arytmetyczne podczas syntezy umieszczone zostają w bloku DSP48E (w układach Zynq), który może pracować przy maksymalnej częstotliwości sygnału zegarowego. Ponieważ mnożenie liczby M bitowej przez liczbę N bitową daje w rezultacie liczbę (M+N) bitową wartości wyjściowe były odpowiednio skalowane oraz zaokrąglane..3. Struktury motylkowe Aby możliwe było przejście z dziedziny czasu do dziedziny częstotliwości należało stworzyć moduły realizujące działanie motylka FFT. Strukturę jednego z modułów przedstawiono na poniższym rysunku: mux4 Re{P} P_re mux3 Im{P} P_im mux Re{A} RAM mux Im{A} RAM STEROWANIE Rys. 4. Struktura modułu Widoczne na rysunku przełączniki (multipleksery) są sterowane przy pomocy modułu kontrolera. Przez pierwsze N/ cykli sygnału zegarowego przełączniki ustawione są w pozycji 0, co sprawia że próbki wejściowe są bezpośrednio kierowane w stronę pamięci RAM, pełniącej rolę rejestru przesuwnego. W kolejnym kroku układ sterujący zmienia pozycję przełączników na przeciwną. Po tym przełączeniu obliczana jest dwupunktowa transformata z próbek przechowywanych w pamięci RAM oraz z próbek wejściowych (operacje sumowania i odejmowania). Część próbek wyjściowych przekierowywana jest do modułu, natomiast reszta jest przetwarzana dalej (pamięć RAM i układy sumująco odejmujące). Wartość opóźnienia N dla każdego etapu jest inna, co zostało wyraźnie zaznaczone na rysunku.
3. Podsumowanie Zaprojektowany moduł procesora FFT działa prawidłowo, co odnotowano w symulacji funkcjonalnej modułu (w programie Modelsim). Na wejściach modułu wygenerowano wartości funkcji sinus oraz inus, po czym na wyjściach zaobserwowano prążki pojawiające się w kolejnych odstępach czasu. Rys. 5. Symulacja funkcjonalna modułu FFT, część rzeczywista: sinus, część urojona: inus. W wyniku syntezy uzyskano szczegółowe informacje dotyczące zużycia zasobów wykorzystanego układu programowalnego, z czego najważniejszą informacją było zużycie bloków DSP. W zaprojektowanym układzie zużycie to było na poziomie 4 bloków DSP. Maksymalna częstotliwość sygnału zegarowego mogącego taktować zbudowany procesor FFT wynosi ok. 400MHz. Obecnie trwają prace nad zwiększeniem tej częstotliwości. Zaprojektowany moduł z powodzeniem można zastosować w układach pomiarowych, przykładowo do budowy analizatora widma. Ze względu na bogate wyposażenie płyty prototypowej z układem Zynq 700 możliwe jest także rozbudowanie takiego analizatora widma o dodatkowe interfejsy typu USB, Ethernet, co w dzisiejszych czasach jest powszechnie stosowanym zabiegiem. Literatura [] http://www.xilinx.com/support/documentation/sw_manuals/xilinx4_7/ug873-zynq-ctt.pdf [] https://www.digilentinc.com/data/products/zybo/zybo_rm_b_v6.pdf [3] http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-973- communication-system-design-spring-006/lecture-notes/lecture_0.pdf [4] E. Wold and Alvin M. Despain "Pipeline and Parallel-Pipeline FFT Processors for VLSI Implementations," IEEE Trans. Computers vol. 33, no. 5, pp. 44-46, 984 [5] http://www.xilinx.com/support/documentation/user_guides/ug479_7series_dsp48e.pdf