Skocz do zawartości
Elvis

Przepis na soft-procesor w FPGA na płytce Maximator

Pomocna odpowiedź

Nie wiem, czy kogoś to zainteresuje, mam nadzieję że tak - ale jeśli nie to będę miał chociaż dla siebie zapisany tutorial jak wgrać soft-procesor na FPGA 🙂

W każdym razie po próbach z różnymi układami FPGA oraz czasami syntezy prostych projektów postanowiłem nieco więcej czasu poświęcić płytkom Maximator produkowanym przez firmę Kamami: https://kamami.pl/zestawy-uruchomieniowe/561438-zestaw-maximator-maximator-expander-kamami-usb-blaster.html

Płytka wyposażona jest w układ z rodziny MAX10 produkowany przez firmę Altera (przejętą jakiś czas temu przez Intel). Dokładniej jest to model: 10M08DAF256C8GES

Układ wyposażony jest w około 8000 elementów logicznych (10M08, czyli MAX10 z 8k elementów logicznych) - to niby niewiele, ale idealnie pasuje jako kolejny krok po kursie FPGA z Forbota i płytce ElbertV2, która ma układ z 1600 elementami. Mniej rozbudowany układ to szybsza synteza, ale co ważniejsze bardzo przyzowita cena zestawu - za 249 zł dostajemy programator, płytkę bazową z układem FPGA oraz płytkę rozszerzeń (wyprowadzenia zgodne z Arduino). Więcej informacji znajdziemy na stronie sklepu Kamami oraz stronie dedykowanej płytce Maximator: http://maximator-fpga.org

Jednak tym co chciałem opisać nie jest sama płytka, ale krótki opis kroków niezbędnych do utworzenia i zaprogramowania procesora w układzie FPGA. W przypadku ElbertV2 można było użyć rdzenia PicoBlaze, ale jego możliwości były ograniczone przez bardzo małą pamięć oraz niezbyt przyjazne narzędzia (właściwie tylko programowanie w asemblerze bez debuggera).

Jako ciekawostkę spróbuję pokazać o ile wygodniej można podobny efekt uzyskać na płytce Maximator.

Do tworzenia projektu używam środowiska Altera Quartus w wersji 17.0 - wersja Lite jest darmowa i dostępna na stronie: https://www.altera.com/downloads/download-center.html

Aktualnie jest już wersja 17.1, ale pod Linux-em coś złego się dzieje z Eclipse w tej wersji, więc zdecydowałem się na używanie poprzedniej edycji.

Po uruchomieniu, ekran Quartus-a wygląda mniej więcej tak:

Jeśli chcemy utworzyć projekt z własnym soft-procesorem, z menu File wybieramy opcję "New Project Wizard"

Pojawi się kreator projektu. W pierwszym kroku wybieramy katalog (najlepiej nowy, środowisko go utworzy), nazwę projektu oraz nazwę głównego modułu:

Ja używam jako katalogu: /home/elvis/fpga/nios05_max, nazwa projektu: nios05_max, a główny moduł ma niezbyt oryginalną nazwę - "top".

Następne strony możemy pominąć naciskając "Next", aż dojdziemy do wybóru układu FPGA.

Chcemy wybrać 10M08DAF256C8GES, ale Qauartus wspiera znaczną liczbę układów i odnalezienie naszego może być niemałym wyzwaniem. Pomogą nam w tym filtry widoczne w górnej części okna - wybierając rodzinę układów, obudowę itd. zmniejszamy liczbę dostępnych modeli.

Po odnalezieniu naszego układu naciskamy Next i przechodzimy przez kolejne okna kreatora - na koniec generujemy projekt naciskając Finish:

Projekt został przygotowany, czas dodać do niego soft-procesor Nios2. Z menu Tools wybieramy opcję Qsys:

Uruchomimy w ten sposób nowe narzędzie - Qsys (w wersji 17.1 ma on nową nazwę, ale działa tak samo).

Jak widzimy Qsys domyślnie dodaje moduł zegara clk_0. W oknie po lewej stronie znajdziemy dostępne komponenty. Wybieramy "Processors and Peripherals"->"Embedded Processors"->"Nios II Processor":

