Spisu treści:

Arduino jako tani układ scalony FPGA: 5 kroków (ze zdjęciami)
Arduino jako tani układ scalony FPGA: 5 kroków (ze zdjęciami)

Wideo: Arduino jako tani układ scalony FPGA: 5 kroków (ze zdjęciami)

Wideo: Arduino jako tani układ scalony FPGA: 5 kroków (ze zdjęciami)
Wideo: Arduino w edukacji – Zbyszek „HardeN” Brożbar 2024, Listopad
Anonim
Arduino jako tani układ scalony FPGA
Arduino jako tani układ scalony FPGA

Projektowanie sprzętowych obwodów logicznych może być świetną zabawą. Starym szkolnym sposobem na to było użycie bramek NAND, na tabliczce do krojenia chleba, połączonej przewodami połączeniowymi. Jest to nadal możliwe, ale nie trzeba wiele czasu, zanim liczba bramek wymknie się spod kontroli. Nowszą opcją jest użycie FPGA (Field Programmable Gate Array). Te chipy mogą same się przełączyć, aby stać się dowolnym cyfrowym obwodem logicznym, który można zaprojektować, ale nie są tanie i łatwo dostępne. Pokażę, jak można zastąpić ten układ FPGA tanim układem Atmega z Arduino UNO, skutecznie umieszczając układ cyfrowy w obudowie DIP, która jest bardzo przyjazna dla płytki stykowej.

Krok 1: Zaprojektuj obwód, który będzie reprezentował „FPGA”

Zaprojektuj obwód, który
Zaprojektuj obwód, który
Zaprojektuj obwód, który
Zaprojektuj obwód, który
Zaprojektuj obwód, który
Zaprojektuj obwód, który

Zbuduję sumator 2 bity + 2 bity. Zajmuje dwie pary logicznych pinów wejściowych i wyprowadza jedną trójkę pinów wyjściowych.

Aby to zrobić z bramkami NAND, zobacz schemat na zdjęciu. Potrzebuje 14 bramek NAND. Użyłem 4 poczwórnych chipów TTL z bramką NAND i podłączyłem je na płytce do chleba.

Dodałem kilka diod LED (nie zapomnij o rezystorach ograniczających prąd), aby pokazać, kiedy piny wejściowe i wyjściowe są włączone (wysokie), a kiedy wyłączone (niskie). Aby wysterować szpilki wejściowe, podłączyłem je do szyny uziemiającej lub dodatniej szyny zasilającej.

Ten obwód działa, ale zajmuje już 4 chipy TTL i jest szczurzym gniazdem przewodów. Gdyby potrzebnych było więcej bitów, byłoby więcej desek chlebowych i więcej skoczków. Bardzo szybko rozmiar obwodu wymknąłby się spod kontroli.

Na marginesie, pracując z bramkami TTL, nie wyprowadzają dokładnie 0 V lub 5 V, jak można by się spodziewać. Często wyprowadzają około 3V dla „wysokiego”, ale dokładne napięcie jest w bardzo szerokim zakresie. Ten sam obwód wykorzystujący chipy równoważne CMOS miałby lepsze dokładnie wahania od 0 V do dokładnie 5 V.

Krok 2: Wprowadź FPGA

Wejdź do FPGA
Wejdź do FPGA
Wejdź do FPGA
Wejdź do FPGA

FPGA to fantastyczny układ scalony, który może stać się dosłownie dowolną kombinacją bramek logicznych, połączonych ze sobą w dowolnej kombinacji. Jeden projektuje „obwód” w języku projektowania sprzętu (HDL). Istnieje wiele takich języków, z których jeden nazywa się Verilog. Plik.v na zdjęciu jest odpowiednikiem dwubitowego sumatora Verilog. Plik.pch poniżej jest również potrzebny do przypisania pinów wejściowych i wyjściowych wymienionych w pliku Verilog do prawdziwych pinów sprzętowych na chipie.

