Kiedy uczyłem się tajników FPGA byłem bardzo sfrustrowany tym, że wielu autorów kursów ogranicza się tylko do opisywania samego języka, np. Verilog lub VHDL, zupełnie jakby znajomość tych języków była wszystkim, co jest potrzebne do tworzenia projektów z zastosowaniem FPGA. Moim zdaniem, znajomość języka programowania to dopiero połowa sukcesu. Drugą połowę stanowi umiejętność korzystania z różnorodnych narzędzi służących do generowania kodu, debugowania, symulacji i analizy, a także znajomość peryferów, jakie oferuje nam wybrany układ FPGA.
Jak działa FPGA?
Kurs rozpoczniemy od porównania różnic między FPGA, a procesorem. Procesor to układ, który wykonuje program, czyli pobiera z pamięci instrukcje programu i wykonuje je według ściśle określonej kolejności. Procesor może wykonywać absolutnie dowolne instrukcje, jednak rdzeń procesora ma poważne ograniczenie – może wykonywać tylko jedną instrukcję w danej chwili. Jeżeli chcemy, by procesor wykonywał kilka programów jednocześnie, musi przełączać się pomiędzy nimi. Sprawia to wrażenie, że te programy wykonywane są równolegle, jednak w rzeczywistości w danej chwili wykonywany jest tylko jeden z nich, a pozostałe są wstrzymane. Wraz ze wzrostem liczby programów do równoległego wykonania, zwiększa się także czas wykonywania tych programów, ponieważ procesor musi dzielić swoją moc obliczeniową pomiędzy wszystkie zadania i dodatkowo traci też czas na przełączenie się między nimi.
Układ FPGA składa się z uniwersalnych bramek logicznych i przerzutników, które można połączyć ze sobą w dowolny sposób i tworzyć z nich najróżniejsze układy cyfrowe, realizujące dowolne funkcje. Te bramki i przerzutniki fizycznie istnieją w strukturze krzemowej, a co najważniejsze – działają jednocześnie, więc mogą wykonywać różne procesy równolegle, czyli w tym samym czasie. Zwiększanie liczby różnych czynności wykonywanych wewnątrz FPGA nie wpływa negatywnie na szybkość ich wykonywania. Natomiast liczba zadań, jakie możemy realizować w FPGA ograniczona jest liczbą elementów logicznych, jakimi dysponuje matryca FPGA.
Dochodzimy do wniosku, że procesor jest skuteczny, jeżeli zadania mogą być wykonywane w postaci kolejki. Układy FPGA należy zastosować, kiedy chcemy wykonywać różne czynności równolegle.
Dlaczego Lattice?
Lattice jest jednym z trzech największych producentów FPGA, obok Xilinxa i Intela (znanego wcześniej jako Altera). Xilinx i Intel prześcigają się w tworzeniu jak największych, jak najszybszych i jak najbardziej rozbudowanych układów FPGA, natomiast Lattice poszedł zupełnie inną drogą – tworzy układ FPGA proste, energooszczędne, niewielkie i tanie. Właśnie to sprawia, że nadają się idealnie do pierwszych prób i konstrukcji. W szczególności polecam dwie rodziny układów produkowanych przez Lattice:
- MachXO2 – ich dużą zaletą jest to, że do działania potrzebują jedynie źródła zasilania. W świecie FPGA często spotyka się układy, które wymagają zastosowania zewnętrznej pamięci flash, zewnętrznego źródła sygnału zegarowego i kilku napięć zasilających. MachXO2 są jak mikrokontrolery – mają wbudowaną pamięć, generator zegara taktującego i wymagają zasilania jednym napięciem o wartosci 3,3 V. Ponadto, układy MachXO2 mają wbudowane typowe interfejsy szeregowe jak I²C czy SPI. Są dostępne w obudowach QFN i TQFP, dzięki czemu można je przylutować sprzętem jaki jest dostępny dla elektroników-hobbystów. W dalszej części kursu będziemy korzystać z układów MachXO2.
- iCE40 Ultra Plus – to najnowsza rodzina niedrogich małych FPGA. Posiadają aż 1 Mbit jednoportowej pamięci RAM, 120 kbit dwuportowej pamięci RAM, wbudowane generatory sygnałów zegarowych i interfejsy szeregowe. Niestety oferują tylko pamięć ROM jednokrotnego zapisu, więc jeżeli chcemy mieć możliwość przeprogramowania układu to konieczne jest podłączenie zewnętrznej pamięci flash. Układy iCE40 dostępne są w łatwych do lutowania obudowach TQFP oraz QFN.