Komponent dodajemy do naszego projektu, zobaczymy wtedy konfigurator, w którym zaznaczamy wersję "Nios II/e":

Następnie dodajemy pamięć dla programu i danych - wybieramy "Basic Functions"->"On Chip Memory"->"On Chip Memory (RAM or ROM)". Pojawi się kolejny konfigurator:

W polu "Total memory size" możemy zmienić domyślną wartość 4096 (czyli 4k) na powiedzmy 32768 - czyli 32k pamięci. Maksymalna wielkość to ok. 48k (kiedyś Spectrum miało tyle RAM-u, ktoś to jeszcze pamięta?).

Bardzo ważne jest wyłączenie opcji "Initialize memory content" - inaczej projekt nie zadziała.

Na koniec dodajemy emulator portu szeregowego działający przez JTAG - wybieramy "Interface Protocols"->"Serial"->"JTAG UART" i akceptujemy domyślną konfigurację.

Powinnniśmy otrzymać konfigurację podobną do następującej:

Teraz musimy połączyć komponenty naszego układu. Właściwie łączymy wszystkie oprócz "instruction master" procesora i jtag_uart_0:

Następnie musimy wybrać procesor, czyli moduł "nios2_gen2_0", prawy klawisz mysz i wybrać opcję "Edit". Zobaczymy to samo okno konfiguratora, które widzieliśmy wcześniej dodając procesor. Jednak teraz wchodzimy do zakładki "Vectors" i ustalamy, że wektor reset-u (Reset vector memory) i przerwań (Exception vector memory) ma być ulokowany w naszej pamięci RAM (onchip_memory2_0):

Na koniec musimy przypisać poprawne adresy każdemu modułowi. Może to za nas zrobić automat, wystarczy że wybierzemy z menu "System" opcję "Assign Base Adresses".

Po tym kroku powinny zniknać błędy widoczne wcześniej w dolnej części okna. Możemy teraz zaspiać projekt - najlepiej pod nazwą "top", czyli jako główny moduł.

Na koniec wybieramy opcję "Generate HDL" i Qsys wygeneruje dla nas odpowiednie pliki:

Teraz możemy zamknąć okno Qsys-a i wrócić do głównego narzędzia, czyli Quartusa.

Co ciekawe nasz ciężko wyklikany moduł nie został jeszcze dołączony do projektu. Aby go dodać, z menu "Project" wybieramy opcję "Add/Remove Files in Project" - a następnie dodajemy plik top.qsys:

Teraz możemy skompilować nasz projekt. Co ciekawe, kompilacja się powiedzie chociaż nie skonfigurowaliśmy jeszcze poprawnie pinów - ale chociaż Quartus ustali listę wyprowadzeń.

Teraz musimy poprawić przypisanie pinów. Z menu "Assignments" wybieramy opcję "Pin Planner":

Po uruchomieniu zobaczymy całkiem rozbudowane narzędze do konfiguracji pinów. W tej chwili interesuje nas lista rozpoznanych pinów widoczna w dolnej części okna:

Linia zegara została nazwana "clk_clk". Musimy połączyć ją z pinem L3 - opis pinów znajdziemy na schemacie płytki, do L3 podłączony jest 10MHz generator. Modyfikujemy więc konfigurację następująco:

Teraz zamykamy Pin Planner i ponownie syntetyzujemy projekt. Po chwili kod powinien być gotowy zaprogramowania płytki.

W okienku zadań możemy wybrać opcję "Program Device (Open Programmer)". Jeśli mamy odrobinę szczęścia, wystarczy że przyciśniemy "Start" i po chwili pole "Progres" powinno zmienić się w zielony wesoły pasek z opisem "100% (Successful)" (przy okazji, programowanie trwa moment, dużo krócej niż ElbertV2).

Mamy już gotowy układ  FPGA z wgranym procesorem. Teraz wystarczy napisać na niego program.

c.d.n.

[ Dodano: 11-05-2018, 14:51 ]

Teraz będzie już tylko łatwiej. Na początek otwieramy menu "Tools" i wybieramy opcję "Nios II Software Build Tools For Eclipse":

Po chwili zobaczymy najzwyklejszego Eclipse-a. No może Eclipse z kilkoma pluginami.

