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 wartości 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.
Płytki prototypowe
Czytelnik może wybrać płytkę prototypową spośród wielu dostępnych. W kursie nie będę wymuszał zaopatrzenia się w jakiś konkretny model. Wśród dostępnych ofert z pewnością znajdą się takie płytki:
- MachXO2 Breakout Board – to płytka opracowana przez Lattice, która jest świetnym wyborem dla początkujących. Zastosowano na niej układ LCMXO2-7000 czyli najpotężniejszy z rodziny MachXO2. Możliwe jest użycie wszystkich wyprowadzeń GPIO układu, a do dyspozycji mamy ich aż 108 (fotografia 1). Płytka ma wbudowany programator, a do rozpoczęcia pracy potrzebujemy jedynie zwykłego kabla USB.
- MachXO2 Pico Board – jest to kolejna płytka opracowana przez Lattice, jednak zdecydowanie jej nie polecam. Zastosowano na niej układ, który ma dość mało linii GPIO, a co gorsza, są one na stałe połączone z różnymi peryferiami, które są mało przydatne. Z tego powodu dostępnych jest zaledwie kilkanaście uniwersalnych wyprowadzeń do podłączenia własnych peryferiów, jak wyświetlacze, przyciski czy czegokolwiek innego. Płytka ma wbudowany programator.
Ceny oryginalnych devboardów to koszt ok. 300...400 zł. Dobrym pomysłem jest zaprojektowanie i wykonanie własnej płytki testowej.
Przykład takich konstrukcji pokazano na fotografii 3, a schemat mniejszej, prostszej płytki jest pokazany na rysunku 1.
Płytki te nie zostały wprowadzone do sprzedaży w żadnym sklepie. Autor udostępnia pliki projektowe na serwerze Elektroniki Praktycznej, a czytelnik może je wykonać we własnym zakresie.
Przeanalizujemy prosty schemat z rysunku 1. Na płytce znajduje się jedynie układ FPGA MachXO2-256 (dokładniej LCMXO2-256HC-xSG32x, gdzie w miejscach x mogą być dowolne oznaczenia), generator sygnału zegarowego o częstotliwości 25 MHz (U2), złącza krawędziowe do wyprowadzenia wszystkich sygnałów (J1 i J2) oraz złącze programatora JTAG (K1).
Do zaprogramowania płytki można użyć programator JTAG opisany przeze mnie w EP 9/22 [1]. Programator JTAG korzysta z czterech linii sygnałowych: TMS, TCK, TDO i TDI. Wyprowadzenia GPIO układu FPGA podzielone są na cztery banki o numerach od 0 do 3. Każdy z tych banków ma osobne zasilanie, doprowadzone do VccIO0, VccIO1, VccIO2 oraz VccIO3. Napięcie każdego banku może być inne i musi mieścić się w przedziale od 1,14 V do 3,6 V. Dzięki takiemu rozwiązaniu, układ FPGA może pełnić rolę translatora napięć i pracować z układami zasilanymi różnymi napięciami.
Wyprowadzenie Vcc zasila rdzeń układu FPGA. W przypadku układów z serii standardowej HC napięcie zasilania musi wynosić 3,3 V lub 2,5 V, a w przypadku układów niskonapięciowych z serii ZE i HE napięcie zasilania rdzenia to 1,2 V.
Płytkę zaprojektowano w taki sposób, aby napięcie zasilające można było dostarczać z programatora lub z pinów 1, 2, 3 złącza J2. Wyprowadzenia VccIO połączone są do linii zasilającej Vcc poprzez rezystory o zerowej rezystancji R1, R2, R3 i R4. W razie potrzeby zasilania któregoś banku innym napięciem niż Vcc, należy wylutować odpowiedni rezystor i podłączyć żądaną linię zasilającą poprzez konektor J1.
Instalacja Lattice Diamond
Firma Lattice za darmo udostępnia pakiet oprogramowania Lattice Diamond, który zawiera edytor kodu źródłowego, syntezator, symulator i całą gamę różnych narzędzi. Podstawowa, darmowa wersja umożliwia wykorzystywanie wszystkich możliwości prostszych układów FPGA, takich jak MachXO2. Wersja płatna obsługuje zaawansowane układy serii ECP, jednak na początkowym etapie przygody z FPGA na pewno one nie będą potrzebne.
Aby pobrać potrzebne oprogramowanie, wchodzimy na stronę www.latticesemi.com i następnie klikamy Products, Lattice Diamond i ściągamy wersję dla systemu Windows lub Linux. W chwili pisania tego artykułu dostępna jest wersja 3.12 oraz service pack 3.12 SP.
W pierwszej kolejności należy pobrać i zainstalować 3.12, a dopiero później zainstalować service pack. Proces instalacji jest prosty i nie wymaga komentarza. Uruchamiamy instalator i klikamy dalej, dalej, dalej i zakończ.
Przy pierwszym uruchomieniu programu Diamond, zostanie wyświetlony komunikat o braku pliku z licencją. Musimy uzyskać darmową licencję. Na stronie www, z której pobraliśmy pakiet Diamond klikamy Request Node-locked License, po czym wypełniamy formularz.
Między innymi musimy podać adres MAC karty sieciowej, ponieważ licencja będzie do niej przywiązana (jeżeli w komputerze wymienimy kartę sieciową, wówczas trzeba będzie uzyskać nową licencję). Aby uzyskać adres MAC karty sieciowej w systemie Windows, klikamy Start, Uruchom i wpisujemy cmd, aby otworzyć wiersz poleceń. Następnie wpisujemy polecenie ipconfig /all i wciskamy enter. Miejsce w którym wyświetlany jest adres MAC zaznaczono na rysunku 2.
Adres MAC możemy także sprawdzić w Ustawieniach Sieciowych, które można otworzyć poprzez Panel Sterowania.
Na moim komputerze mam trzy karty sieciowe, w tym wirtualną kartę utworzoną przez VirtualBox. Pomimo że ta karta jest tylko programową emulacją, można użyć jej adresu do pozyskania licencji do Lattice Diamond. Wyświetlony adres przepisujemy (bez myślników!) do formularza na stronie Lattice. Następnie zaznaczamy Select All, aby uzyskać dostęp do wszystkich darmowych składników, akceptujemy regulamin i klikamy Generate Licence. Po chwili otrzymujemy plik z licencją na podany przez nas adres e-mail. Licencję należy pobrać i umieścić w katalogu C:\licenses\FlexLM. Od tej pory możemy uruchomić Lattice Diamond.
W następnej części
W kolejnym wydaniu EP opiszę podstawowe funkcjonalności programu Lattice Diamond oraz utworzę prosty projekt, aby zaprezentować proces tworzenia aplikacji dla FPGA.
Dominik Bieczyński
leonow32@gmail.com
[1] Niedrogi programator JTAG do układów FPGA: https://ep.com.pl/projekty/projekty-ep/15365-niedrogi-programator-jtag-do-ukladow-fpga