Akademia Górniczo Hutnicza im. Stanisława Staszica w Krakowie Wydział IEiT Katedra Elektroniki SYSTEMY DEDYKOWANE W UKŁADACH PROGRAMOWALNYCH Ćwiczenie 2 Współpraca Zynq Processing System z peryferiami Zespół Rekonfigurowalnych Systemów Obliczeniowych Sebastian Koryciak & Paweł Russek
http://www..pl/gegula 1. Tworzenie projektu w PlanAhead 1. Proszę uruchomić program PlanAhead: Start -> Wszystkie programy -> Xilinx Design Tools -> ISE Design Suite 14.6 -> PlanAhead -> PlanAhead 2. Proszę utworzyć nowy projekt o następujących parametrach: Project name: project_zynq_2 (pamiętamy o ścieżce dostępu bez spacji) Project type: RTL Project Target Language: VHDL Target device: Boards / Zynq-700 / ZedBoard Zynq Evaluation and Development Kit 2
3. Proszę dodać nowe źródło. 4. W nowo otwartym oknie proszę zaznaczyć opcję "Add or Create Embedded Sources", a następnie "Create Sub-Design". Nowemu systemowi nadajemy nazwę "zynq_module". Następnie otwierającemu się programowi EDK zezwalamy na dodanie Processing System7 5. Importujemy odpowiednią konfigurację dla naszego procesora. Wybieramy opcję "ZedBoard Development Board Template". Zgadzamy się na uaktualnienie pliku MHS. 6. Zamykamy XPS. W ten sposób uzyskaliśmy gotowy do dalszej pracy system PS. 3
2. Dodawanie do projektu logiki programowalnej 1. Dwukrotnie kliknij na zynq_module.xmp w celu uruchomienia programu XPS i rozpoczęcia jego modyfikacji. 2. Wybierz zakładkę Bus Interfaces. 3. W oknie IP Catalog rozwiń kategorię General Purpose IO, a następnie przenieś moduł AXI General Purpose IO do okna Bus Interfaces. 4. Po zatwierdzeniu dodania modułu, w oknie XPS Core Config, rozwiń zakładkę Channel 1. Zwróć uwagę na szerokość kanału danych. Ponadto uruchom i zaznajom się z dokumentacją PDF dla tego modułu. 5. Po podłączeniu modułu do systemu będzie on widoczny w zakładce Bus Interfaces. 6. Wybierz zakładkę Ports i rozwiń wszystkie dostępne porty. Wybierając podłączony moduł axi_gpio_0 dokonaj następujących modyfikacji: External Ports::axi_gpio_0_GPIO_IO_pin zmień na No Connection (prawym przyciskiem myszy) W wierszu GPIO_IO_O zaznacz Make External (prawym przyciskiem myszy) Następnie rozwiń kategorię External Ports i zmień nazwę GPIO_IO_O na LED_DutyCycle 4
7. Wykonaj dodatkową modyfikację pod kategorią processing_system7_0: W wierszu FCLK_CLK0 zaznacz Make External (prawym przyciskiem myszy) W ten sposób do logiki programowalnej wyprowadziliśmy zegar, który teraz należy skonfigurować klikając na zielony blok Clock Generation pod zakładką Zynq. W otwartym oknie rozwiń wiersz PL Fabric Clocks i zmień FCLK_CLK0 i FCLK_CLK1 na 50MHz. Kliknij na Validate Clocks, a następnie OK. 8. Wybierz zakładkę Addresses i zapisz Base Address dla modułu axi_gpio_0. 9. Zamknij program XPS i wróć do PlanAhead. 10. Kliknij prawym przyciskiem myszy na zynq_module.xmp, a następnie wybierz opcję Create Top HDL. Pamiętaj, żeby czynność tą powtórzyć za każdym razem po modyfikacji portów wyjściowych z naszego systemu w programie XPS. 11. Otwórz nowo stworzony plik VHDL. Zwróć uwagę czy zawiera on dodane przez nas porty zewnętrzne (LED_DutyCycle i FCLK_CLK0). 12. Dokonaj następujących modyfikacji w pliku zynq_module_stub.vhd: W entity zakomentuj porty zewnętrzne, ponieważ będziemy ich używać do kontroli naszej logiki programowalnej, a dodaj port 8 bitowy LEDS. 5
Dodaj w odpowiednich miejscach inicjalizację i mapowanie nowego komponentu - "PWM_Controller" Dodaj do architektury sygnały: signal signal_led_dutycycle : std_logic_vector(31 downto 0); signal signal_processing_system7_0_fclk_clk0_pin : std_logic; 13. Do projektu dodaj nowy plik źródłowy (Add or Create Design Sources), następnie wybierz Create File, a nowy plik VHDL nazwij PWM_Controller. W trakcie jego powstawania dodaj porty adekwatne do zadeklarowanych w pliku głównym, a zawartość architektury nadpisz w następujący sposób: 6
14. Do projektu dodaj nowy plik źródłowy (Add or Create Constraints), następnie wybierz Create File i stwórz plik o nazwie system. Jego zawartość zmodyfikuj w następujący sposób: 15. Po zapisaniu wszystkich modyfikacji proszę uruchomić opcję Generate Bitestream. Po zakończeniu etapów syntezy i implementacji można obejrzeć rezultat rozmieszczenia logiki. 16. Proszę kliknąć File -> Export -> Export Hardware for SDK... i zaznaczając opcję Launch SDK kliknąć OK. 7
3. Tworzenie oprogramowania do komunikacji z PL 1. W SDK postępuj zgodnie z drogą tworzenia pustego projektu, czyli stwórz standalone_bsp_0, a do niego dołącz projekt napisany w C (Empty Application). 2. W zakładce system.mss odnajdź sekcję driverów, a następnie zapoznaj się z dokumentacją dotyczącą axi_gpio_0 (otwórz również Examples) 3. Po analizie plików nagłówkowych, dodaj odpowiednie do swojego pliku main.c 4. Zmodyfikuj zawartość głównego pliku dodając następujące linie: 5. Funkcję main określ w następujący sposób: 8
6. Zaprogramuj część PL, a następnie po zbudowaniu projektu wgraj go przez JTAG do procesora 7. Jeżeli wszystko działa poprawnie, zastąp wbudowane funkcje sterowników podstawowymi (xil_...) 4. Zadania do wykonania 1. Zmodyfikuj IP Core axi_gpio_0 włączając przerwania oraz dodając 2 kanał o szerokości 2 bitów będących tylko wejściami 2. Zmodyfikuj nowo stworzone porty (GPIO2_IO_I) na External (Pushbuttons) 9
3. Naciskając na wiersz IP2INTC_Irpt, w nowym oknie podłącz przerwanie 4. W programie PlanAhead stwórz moduł vhdl o nazwie debouncer, wpisz odpowiednie porty i załącz podaną poniżej architekturę, a następnie podłącz go do pliku TOP projektu 5. Do pliku system.ucf dodaj dowolnie wybrane 2 przyciski NET InputButtons[4] LOC = P16 IOSTANDARD=LVCMOS18; # "BTNC" NET InputButtons[3] LOC = R16 IOSTANDARD=LVCMOS18; # "BTND" NET InputButtons[2] LOC = N15 IOSTANDARD=LVCMOS18; # "BTNL" NET InputButtons[1] LOC = R18 IOSTANDARD=LVCMOS18; # "BTNR" NET InputButtons[0] LOC = T18 IOSTANDARD=LVCMOS18; # "BTNU" 6. Zmodyfikuj aplikację w SDK, tak aby uwzględniała przerwania od przycisków. 10