Z menu "File" wybieramy pierwszą opcję o strasznie długim tytule "Nios II Application and BSP from Template"

Teraz wypełniamy pola opisujące nasz projekt. Jako "SOPC Information File name" wybiramy plik top.sopcinfo, nazwę projektu wpisujemy dowolną np. nios05, możemy też wybrać interesujący nasz szablon projektu - ja używam "Hello World Small"

Przyciskamy Next lub od razu Finish i po chwili możemy się cieszyć wygenerowanym kodem naszego pierwszego projektu:

Kod programu możemy zostawić bez zmian, albo poprawić na bardziej odpowiedni:

#include "sys/alt_stdio.h"

int main()
{ 
 alt_putstr("Hello Forbot !!!\n");

 while (1);

 return 0;
}

W każdym razie nasz program powinien się skompilować jak każdy inny w środowisku Eclipse. Teraz jedyne co nam pozostało to wgrać go na płytkę.

Z menu "Debug" wybieramy opcję "Debug Configurations", a następnie podwójnie klikamy na opcji "Nios II Hardware":

Teraz wystarczy kliknąć przycisk "Debug" i po chwili zobaczymy debugger zatrzymany na początku funkcji main.

Możemy uruchomić nasz program, a następnie otworzyć zakładkę "Nios II Console" - to w niej pojawiają się komunikaty z UART-a emulowanego poprzez JTAG. Jak widzimy nasz program działa i pozdrawia Forbota 🙂

Mamy teraz działający procesor płytce z układem FPGA. Programowanie odbywa się w komfortowych warunkach, a pamięć programo chociaż nie ogromna pozwoli na napisanie niejednej ciekawej aplikacji.

Ja natomiast mam nadzieję, że nikogo nie zanudziłem tym nieco długim wpisem.

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Cześć Elvis,

bardzo fajnie napisany artykuł 😃 Posiadam Maximatora i mam nadzieję, że znajdę czas w ten weekend aby wypróbować twój "przepis" na NIOS'a.

Pozdrawiam

[ Dodano: 11-05-2018, 17:57 ]

Cześć Elvis,

a mógłbyś może dołączyć projekt Quartus'a do postu. Tak na wszelki wypadek, gdyby ktoś "utknął" w którymś momencie - będę się starał zrobić wszystko 'od zera' wedle twojej procedury?

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

Nie ma problemu, projekt jest w załączonym pliku.

nios05_max.zip

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

