FPGA kontra DSP - Czym różni się jeden od drugiego?

2018-08-19
FPGA kontra DSP - Czym różni się jeden od drugiego?

Praktycznie każdy z nas słyszał o DSP i zapewne większość spotkała się też ze skrótem FPGA. To pierwsze – czyli Digital Signal Processor – występuje w bardzo wielu cyfrowych urządzeniach audio, od konsolet poczynając, poprzez procesory (w tym również procesory głośnikowe), na wzmacniaczach i aktywnych zestawach głośnikowych kończąc. Większość z nas też mniej więcej (jedni mniej, inni więcej) orientuje się, co to takiego jest ten DSP, bo – jak sama nazwa wskazuje – jest to procesor, a z procesorami spore grono Czytelników LSI ma do czynienia wręcz od kołyski, a przynajmniej od wczesnej młodości.

W procesor wyposażone jest praktycznie każde urządzenie cyfrowe – od elektronicznej zabawki poczynając, poprzez zegarki, telefony (smartfony), tablety, komputery na zaawansowanych obrabiarkach numerycznych (i innych „machinach” cyfrowych) kończąc. Co prawda DSP nieco różni się od „klasycznych” procesorów, np. takich, jakie pracują w komputerach, ale z punktu widzenia laika (jakimi w tym temacie zapewne większość z nas jest) nie ma to wielkiego znaczenia.

Kilka lat temu rynek profesjonalnych urządzeń audio zaczął zawojowywać inny układ, który znany jest szczególnie użytkownikom konsolet DiGiCo, a od niedawna (a konkretnie od dwóch lat) również Allen & Heath. Ale nie tylko, bo układ taki ma np. na pokładzie opisywany szerzej w tym numerze procesor zarządzający systemem audio Newton firmy Outline. Mowa oczywiście o FPGA, które to „ustrojstwo” jest już nieco bardziej tajemnicze od znacznie bardziej rozpowszechnionego na rynku DSP. Niby wiemy „z grubsza” co to FPGA jest, a może bardziej „podejrzewamy” niż „wiemy”. Z drugiej strony jak przyjdzie co do czego, to raczej nie jesteśmy w stanie wytłumaczyć komuś, kto o tym w ogóle nie słyszał (albo tylko obiło mu się o uszy), cóż to takiego jest, a tym bardziej, czym różni się od DSP. Tych więc, którzy chcieliby się wreszcie dowiedzieć (aby też ewentualnie móc potem wytłumaczyć innym) czym jest FPGA, a czym DSP, i czym jedno różni się od drugiego zapraszam do lektury tego artykułu.

Zacznijmy od usystematyzowania (lub pogłębienia) swojej wiedzy na temat tego, co znamy lepiej, czyli

DSP

Procesor sygnałowy, czyli DSP, to specjalizowany procesor do cyfrowej obróbki sygnałów. Z punktu wiedzenia budowy charakteryzuje się on osobnymi obszarami pamięci przeznaczonymi tylko dla programu (sterowania) i tylko dla danych (architektura harwardzka), możliwością równoczesnego pobierania instrukcji programu i danych, sprzętowym wykonywaniem prostych i zaawansowanych operacji występujących najczęściej przy przetwarzaniu sygnałów (np. filtracji FIR i IIR, transformacji Fouriera, korelacji wzajemnej) oraz potokowym przetwarzaniem instrukcji.

 

DSP – jak każdy procesor – jest układem, który wykonuje listę instrukcji według określonej kolejności.

Mówiąc bardziej prostym językiem DSP – jak każdy procesor – jest układem, który wykonuje listę instrukcji według określonej kolejności. Stąd wynikają już co najmniej dwa problemy. Po pierwsze lista tych instrukcji – choć teoretycznie może być dowolna – w rzeczywistości jest ograniczona, a więc i programowanie procesora też dokonywane jest nie w zupełnie dowolny sposób, ale trzymając się pewnych zasad i dostępnej listy instrukcji. Druga kwestia wiąże się z powyższą definicją, a konkretnie fragmentem: „wykonuje listę instrukcji według określonej kolejności”. Oznacza to, że procesor DSP NIE MOŻE wykonywać dwóch (a tym bardziej więcej) instrukcji jednocześnie, tylko w zadanej mu kolejności. Natomiast układ FPGA – wybiegając nieco myślą w przód – może wykonywać bardzo wiele czynności dokładnie w tym samym czasie i to bez jakiegokolwiek uszczerbku na funkcjonalności. Dochodzimy zatem do wniosku, że procesor jest „fajny”, jeśli ma wykonywać czynności szeregowo, zaś układ FPGA doskonale sprawdzi się tam, gdzie czynności mają być wykonywane równolegle.

No dobrze, skoro wiemy już z grubsza co to jest DSP i do czego „służy” przejdźmy do

FPGA

Układy FPGA swoją nazwę wzięły od pierwszych liter angielskiego określenia field-programmable gate array, co na jeżyk polski można przetłumaczyć jako bezpośrednio programowalna macierz bramek. FPGA należy do grupy tzw. układów programowalnych, do których oprócz niego zaliczają się też układy SPLD (Simple Programmable Logic Device) – najstarsze, najprostsze i obecnie już chyba nie produkowane – oraz CPLD (Complex Programmable Logic Device) – średnio złożone układy.

Czym w ogóle są układy programowalne? W dużym skrócie układ programowalny to zbiór bramek i przerzutników, które można sobie połączyć według własnych potrzeb. Dla projektanta ma funkcjonalność taką samą jak specjalizowany układ scalony, jednak może być wielokrotnie programowany bez demontażu, po jego wytworzeniu i zainstalowaniu w urządzeniu docelowym. Największymi dostawcami układów tego typu są firmy Altera i Xilinx, a także Actel, Atmel, Cypress, Lattice Semiconductor i QuickLogic.

 

FPGA jest to cyfrowy układ logiczny, który może być skonfigurowany do uruchamiania różnych operacji, od logicznych poczynając, poprzez przetwarzanie sygnału, na skonfigurowaniu go jako DSP kończąc.

Obrazowo można powiedzieć, że układ FPGA jest jak pudełko klocków Lego, wypełnione wieloma zestawami kilku typów klocków. W rzeczywistości zamiast klocków, FPGA zawiera modularne obwody cyfrowe zawierające zarówno komponenty kombinacyjne (bramki logiczne, multipleksery), jak i sekwencyjne (przerzutniki).

Klocki Lego pozwalają nam budować wiele, wiele różnych obiektów (domy, samochody, mosty, samoloty itp.). FPGA można wykorzystać do budowy prawie dowolnego obwodu cyfrowego – pod warunkiem, że wybrana część FPGA ma wystarczającą ilość zasobów (w sensie układów logicznych, jak i prędkości) do realizacji tego obwodu.

Głównymi blokami FPGA (patrz schemat blokowy obok) są bloki logiczne i, znajdujące się na obrzeżach matrycy, bloki we/wy, aczkolwiek te pierwsze są w ogromnej przewadze nad drugimi. Poszczególne bloki są łączone ze sobą za pośrednictwem linii traktów połączeniowych (routing channels) oraz programowalnych matryc kluczy połączeniowych umieszczonych w miejscu krzyżowania się traktów poziomych i pionowych.

Jak więc wygląda

PROGRAMOWANIE UKŁADÓW FPGA

Zacznijmy od tego, że – pomimo nazwy (programmable, czyli programowalne) – układów FPGA się nie programuje, a KONFIGURUJE (to tak gwoli ścisłości językowej). Po pierwsze dlatego, że słowo „konfigurowanie” bardziej oddaje to, co robi programista (a może konfigurator?), aby „tchnąć życie” w układ FPGA. A po drugie też dlatego, aby zaznaczyć, że FPGA to nie procesor (jak DSP). Wróćmy jednak do meritum.

Logikę, czyli to co wgrywamy do środka FPGA, tworzymy nie w języku programowania, ale w języku opisu sprzętu (HDL, Hardware Description Language). Obecnie stosuje się dwa z nich – VHDL (którego składnia przypomina Pascala) lub Verilog, (który bardziej przypomina C).

To, co napiszemy w języku opisu sprzętu, musi zostać przetworzone przez syntezator (odpowiednik kompilatora), który przerobi słowny opis na równania logiczne. Następnie równania muszą być zaimplementowane w strukturę bramek i przerzutników. Na szczęście ten proces dokonuje się samoczynnie i de facto o fizycznej budowie FPGA niewiele trzeba wiedzieć. Na końcu otrzymujemy plik binarny, który można wgrać do układu programowalnego tak samo, jak wsad do mikrokontrolera.

 

Układy FPGA coraz częściej pojawiają się w profesjonalnych urządzeniach audio.

Warto jeszcze wspomnieć, że nowoczesne układy FPGA mają możliwość przeprogramowania „w locie” poprzez zastosowanie mechanizmu częściowej rekonfiguracji, co prowadzi do pomysłu rekonfigurowalnego komputera czy rekonfigurowalnego systemu – czyli układów, które mogą dostosować swoją strukturę tak, by lepiej sprostać zadaniom, przed którymi stoją w danym momencie.

Na koniec, podsumowując, odpowiedzmy sobie zbiorczo na zadane w tytule artykuły pytanie

CZYM RÓŻNI SIĘ FPGA OD DSP

