Skocz do zawartości

Kurs FPGA - własne programy #3


Elvis

Pomocna odpowiedź

Wygląda na to, że FPGA powoli zdobywa sobie popularność na naszym forum. Ja jednak nadal uważam, że warto poznać układy tego typu i nawet jeśli wiedza nie przychodzi łatwo (przynajmniej w moim przypadku), można spróbować się nią podzielić.

Jakiś czas temu pojawiło się pytanie o PID na FPGA. Pewnie istnieje możliwość zaimplementowania tego algorytmu w FPGA, jednak typowe rozwiązania, a przy najmniej większość opisywanych w sieci jest realizowana przez "wgranie" mikroprocesora i programową implementację PID-a.

Zestaw Elbertv2 jest świetny do nauki, ale jego zasoby są nieco małe do takiego podejścia. Próbowałem użyć rdzenia MicroBlaze, które jest dostarczane przez Xilinx-a, ale bez sukcesów - wygląda na to, że XC3S50 jest po prostu za mały do takiego podejścia.

Jednak to co wygląda na problem może czasem być świetną okazją do nauki - a dlaczego nie spróbować przygotować własnego, maksymalnie uproszczonego mikroprocesora?

Jako bazę wykorzystuję świetną książkę "Projektowanie układów cyfrowych z wykorzystaniem języka VHDL" napisaną przez Mark-a Zwolińskiego. https://www.wkl.com.pl/projektowanie-ukladow-cyfrowych-z-wykorzystaniem-j,1,1,180?

Jest w niej opisany przykład realizacji własnego mikrokontrolera. Po drobnych zmianach i dostosowaniu do Elbert-a, okazuje się że taki procesor może działać na naszym FPGA. Program na razie ma długość 5 instrukcji asemblera, realizuje prosty licznik binarny, ale ile daje radości 🙂

Jeśli będzie zainteresowanie tematem, chętnie podzielę się ciężko zdobytą wiedzą i przykładami.

  • Lubię! 1
Link do komentarza
Share on other sites

Zestaw Elbertv2 jest świetny do nauki, ale jego zasoby są nieco małe do takiego podejścia. Próbowałem użyć rdzenia MicroBlaze, które jest dostarczane przez Xilinx-a, ale bez sukcesów - wygląda na to, że XC3S50 jest po prostu za mały do takiego podejścia.

...

Jeśli będzie zainteresowanie tematem, chętnie podzielę się ciężko zdobytą wiedzą i przykładami.

Cześć ja byłbym zainteresowany twoim kodem, jeśli możesz się podzielić to z chęcią go wypróbuję. Odnośnie Soft-CPU to Microblaze jest za duży dla Elberta V2, ale 8-mio bitowy PicoBlaze powinien dać się uruchomić na Elbercie.

https://www.xilinx.com/products/intellectual-property/picoblaze.html

Pozdrawiam

Link do komentarza
Share on other sites

Kod jest wymaga jeszcze dużo poprawek. Moduły ALU, RAM, IR, CPU są właściwie takie same jak w przykładach z książki. Dodałem OUTPUT żeby zaimplementować sterowanie ledami, do sequencera dodałem też dwie instrukcje.

Z góry uprzedzam, że w głównym module (simple_cpu02) jest paskudny dzielnik częstotliwości zegara - już o tym było na forum, że to niepoprawne, ale docelowo cpu powinien używać głównego zegara. Tylko że wtedy wszystko działa po prostu za szybko...

Druga sprawa to pamięć RAM. Jest zaimplementowana w vhdl-u i zwykłe 32B marnują ogromną ilość zasobów. Więc wypadałoby użyć pamięci dostarczanej przez Spartan-a. Wtedy powinno zostać sporo komórek wolnych i można byłoby pamięć zwiększyć.

Ale to tylko pierwsza próba 🙂

simple_cpu02.zip

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Kod jest wymaga jeszcze dużo poprawek. Moduły ALU, RAM, IR, CPU są właściwie takie same jak w przykładach z książki. Dodałem OUTPUT żeby zaimplementować sterowanie ledami, do sequencera dodałem też dwie instrukcje.

Z góry uprzedzam, że w głównym module (simple_cpu02) jest paskudny dzielnik częstotliwości zegara - już o tym było na forum, że to niepoprawne, ale docelowo cpu powinien używać głównego zegara. Tylko że wtedy wszystko działa po prostu za szybko...

Druga sprawa to pamięć RAM. Jest zaimplementowana w vhdl-u i zwykłe 32B marnują ogromną ilość zasobów. Więc wypadałoby użyć pamięci dostarczanej przez Spartan-a. Wtedy powinno zostać sporo komórek wolnych i można byłoby pamięć zwiększyć.

Ale to tylko pierwsza próba 🙂

Niestety nie posiadam tej książki. Nie przejmuj się jeśli nie wszystko jest idealnie, odnośnie RAM to ja też w moim projekcie używałęm tablicy w VHDL'u aby zasymulować także 32 bajty RAM. Dzisaj jestem ostatni raz w pracy przed dłuższą przerwą świąteczną, będę miałczas, aby poeksperymentować 😃 . Zamierzam też zamieścić mój projekt sterownika rolet (nie robiłem tego wcześniej, bo bez odpowiedniego opisania projektu np. wykresów czasowych i ogólnego opisu sposobu działania miałoby to mały sens). Teraz będę miał na to czas. Chciałb ym także spróbować, czy PicoBlaze (dużo mniejszy od Microblaze) da się uruchomić na Elbert'cie.

Pozdrawiam

Link do komentarza
Share on other sites

Chumanista, konkretnie na Alterę i w Verilogu mam niewiele, ale moim zdaniem to nie jest aż taka różnica, jaki układ czy język HDL wybierzesz - przynajmniej na początku. Jeśli chcesz szybko zrealizować projekt to na pewno ma znaczenie, ale do nauki podstaw chyba ważniejsze jest zrozumienie jak działają układy cyfrowe. A konkretny język - to jak z programowaniem w pascalu i C - pierwszy przypomina VHDL, drugi Veriloga. Ale jeśli nauczysz się programować w jednym z nich, drugi da się opanowac w tydzień. Co więcej nawet program może przetłumaczyć pascala na C (odwrotnie pewnie też, tylko po co).

Nadal uważam, że do nauki najlepiej sprawdzają się książki, więc mogę opisać co znalazłem i przeczytałem dotychczas:

• "Język VHDL. Projektowanie programowalnych układów logicznych" Skahill Kevin,
http://www.ksiegarnia.warszawa.pl/ksiazka/3497,jezyk_vhdl_projektowanie_programowalnych_ukladow_logicznychwyd_2?cookieinfo=true

Książka już mocno wiekowa, dobrze opisuje podstawy układów cyfrowych, wykorzystywałem ją jako pomoc przy nauce na ten właśnie przedmiot. Jednak o samym VHDL jest już nieco słabiej, a opisywane narzędzia to prehistoria. Nie polecam, chyba że ktoś ma pod ręką i ma dużo czasu. Ewentualnie do doczytania o tablicach Karnaugh przed kolokwium.

• "Projektowanie układów cyfrowych z wykorzystaniem języka VHDL" Mark Zwoliński

https://www.wkl.com.pl/projektowanie-ukladow-cyfrowych-z-wykorzystaniem-j,1,1,180?

To moim zdaniem najlepsza pozycja na polskim rynku odnośnie układów cyfrowych. Jest w niej trochę teorii sporo przykładów, ale przede wszystkim widać że autor wie o czym pisze i chce się tą wiedzą podzielić bez zbędnego gwiazdorzenia. Książka jest prawdziwą skarbnicą wiedzy - czytałem już trzy razy, ale pewnie i kolejny raz nie sprawi że wszystko zrozumiem 🙂 Przykład z CPU jest właśnie z tej książki.

• "Wprowadzenie do języka Verilog" Zbigniew Hajduk

http://www.wydawnictwo.btc.pl/index.php?ukey=product&productID=102935

Jest to jedyna książka jaką znam dotycząca Verilog-a (po polsku oczywiście). Sama książka raczej sucho opisuje język, brakuje tej magii z pozycji powyżej. Są za to opisane bardzo ciekawe przykłady. Znajdziemy w niej aż dwa rdzenie CPU, w tym jeden zgodny z PIC.

Jednak mam pewne obiekcje co do poprawności niektórych przykładów - mogę się mylić, ale na naszym forum dostałem po uszach od Marka za używanie dzielnika zegara. Taki przykład jest właśnie w tej książce. Więc lepiej uważać analizując przykłady - chociaż może warto byłoby je omówić na naszym forum?

• "Układy FPGA w przykładach" Piotr Zbysiński Majewski Jacek

https://helion.pl/ksiazki/uklady-fpga-w-przykladach-piotr-zbysinski-majewski-jacek,a_013s.htm#format/d

Ta książka to zbiór przykładów (ćwiczeń?) które można wykonać za pomocą symulatora oraz zestawu produkcji Kamami. Okazuje się jednak, że użyty układ Spartan3 XS3C200 to nieco większa wersja układu z Elbertv2 (XS3C50). Więc po drobnych zmianach można te przykłady wykonać na płytce z naszego kursu. Więc jeśli ktoś chce rozszerzyć kurs Forbota, książka jest wręcz idealna. Na plus można zaliczyć przykłady użycia bloków specyficznych dla Spartan3 - np. PLL, czy pamięć RAM

Znalazłem jeszcze kilka książek dostępnych po polsku, ale raczej nie wartych wzmianki - głównie opisy dla bardzo początkujących, niestety na już nieaktualnych narzędziach.

Jeśli macie jakieś materiały o FPGA warte polecenia, piszcie proszę (niekoniecznie książki i niekoniecznie po polsku).

[ Dodano: 21-12-2017, 10:27 ]

A i jeszcze odnośnie FPGA na nieco mocniejszych układach - jest bardzo ciekawy ebook z przykładami dla układów Zynq: http://www.zynqbook.com/

Wymaga zarejestrowania, ale jest za darmo. Książkę warto przeczytać nawet jeśli się nie jest zainteresowanych tymi układami - to bardzo dobry wykład z niskopoziomowej architektury komputerów.

  • Lubię! 1
Link do komentarza
Share on other sites

Elvis,

dzięki za bogaty opis literatury. Od siebie dodałbym jeszcze jedną pozycję:

"Język VHDL w praktyce" nieżyjącego już, a pochodzącego z WAT profesora Józefa Kalisza.

Do nauki składni VHDL'a pozycja bardzo dobra (zawiera też sporo dobrze dobranych przykładów).

Założyłem projekt z podanych przez Ciebie źródeł w "ISE Webpack 14.7" i wszystko fajnie się zsyntetyzowało (całość zajmuje około 342 LUT). Widzę, że ALU ma dwie operacje arytmetyczne: dodawanie i odejmowanie. Czy mógłbyś opisać jak "ładujesz" program do tego CPU? Jestem w pracy i mam tylko śro0dowisko "ISE" bez płytki Elbert, ale jak będę w domu z przyjemnością poeksperymentuję z tym projektem. Mógłbyś napisać kilka słów o asemblerze dla tego CPU i jak się go programuje?

Projekt bardzo fajny, takiego czegoś brakowało.

Pozdrawiam

Link do komentarza
Share on other sites

W sumie to wszystko jest w książce którą podałem - bardzo polecam przeczytać 🙂

Program jest "zaszyty" na stałe w module RAM:

	constant prog : mem_array := (
			0 => op2slv(load) & std_logic_vector(to_unsigned(5, word_w-op_w)),
			1 => op2slv(add) & std_logic_vector(to_unsigned(6, word_w-op_w)),
			2 => op2slv(store) & std_logic_vector(to_unsigned(5, word_w-op_w)),
			3 => op2slv(output) & std_logic_vector(to_unsigned(0, word_w-op_w)),
			4 => op2slv(bne) & std_logic_vector(to_unsigned(7, word_w-op_w)),
			5 => std_logic_vector(to_unsigned(0, word_w)),
			6 => std_logic_vector(to_unsigned(1, word_w)),
			others => (others => '0'));	

(właśnie widzę, że zamiast bne powinno być jmp... Jak pisałem to bardzo wstępna wersja 🙂

Definicja instrukcji asemblera jest w pliku cpu_defs:

	type opcode is (load, store, add, sub, bne, output, jmp);

Ostatnie dwie instrukcje to mój dodatek, pozostałe są z książki. Output wystawia zawartość akumulatora na diody, jmp to skok bezwarunkowy.

Instrukcje są zapisywane w bajtach, 3 górne bity to kod instrukcji, pozostałe 5 to parametr (do adresowania 32 bajtów pamięci).

W sumie fajnie byłoby zastąpić moduł RAM pamięcią dostępną w Spartanie, to powinno zwolnić ogromną ilość zasobów. Można też byłoby zwiększyć długość słowa (16 bitów?), wtedy dałoby się rozszerzyć listę instrukcji i zakres pamięci.

Takie mam plany, ale na razie jest to co wysłałem.

Mógłbyś podać jakieś namiary na książkę o której wspominasz? Chętnie przeczytam.

Link do komentarza
Share on other sites

Mógłbyś podać jakieś namiary na książkę o której wspominasz? Chętnie przeczytam.

Książka jest z 2002 roku - wiem, że nie powinienem tego pisać ale jest na Chomi....

Chciałem ją legalnie kupić, ale nigdzie nie mogłem jej znaleźć w oficjalnym wydaniu.

Elvis jakbyś nie mógł znaleźć tej pozycji to daj znać na priv - wyślę Ci mailem (pozycja jest naprawdę godna przeczytania jeśli chodzi o naukę samego VHDL'a).

Pozdrawiam

Link do komentarza
Share on other sites

Druga sprawa to pamięć RAM. Jest zaimplementowana w vhdl-u i zwykłe 32B marnują ogromną ilość zasobów. Więc wypadałoby użyć pamięci dostarczanej przez Spartan-a. Wtedy powinno zostać sporo komórek wolnych i można byłoby pamięć zwiększyć.

Ale to tylko pierwsza próba 🙂

Hej Elvis, problem emulacji pamięci RAM jest dla mnie też interesujący (w moim projekcie też mam emulację RAM jako tablicy w VHDL'u - wiem, że to mocno nieoptymalne). Mam zamiar przyjrzeć się problemowi podczas przerwy świątecznej, jeśli będę miał jakieś rezultaty to opiszę je na forum.

Dzięki za piwo i Wesołych Świat 😃

Link do komentarza
Share on other sites

Z tego co widziałem Spartan3 ma trochę pamięci zupełnie niezależnie od komórek LUT: https://www.xilinx.com/support/documentation/application_notes/xapp463.pdf

Dzięki temu można byłoby zaimplementować RAM nie zużywając (cennych) zasobów. W książce "Układy FPGA w przykładach" jest krok-po-kroku omówiony przykład użycia takiej pamięci. Ale przyznam się że nie miałem czasu tego przetestować 🙁

W dokumentacji jest mowa o 72Kbitach pamięci - niby śmiesznie mało, ale prawie 9KB to o ile więcej niż 32B implementowane jako tablica 😃

Pozdrowienia i również Wesołych Świąt 🙂

Link do komentarza
Share on other sites

Z tego co widziałem Spartan3 ma trochę pamięci zupełnie niezależnie od komórek LUT: https://www.xilinx.com/support/documentation/application_notes/xapp463.pdf

Dzięki temu można byłoby zaimplementować RAM nie zużywając (cennych) zasobów. W książce "Układy FPGA w przykładach" jest krok-po-kroku omówiony przykład użycia takiej pamięci. Ale przyznam się że nie miałem czasu tego przetestować 🙁

W dokumentacji jest mowa o 72Kbitach pamięci - niby śmiesznie mało, ale prawie 9KB to o ile więcej niż 32B implementowane jako tablica 😃

Pozdrowienia i również Wesołych Świąt 🙂

Właśnie tej pamieci RAM chciałbym użyć 😉

Dzięki za życzenia 😅

Link do komentarza
Share on other sites

Ja mam do tej pamięci plany względem sterownika VGA - niby trochę mało, ale może dałoby się uzyskać obraz jak na starych 8-bitowcach 🙂 Ewentualnie wyświetlacz tekstu dla Arduino...

Link do komentarza
Share on other sites

Ja mam do tej pamięci plany względem sterownika VGA - niby trochę mało, ale może dałoby się uzyskać obraz jak na starych 8-bitowcach 🙂 Ewentualnie wyświetlacz tekstu dla Arduino...

Kolega o którym wspominałem Jakub Tyburski zrobił klon gry z "ZX Spectrum" na FPGA "Cyclone II" myślę, że jakiś prosty frame-buffer jest osiągalny przy tej ilości pamięci RAM 🤣

Odnośnie literatury to polecam jeszcze jedną pozycję:

PONG P. CHU

"FPGA prototyping by Verilog examples - Xilinx Spartan-3 Version"

książka ma 521 stron i opisuje bardzo dużo zagadnień (mnóstwo przykładów) zarówno podstawowych jak i zaawansowanych.

Wystarczy wpisać w google tytuł i z pewnością ja znajdziecie.

Pozdrawiam

Link do komentarza
Share on other sites

Ja mam do tej pamięci plany względem sterownika VGA - niby trochę mało, ale może dałoby się uzyskać obraz jak na starych 8-bitowcach 🙂 Ewentualnie wyświetlacz tekstu dla Arduino...

Cześć Elvis,

temat, który podsunąłeś jest bardzo interesujący "Czy korzystając z wewnętrznej pamięci RAM układu Spartan 3A udałoby się stworzyć frame-buffer do wyświetlania informacji na ekranie VGA" ? Chciałbym się przyjrzeć tematowi, ale najpierw muszę o tym poczytać (linki, które podałeś w swoich postach odnośnie obsługi VGA w Elber'cie są bardzi interesujące).

Mam jeszcze jedno pytanie: próbowałeś może implementacji 8-bitowego CPU "PicoBlaze" - właśnie wersji dla Spartan 3?

Pozdrawiam

Link do komentarza
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.