NIOS II to jest prosty tak naprawdę - np: u mnie na uczelni to my jako ćwiczenie dajemy obsługę wyświetlaczy Nokii które są dostępne na KAMAMI (tj: https://kamami.pl/lcd-84x48/180404-modlcd1.html). A proste bo jakby nie patrzeć to wszystkie instrukcje są wskaźnikami na dane rejony pamięci, na której pracuje softprocesor (a w których zawarte są związane z nimi rejestry )i starczy tylko wstawiać odpowiednie wartości w danych miejscach tejże pamięci (poza tym tych rejestrów sporo wcale nie jest jak w STM-ach czy AVR-ach i dlatego tym bardziej ten softprocesor jest prosty). To tak na boku ^^

Udostępnij ten post


Link to post
Share on other sites

To może zamiast linka do wyświetlacza podziel się linkiem do materiałów, które przerabiacie na ćwiczeniach? Sterowanie wyświetlacza brzmi ciekawie, chociaż mam wrażenie, że pisanie o rejestrach w pamięci jest nieco mało precyzyjne - w każdym razie chętnie bym materiały pooglądał. Może i u mnie na uczelni coś na FPGA się dzieje, ale niestety w innej katedrze.

Udostępnij ten post


Link to post
Share on other sites

Prawa autorskie niestety, więc nie mogę tak ot co upowszechniać tego (takie zarządzenie u nas)

Udostępnij ten post


Link to post
Share on other sites

Brakuje w tym projekcie tylko komponentu System ID, który zabezpiecza nas przed wgraniem softu z BSP niezgodnym z tym co jest aktualnie skonfigurowane w układzie FPGA. Poza tym nie wiem czy tylko ja mam takie wrażenie, ale Platform Designer (dawny Qsys) spisuje się lepiej niż obecny system przygotowywania MicroBlaze?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
2 minuty temu, piotrva napisał:

Poza tym nie wiem czy tylko ja mam takie wrażenie, ale Platform Designer (dawny Qsys) spisuje się lepiej niż obecny system przygotowywania MicroBlaze?

Cześć,

zgadzam się w pełni z tą opinią.

Pozdrawiam

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

A jaki jest obecny system przygotowywania MicroBlaze?

Udostępnij ten post


Link to post
Share on other sites
6 minut temu, Elvis napisał:

A jaki jest obecny system przygotowywania MicroBlaze?

Cześć Elvis,

najpopularniejszym jest ten promowany przez Xilinx'a oparty na Vivado - budowa soft-procesora poprzez składanie go z "IP corów" Xilinxa np. Core Microblaze + rózne moduły oparte np. na magistrali AXI, osoby generator zegara dla CPU itp. Potem synteza tak zbudowanego projektu w Vivado i jego eksport do SDK. Są także gotowe projekty oparte na SDK lub EDK (komercyjna licencja). Ale jak sam mogłeś się przekonać na prostym tutorialu dla Microblaze jest to problematyczne.

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

Ale przecież Maximator ma FPGA MAX10, na nim działa Nios II, a nie MicroBlaze... Do konfiguracji używany jest QSYS, przemianowany na Platform Designer - natomiast całość działa praktycznie identycznie jak w przypadku Vivado dla Xilinxa. Właściwie główna różnica to inny wygląd - Vivado pozwala na rysowanie schematu, a Platform Designer używa bardziej tabelarycznej postaci. No i domyślnie używa magistrali Avalon, ale można do niej podpinać peryferia z AXI, AHB, czy APB. Wynik jest też eksportowany do SDK i programowanie odbywa się podobnie jak w przypadku narzędzi Xilinxa w Eclipse.

Prawdę mówiąc różnice są moim zdaniem niewielkie, chociaż jak dla mnie narzędzia Altery są trochę wygodniejsze - ale to pewnie kwestia przyzwyczajenia. Natomiast dla małych projektów Altera bije na głowę Xilix-a czasem syntezy.

To co napisałem nie dotyczy Microblaze - i nie bardzo rozumiem co jest problematyczne...

Udostępnij ten post


Link to post
Share on other sites
3 minuty temu, Elvis napisał:

Ale przecież Maximator ma FPGA MAX10, na nim działa Nios II, a nie MicroBlaze...

To co napisałem nie dotyczy Microblaze - i nie bardzo rozumiem co jest problematyczne...

Elvis to chyba kwestia złego zrozumienia się 😉

Mnie wydaje się iż kolega chciał napisać, iż metoda budowy NIOSII w QSYS jest wygodniejsza niż ta w Vivado (właśnie ta postać tabelaryczna). W Vivado wcale nie jest prosto na schemacie prawidłowo połączyć te wszystkie IP cory. A co gorsza potem na etapie syntezy i implementacji pojawią się mnóstwo nie do końca zrozumiałych błędów związanych z konfiguracją pinów układu FPGA.

Chodziło tylko o zasygnalizowanie faktu, że dla NIOS jest to wygodniejsze - z czym się zgadzam.

Pozdrawiam

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Elvis - chodzi o porównanie Intel FPGA / Xilinx. Moim zdaniem interfejs jak to nazwałeś w "bardziej tabelarycznej postaci" jest wygodniejszy i bardziej czytelny niż rysowanie schematu w Vivado.

I też czas syntezy w Quartus wydaje mi się o niebo krótszy niż podobnego projektu w Vivado, ale tu by trzeba dokładnie porównać narzędzia do syntezy i ich ustawienia (np. jaki poziom optymalizacji jest wybrany, etc).

Widać tym małym wpisem rozpętałem off-topic pod Twoim fajnym i bardzo kompaktowym poradnikiem 😉

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Ok, faktycznie za szybko przeczytałem i jak widać bez zrozumienia 🙂

A że temat odżył to może i lepiej - w sumie FPGA to bardzo ciekawe zagadnienie.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Cześć Elvis,

dopiero dzisiaj wypróbowałem  twój tutorial dla "NIOS II" (na Maximatorze) wszystko działa bez żadnych problemów.

Pozdrawiam

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...