DSP jest specjalistycznym procesorem stosowanym do przetwarzania sygnałów. Jego rdzeń jest zaprojektowany do optymalnego wykonywania operacji typu „pomnóż i dodaj”, stosowanych w niemal wszystkich algorytmach. Układy DSP są podobne do mikrokontrolerów, gdyż zawierają wiele zintegrowanych obwodów peryferyjnych i różnych rodzajów pamięci. Tak więc DSP to nic innego jak procesor, który pobiera z pamięci programu zapisany tam kod, w formie listy wykonywanych kolejno instrukcji, pobiera, przetwarza i zapisuje dane z i do pamięci danych i może również, poprzez interfejsy, komunikować się ze światem zewnętrznym.

Z kolei FPGA nie jest procesorem sensu stricte – jest to cyfrowy układ logiczny, który może być skonfigurowany do uruchamiania różnych operacji, od logicznych poczynając, poprzez przetwarzanie sygnału, na skonfigurowaniu go jako DSP lub procesor ogólnego przeznaczenia kończąc. Podstawową różnicą między uruchamianiem kodu, jak w DSP, a konfigurowaniem FPGA dla wybranych operacji jest to, że FPGA może dostosować architekturę do predefiniowanego procesu i nie jest ograniczone do prostego wykonywania wybranych instrukcji. Z tego powodu układy FPGA pozwalają projektantom tworzyć własne konstrukcje logiczne dla wysoko wydajnych aplikacji przetwarzania sygnałów.

O ile więc procesory DSP zwykle mają „sztywną” architekturę, której nie można zmieniać – musimy korzystać z predefiniowanych zasobów sprzętowych zaimplementowanych na płytach DSP – o tyle w układach FPGA hardware FPGA może być zaprogramowany tak, jak chcemy. To też przekłada się na różne podejście do ich programowania (choć trzymając się prawidłowej nomenklatury – jak pamiętamy – układów FPGA się nie programuje, tylko konfiguruje). Programowanie DSP nie różni się znacząco od programowania „zwykłych” procesorów ogólnego przeznaczenia – pisze się program, najczęściej w języku C/C++ (ewentualnie w asemblerze) i kompiluje go, aby móc kontrolować działanie procesora DSP. FPGA to surowy hardware. Nie ma nic, co pozwoliłoby na uruchomienie programu napisanego w języku C/C++. Nie ma magistrali, procesora, pamięci RAM. Aby „ożywić” FPGA musimy używać języka HDL, co pozwoli nam go skonfigurować tak, aby działał jak dowolny cyfrowy układ logiczny. Można więc z FPGA stworzyć zarówno prostą bramkę AND, jak i skonfigurować układ tak, aby stał się procesorem lub innym układem cyfrowym, niemalże takim, jaki tylko możemy sobie wyobrazić.

 

Układy FPGA pozwalają projektantom tworzyć własne konstrukcje logiczne dla wysoko wydajnych aplikacji przetwarzania sygnałów.

Kolejna różnica to taka, że układy DSP oparte są na instrukcjach, natomiast FPGA na zegarze. W DSP wykonanie każdej operacji logicznej lub matematycznej wymaga średnio trzech, czterech instrukcji. Dane muszą być najpierw przechwycone z wejścia, następnie przesłane do rdzenia przetwarzającego, przejść przez ten rdzeń dla każdej operacji, a następnie wysłane do wyjścia. W FPGA każdy cykl zegara ma potencjalną możliwość wykonania operacji matematycznej lub logicznej na przychodzącym strumieniu danych.

Myślę, że to wystarczy, aby przynajmniej „wyczuć” różnicę między procesorem DSP, a coraz bardziej popularnymi w urządzeniach audio układami FPGA.

Czy da się jednoznacznie powiedzieć, który z tych układów jest lepszy? Niestety – jak to w życiu bywa – nie. Jeśli częstotliwość próbkowania systemu jest mniejsza niż kilkadziesiąt kiloherców i jest to implementacja jednokanałowa, w zasadzie oczywistym wyborem jest DSP. Jednak gdy częstotliwość próbkowania wzrasta powyżej kilku megaherców lub jeśli system wymaga więcej niż jednego kanału, FPGA stają się bardziej atrakcyjne. Tak więc można przyjąć, że układy FPGA stanowią optymalne rozwiązanie do przetwarzania algorytmów wymagających średniej i wysokiej wydajności. Bowiem w takich aplikacjach, przy wysokich szybkościach transmisji danych procesor DSP może mieć problemy z przechwytywaniem, przetwarzaniem i generowaniem danych bez żadnych strat. Wynika to z wielu współdzielonych zasobów, magistrali, a nawet rdzenia procesora. Natomiast FPGA może przeznaczać zasoby na każdą z tych funkcji oddzielnie.

Reasumując, wybór pomiędzy układem FPGA i DSP zależy od wielu kryteriów. Nie ma ogólnej recepty sprawdzającej się w każdych warunkach. Co więcej, zawsze istnieje konieczność bilansowania wydajności i ceny.