W tym przypadku używam płytki rozwojowej Lattice Semiconductors iCEstick (https://www.latticesemi.com/icestick). Właściwy układ FPGA to iCE40HX-1k, z nieco ponad 1000 bramkami, z których każda może stać się dowolną bramką logiczną. Oznacza to, że każda bramka może być bramką NAND lub bramką OR, bramką NOT, NOR, XOR itp. Dodatkowo każda bramka może obsługiwać więcej niż dwa wejścia. Jest to specyficzne dla każdego producenta, ale w iCE40 każda bramka może obsłużyć 4 wejścia. W ten sposób każda bramka jest znacznie bardziej wydajna niż 2 wejściowe bramki NAND.

Musiałem przypisać 4 piny wejściowe i 3 piny wyjściowe odpowiednio do fizycznych pinów 91, 90, 88, 87, 81, 80 i 79. Jest to specyficzne dla układu FPGA i płytki zaciskowej, na której się znajduje, oraz sposobu podłączenia tych pinów do portu PMOD. Jest to dostępne w arkuszach danych dla tej płyty FPGA.

Lattice zapewnia własny łańcuch narzędzi do syntezy (odpowiednik FPGA do kompilacji dla procesorów) z Verilog, ale użyłem darmowego łańcucha narzędzi o otwartym kodzie źródłowym icestorm (https://www.clifford.at/icestorm/). Instrukcja instalacji jest dostępna na tej stronie. Po zainstalowaniu Icestorm i pliku Verilog i pcf, polecenia załadowania tego obwodu do FPGA to:

yosys -p "synth_ice40 -blif twoBitAdder.v" twoBitAdder.blif

arachne-pnr -d 1k -p iCEstick.pcf twoBitAdder.blif -o twoBitAdder.asc

icepack twoBitAdder.asc twoBitAdder.bin

iceprog twoBitAdder.bin

Działa to świetnie, ale wraz z wysyłką tego iCEsticka kosztuje około 30 USD. Nie jest to najtańszy sposób na zbudowanie obwodu cyfrowego, ale jest potężny. Ma ponad 1000 bramek, a do tego malutkiego obwodu wykorzystuje tylko 3 z nich. Odpowiednik bramki NAND używał 14 bramek. Wynika to z faktu, że każda bramka może stać się dowolnym rodzajem bramki, a każda bramka jest w rzeczywistości bramką 4 wejściową. Każda brama może więcej. Jeśli potrzebujesz więcej bramek, iCEstick ma większego brata z 8000 bramek, co kosztuje około dwukrotnie. Inni producenci mają inne oferty, ale cena może być dość wysoka.

Krok 3: Od FPGA do Arduino

Od FPGA do Arduino
Od FPGA do Arduino

Układy FPGA są świetne, ale mogą być drogie, trudne do zdobycia i nie są zbyt przyjazne dla chleba. Przyjazny dla płytek chlebowych i tani chip to Atmega 328 P, który jest dostarczany w zgrabnym opakowaniu DIP, idealnym do płytek chlebowych. Można go również kupić za około 4 USD. To serce Arduino UNO. Można oczywiście używać całego UNO, ale taniej, możemy zdjąć Atmegę 328 P z UNO i używać jej samodzielnie. Użyłem jednak płyty UNO jako programatora dla Atmegi.

W tym momencie będziesz potrzebować

1. Arduino UNO, z wymiennym procesorem Atmega 328P.

2. Kolejna Atmega 328P z wstępnie wypalonym bootloaderem Arduino, w miejsce tego, który zamierzamy wyjąć z UNO. (Opcjonalne, zakładając, że nadal chcesz mieć użyteczne UNO).

Celem jest przekonwertowanie pliku Verilog na projekt arduino, który można załadować do 328P. Arduino bazuje na C++. Dogodnie jest tłumacz z Verilog na C++, zwany Verilator (https://www.veripool.org/wiki/verilator). Verilator jest przeznaczony do użytku przez projektantów sprzętu, którzy muszą symulować swoje projekty przed wprowadzeniem tych projektów do drogiego sprzętu. Verilator cross kompiluje Verilog do C++, a następnie użytkownik zapewnia wiązkę testową, aby zapewnić symulowane sygnały wejściowe i rejestrować sygnały wyjściowe. Zamierzamy go użyć, aby wepchnąć projekt Verilog do Atmega 328P za pomocą łańcucha narzędzi Arduino.

Najpierw zainstaluj Verilator. Postępuj zgodnie z instrukcjami na

Zainstaluj również Arduino IDE i sprawdź, czy może połączyć się z Arduino UNO przez USB.

Będziemy używać tego samego pliku verilog, co w przypadku FPGA, z wyjątkiem tego, że nazwy pinów muszą zostać zmienione. Dodałem podkreślenie (_) na początku każdego. Jest to potrzebne, ponieważ biblioteki arduino zawierają plik nagłówkowy, który tłumaczy rzeczy takie jak B0, B001 itp. Na liczby binarne. Inne nazwy pinów wejściowych byłyby w porządku, ale B0 i B1 spowodowałyby niepowodzenie kompilacji.

W katalogu zawierającym twoBitAdder.v i iCEstick.pcf uruchom następujące polecenie:

verilator -Wall --cc twoBitAdder.v

Stworzy to podkatalog o nazwie obj_dir zawierający kilka nowych plików. Potrzebujemy tylko plików nagłówka i cpp, VtwoBitAdder.h, VtwoBitAdder.cpp, VtwoBitAdder_Syms.h i VtwoBitAdder_Syms.cpp.

W Arduino IDE utwórz nowy szkic o nazwie twoBitAdder.ino. Spowoduje to utworzenie pliku ino w nowym katalogu zwanym również twoBitAdder, w katalogu szkicownika Arduino. Skopiuj pliki VtwoBitAdder.h i VtwoBitAdder.cpp do tego folderu twoBitAdder w folderze Arduino.

Teraz skopiuj pliki nagłówkowe z instalacji weryfikatora.

cp /usr/local/share/verilator/include/verilated*.

na koniec skopiuj do biblioteki std c++ z https://github.com/maniacbug/StandardCplusplus. Zgodnie z ich instrukcjami instalacji „Jest to instalowane tak jak zwykła biblioteka Arduino. Rozpakuj zawartość dystrybucji do folderu „biblioteki” pod szkicownikiem. Na przykład mój szkicownik znajduje się w /home/maniacbug/Source/Arduino, więc ta biblioteka znajduje się w /home/maniacbug/Source/Arduino/libraries/StandardCplusplus.

Pamiętaj, aby zresetować Arduino IDE po jego zainstalowaniu."

Teraz zastąp zawartość twoBitAdder.ino tą podaną w tym kroku. To jest wiązka testowa, której oczekuje werilator, która ustawia piny wejścia/wyjścia, następnie w pętli odczytuje piny wejściowe, podaje je do VtwoBitAdder (przetłumaczona wersja naszego układu), następnie odczytuje wyjścia z VtwoBitAdder i stosuje je do pinów wyjściowych.

Ten program powinien skompilować się i wykonać na Arduino UNO.

Krok 4: Od Arduino do układu DIP na płycie do chleba

Od Arduino do DIP Chip na płytce do chleba
Od Arduino do DIP Chip na płytce do chleba

Teraz, gdy program działa na Arduino, nie potrzebujemy już samej płytki Arduino. Wszystko czego potrzebujemy to procesor.

Wyjmij ostrożnie Atmega 328P z gniazda Arduino UNO i opcjonalnie włóż jego zamiennik.

Połóż Atmegę 328P na płytce stykowej. Połóż koniec dwoją skierowaną do góry na desce do krojenia chleba. Pin 1 to lewy górny pin. Pin 2 jest następny w dół i tak dalej do pinu 14, który znajduje się w lewym dolnym rogu. Następnie pin 15 znajduje się w prawym dolnym rogu, a piny 16 do 28 odliczają z powrotem prawą stronę żetonu.

Połącz styki 8 i 22 z masą.

Podłącz pin 7 do VCC (+5V).

Podłącz kryształ kwarcowy 16 Mhz między pinami 9 i 10. Również mały kondensator (22 pF) między pinem 9 a masą oraz między pinem 10 a masą. Daje to Atmega 328P częstotliwość zegara 16 MHz. W innym miejscu znajdują się instrukcje dotyczące uczenia 328P, aby zamiast tego używał wewnętrznego zegara 8 MHz, co pozwoliłoby zaoszczędzić kilka części, ale spowolniłoby to procesor.

Porty Arduino GPIO 5, 6, 7 i 8, których użyliśmy do pinów wejściowych, są w rzeczywistości fizycznymi pinami 11, 12, 13, 14 w Atmega 328P. To byłyby cztery dolne szpilki po lewej stronie.

Porty Arduino GPIO 11, 10 i 9, których użyliśmy do pinów wyjściowych, są w rzeczywistości fizycznymi pinami 17, 16, 15 w Atmega 328P. To byłyby trzy dolne piny po prawej stronie.

Diody podpiąłem do tych pinów jak poprzednio.

Krok 5: Wniosek

Wniosek
Wniosek

Chipy TTL działają, ale do zbudowania czegokolwiek potrzeba ich wielu. FPGA działają naprawdę dobrze, ale nie są tanie. Jeśli możesz żyć z mniejszą liczbą pinów IO i niższą prędkością, to Atmega 328P może być dla Ciebie chipem.

Kilka rzeczy, o których należy pamiętać:

FPGA:

Zawodowiec

- Może obsługiwać szybkie sygnały. Ponieważ nie ma procesora przetwarzającego wąskie gardło do jednej instrukcji na raz, czynnikiem ograniczającym jest opóźnienie propagacji przez bramki w danym obwodzie. W wielu przypadkach może to być znacznie szybsze niż zegar dostarczony z chipem. W moim projekcie obliczone opóźnienie pozwoliłoby, aby twoBitAdder zareagował na około 100 milionów zmian wartości wejściowych na sekundę (100 MHz), mimo że zegar pokładowy jest tylko kryształem 12 MHz.

- W miarę jak projekt staje się bardziej złożony, wydajność istniejących obwodów nie ulega pogorszeniu (znacznie). Ponieważ dodawanie obwodów do struktury jest po prostu umieszczaniem czegoś nowego w nieużywanej nieruchomości, nie ma to wpływu na istniejące obwody.

- W zależności od FPGA, liczba dostępnych pinów IO może być bardzo duża i generalnie nie są one zablokowane w żadnym konkretnym celu.

Kon

- Może być drogi i/lub trudny do zdobycia.

- Zazwyczaj jest dostarczany w pakiecie BGA, który wymaga jakiejś płytki zaciskowej do pracy z chipem w dowolnym projekcie amatorskim. Jeśli wbudujesz go w projekt z niestandardową wielowarstwową płytką drukowaną SMT, nie stanowi to problemu.

- Większość producentów FPGA dostarcza własne oprogramowanie do projektowania o zamkniętym kodzie źródłowym, które w niektórych przypadkach może kosztować lub mieć datę wygaśnięcia licencji.

Arduino jako FPGA:

Zawodowiec

- Tani i łatwy do zdobycia. Po prostu wyszukaj atmega328p-pu na Amazon. Powinny wynosić około 4 USD za sztukę. Kilku sprzedawców sprzedaje je po 3 lub 4 sztuki.

- Jest to pakiet DIP, co oznacza, że idealnie pasuje do płytki stykowej z zewnętrznymi pinami.

- Jest to urządzenie 5 V, które może ułatwić komunikację z innymi urządzeniami 5 V.

Kon

- ATMEGA328P ma ograniczoną liczbę pinów IO (23), a kilka z nich jest zarezerwowanych do określonych zadań.

- Wraz ze wzrostem złożoności obwodu zwiększa się ilość kodu uruchamianego w metodzie pętli Arduino, co oznacza, że czas trwania każdego cyklu jest dłuższy.

- Nawet jeśli złożoność obwodu jest niska, każdy cykl wymaga wielu instrukcji procesora, aby pobrać wartości pinów wejściowych, zapisać wartości pinów wyjściowych i powrócić na początek pętli. Z kryształem 16Mhz, nawet przy jednej instrukcji na cykl zegara, pętla nie będzie działać więcej niż może 1 milion razy na sekundę (1Mhz). W przypadku większości amatorskich projektów elektronicznych jest to jednak o wiele szybsze niż to konieczne.

Zalecana: