Tutorial – projektowanie systemu dwuprocesorowego FPGA
Transkrypt
Tutorial – projektowanie systemu dwuprocesorowego FPGA
Tutorial – projektowanie systemu dwuprocesorowego FPGA Celem niniejszego tutoriala jest zapoznanie się z zagadnieniami związanymi z projektowaniem systemów wieloprocesorowych w układach FPGA. Tutorial jest zgodny z oprogramowaniem EDK w wersji 13.2 i dotyczy projektu dwuprocesorowego systemu FPGA realizującego obsługę kodeka audio AC-97. Implementację projektu należy wykonać na platformie ewaluacyjnej Digilent ATLYS. Przed rozpoczęciem pracy należy zapoznać się z opisem projektu, który zawiera opis architektury oraz sposobu działania systemu. Aby rozpocząć pracę należy otworzyć program Xilinx Platform Studio(XPS). 1. Po otwarciu programu należy wybrać opcję Base System Builder, jest to kreator ułatwiający projektowanie systemów procesorowych. 2. W pierwszym oknie kreatora ustawiamy ścieżkę, pod którą zostanie utworzony projekt(żadna z nazw folderów w ścieżce nie może zawierać spacji!), jako magistralę wybieramy AXI, a następnie ustawiamy ścieżkę do sterowników platformy rozwojowej ATLYS: set peripherial repository serach path: …..\Multicore_embedded\Atlys_AXI_BSB_Support\lib (Folder zawierający sterowniki jest dołączony do tutoriala) 3. W kolejnym oknie platforma sprzętowa została automatycznie wybrana na Digilent ATLYS, więc wybieramy Dual MicroBlaze Processor System i klikamy Next. 4. W tym kolejnym oknie należy wybrać parametry obu procesorów zawartych w systemie: a. Zegar systemu należy pozostawić w tej części bez zmian. b. Dla obu procesorów należy wybrać local memory size 16KB, a część dotyczącą pamięci podręcznej procesora pozostawić bez zmian. c. W ramce included peripherials powinny znajdować się jedynie peryferia MCB_DDR2 oraz RS232UART. 5. Aby wygenerować podstawę sprzętową systemu należy kliknąć Finish. Po chwili wygenerowany system zostanie przedstawiony w widoku System Assembly View. 6. Dzięki zastosowaniu dwóch procesorów w systemie jesteśmy w stanie zmniejszyć częstotliwość taktowania zegara procesorów tak, aby ograniczyć moc pobieraną przez system przy zachowaniu pełnej funkcjonalności. 7. Zmian związanych z taktowaniem zegarów dokonujemy w narzędziu Hardware>Launch Clock Wizard. Narzędzie to umożliwia zmianę taktowania zegarów wszystkich komponentów systemu. Zaznaczamy opcję Enable Full Dynamic Range. W przypadku naszego projektu chcemy użyć zegara 25MHz więc ustawiamy taką wartość we wszystkich procesorach, magistralach oraz peryferiach poza MCB_DDR2 gdzie wartości powinny wyglądać dokładnie tak jak na przedstawionym rysunku: Opracował: Damian Mroczek Strona 1 Po takim ustawieniu zegarów systemu należy kliknąć validate clocks, a następnie OK. 8. Kolejnym etapem będzie dodanie do projektu sprzętowego kontrolera kodeka AC-97. a. Aby tego dokonać należy skopiować dołączony do tutoriala folder ac97ctrl_v_1_00_a do folderu pcorces w katalogu projektu. b. Po skopiowaniu należy wybrać Project->Rescan User Repositories, aby program wykrył dodanie nowego IP Core’a do katalogu c. Teraz w zakładce IP Catalog po lewej stronie interfejsu w podkatalogu USER pojawił się nowy IP Core o nazwie ac97ctrl d. Należy wybrać ten IP Core prawym klawiszem myszy i wybrać Add IP, następnie dwa razy wybrać OK nie zmieniając domyślnych opcji. e. Po chwili w zakładce Bus Interfaces zostanie dodany nowy sprzęt, następnie należy sprawdzić w zakładce Adresses czy został mu przydzielony adres. f. Kolejnym etapem jest przejście do zakładki Ports w celu modyfikacji ustawień portów kontrolera – wszystkie niepodłączone porty należy uczynić portami wyjściowymi w przedstawiony sposób: Opracował: Damian Mroczek Strona 2 g. Kolejnym etapem jest przyporządkowanie zewnętrznych portów do konkretnych pinów układu FPGA, należy to zrobić modyfikując plik system.ucf znajdujący się w zakładce Project h. Dodanie nowego portu zewnętrznego odbywa się poprzez wstawienie następującej linii w tym pliku: NET ac97ctrl_0_sync_pin LOC = "U17" | IOSTANDARD = "LVCMOS33"; ( ta linia oznacza dla programu przyporządkowanie sygnału ac97ctrl_0_sync_pin do pinu U17) Korzystając z tego przykładu należy przyporządkować wszystkie 4 pozostałe sygnały związane z kontrolerem według następującego szablonu: ac97ctrl_0_sdi_pin -> T18 ac97ctrl_0_sdo_pin -> N16 ac97ctrl_0_bitclk_pin -> L13 ac97ctrl_0_reset_c_pin ->T17 9. Po wykonaniu tej czynności został zaprojektowny cały system dwuprocesorowy, który posłuży do uruchomienia aplikacji umożliwiającej obsługę kodeka audio AC-97 znajdującego się na płytce rozowjowej. Aby obejrzeć schemat blokowy systemu należy kliknąc Project->Generate Block Diagram Image. 10. Kolejnym krokiem jest przeprowadzenie syntezy oraz implementacji systemu, aby tego dokonać należy wybrać Hardware->Generate Bitstream 11. Jeżeli proces przebiegł bez błędów mamy zaprojektowaną platformę sprzętową, aby przejść do projektu oprogramowania należy kliknąć Export Design to SDK i wybrać opcję Export Only. Dalsza część projektu wykonywana jest w programie Software Development Kit: 12. W celu utworzenia aplikacji na zaprojektowaną platformę należy otworzyć program SDK pakietu Xilinx EDK. 13. Po otworzeniu aplikacji jako workspace wybieramy pusty folder na dysku, po otwarciu programu zamykamy okno powitalne. 14. W celu stworzenia projektu nowej aplikacji wybieramy File->New->Xilinx C Project, następnie zostaniemy zapytani czy chcemy wyspecyfikować platformę sprzętową na jakiej będzie pracował projekt, wybieramy Specify następnie wpisujemy nazwę projektu oraz podajemy ścieżkę do pliku BMM wyeksportowanego przez program XPS, plik znajduje się w lokalizacji projektu, w folderze SDK. Opracował: Damian Mroczek Strona 3 15. Po wykonaniu tej czynności program automatycznie wróci do tworzenia nowego projektu w języku C. W otwartym oknie zmieniamy nazwę projektu na recorder_mb1 i pozostawiamy Project Template: Hello World oraz Processor: microblaze_1 16. W kolejnym oknie zmieniamy nazwę projektu z hello_world_bsp_0 na recorder_bsp i klikamy Finish. 17. W analogiczny sposób tworzymy nowy projekt dla procesora microblaze_0 o nazwie user_system_0 18. W ten sposób wygenerowane zostały dwa puste projekty, które można modyfikować w celu zaprojektowania aplikacji, pierwszym krokiem jest zmiana nazwy pliku hello_world.c w każdym projekcie odpowiednio na recorder.c oraz user_system.c. 19. W kolejnym etapie należy zamienić kod zawarty w tych plikach na kod dołączony do tutoriala – nazwy plików odpowiadają sobie. 20. Po wklejeniu kodu do odpowiednich plików należy do każdego projektu dodać bibliotekę kodekac97.h. Biblioteka ta zawiera funkcje obsługujące kodek umieszczony na płytce rozwojowej. a. Aby to zrobić należy kliknąć prawym przyciskiem myszy na folder src, a następnie New->Header file. Jako nazwę należy wpisać kodekac97.h i kliknąć Finish. b. Następnie należy wkleić do tego pliku zawartość załączonej biblioteki o tej samej nazwie. c. Zadanie należy wykonać w obu podprojektach 21. Kolejnym etapem jest zadbanie o to, aby dane instrukcji oraz dane podręczne procesorów nie były umieszczone w jednym obszarze pamięci. Należy to zrobić poprzez modyfikację pliku linkera lscript.ld w obu podprojektach. Należy to wykonać otwierając i modyfikując pliki w sposób przedstawiony na rysunku: Wszystkie sekcje linkera należy przypisać do pamięci BRAM procesora. Opracował: Damian Mroczek Strona 4 Zadanie 1 W kodzie user_system.c celowo został pominięty kod odpowiadający za obsługę bloku mailbox. Należy uzupełnić kod we wskazanym na rysunku miejscu: Konfiguracja bloku mailbox przebiega identycznie jak bloku mutex. Wskazówki: -Należy użyć funkcji konfigurującej odpowiadającej blokowi mailbox: XMbox_LookupConfig(ID); -Jako ID należy użyć znalezionego w bibliotece xparameters.h ID odpowiadającego danemu procesorowi.(np. XPAR_MAILBOX_0_IF_5_DEVICE_ID) Zadanie 2 Procesory podczas pracy programu wysyłają sobie 32 bitowe wiadomości takie jak rozkaz rozpoczęcia nagrywania, komunikat o błędzie, oraz wskaźnik do nagrania. Realizacja wysyłania i odbierania tych wiadomości powinna zostać obsłużona przez funkcje XMbox_Write oraz XMbox_Read, pełen opis użycia tych funkcji znajduje się w dokumentacji bloku mailbox dostępnej w pliku system.mss w mailbox: documentation. Funkcje powinny zostać użyte w następujących miejscach zaznaczonych w kodzie: ///////wyslij polecenie nagrania/////////// //////wyslij polecenie zwolnienia pamieci/////// /////obsluga odebrania wskaznika nagrania/////// W ostatnim punkcie należy dwukrotnie użyć funkcji w zaznaczonych w kodzie miejscach Wskazówki: - jako BytesRecvdPtr użyj zmiennej bytesrcvd zadeklarowanej w programie -jeżeli występują problemy spróbuj rozpocząć Debugowanie programu, aby to zrobić należy kliknąć Program FPGA, a następnie wybrać prawym klawiszem myszy projekt user_system i kliknąć Debug->Launch on Hardware. Następnie krok po kroku obserwujemy działanie kodu. Opracował: Damian Mroczek Strona 5 Zadanie 3 Analogicznych modyfikacji dokonaj w zaznaczonych w kodzie miejscach w pliku recorder.c, aby umożliwić obustronną komunikację programów. 22. Po wykonaniu zadań 1,2 i 3 możliwe jest w sprawdzenie w pełni działającego programu , aby sprawdzić działanie należy skonfigurować program: 23. Należy podłączyć kabel usb->prog oraz drugi usb->UART, aby umożliwić komunikację z programem. Podłączamy również kablami źródło i odbiornik dźwięku, a następnie włączamy płytkę. 24. Programujemy układ FPGA poprzez wybranie Program FPGA, a następnie wykonujemy czynności: a. Uruchamiamy user_system poprzez zaznaczenie prawym klawiszem myszy i wybór Run->Launch on Hardware, a następnie to samo robimy z podprojektem recorder. b. Wybieramy Run->Run Configuratrions… c. Wybieramy recorder.elf i zmieniamy Device Initialization na Reset Processor Only, zatwierdzamy zmianę. d. W tym samym oknie dwukrotnie klikamy Launch group gdzie dodajemy pliki elf user_system oraz rekorder (uwaga user_system musi być pierwszy na liście, ponieważ przy inicjalizacji resetuje układ FPGA). e. Następnie klikamy Run w dolnym prawym rogu. f. W tym przypadku oba procesory są uruchamiane jednocześnie i program działa w pełni. Zadanie 4 Zadanie to należy wykonać za pomocą programu PowerAnalyzer znajdującego się w pakiecie Ise Design Tools. Wykonanie będzie polegało na wczytaniu projektu do programu i uruchomieniu analizy. W celu rozpoczęcia analizy należy użyć File->Open Design, następnie jako Design File należy użyć pliku system.ncd znajdującego się w katalogu projektu w folderze implementation. Dodatkowo należy wczytać opcjonalny plik physical constraint file, który znajduje się w tym samym miejscu. Następnie należy uruchomić analizę. Po wykonaniu analizy należy odnaleźć interesujące nas dane i uzupełnić tabelę: Opracował: Damian Mroczek Strona 6 Parametr Wykorzystanie bloków logicznych [%] System dwuprocesorowy System jednoprocesorowy 2xMicroBlaze 25MHz Microblaze 50MHz - - - - - - - - Całkowita moc pobierana przez system procesorowy [W] Temperatura pracy układu FPGA [oC] Całkowita moc pobierana przez układ FPGA ze źródła zasilania [W] Drugą analizę należy wykonać analogicznie na plikach załączonych w folderze one_core gdzie znajdują się pliki projektu jednoprocesorowego opartego na tym samy procesorze oraz peryferiach lecz z większą częstotliwością taktowania w celu osiągnięcia wydajności porównywalnej do naszego systemu. Wyniki obu analiz należy porównać w tabeli oraz wyciągnąć odpowiednie wnioski. Opracował: Damian Mroczek Strona 7