PROGRAMOWALNE UKŁADY CYFROWE

Podobne dokumenty
Projektowanie systemów za pomocą języków wysokiego poziomu ESL

All hands on deck!!!

Projektowanie systemów za pomocą języków wysokiego poziomu ESL

Projektowanie systemów za pomocą języków wysokiego poziomu ESL

Informatyka I : Tworzenie projektu

MentorGraphics ModelSim

Projektowanie układów VLSI-ASIC techniką od ogółu do szczegółu (top-down) przy użyciu pakietu CADENCE

Bezpieczeństwo informacji oparte o kryptografię kwantową

1. ISE WebPack i VHDL Xilinx ISE Design Suite 10.1 VHDL Tworzenie projektu Project Navigator Xilinx ISE Design Suite 10.1 File

1.Wstęp. 2.Generowanie systemu w EDK

Akceleracja symulacji HES-AHDL. 1. Rozpoczęcie pracy aplikacja VNC viewer

Warsztaty AVR. Instalacja i konfiguracja środowiska Eclipse dla mikrokontrolerów AVR. Dariusz Wika

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki

Gromadzenie danych. Przybliżony czas ćwiczenia. Wstęp. Przegląd ćwiczenia. Poniższe ćwiczenie ukończysz w czasie 15 minut.

Programowanie procesora Microblaze w środowisku SDK

Ćwiczenia z S Komunikacja S z miernikiem parametrów sieci PAC 3200 za pośrednictwem protokołu Modbus/TCP.

SYSTEMY DEDYKOWANE W UKŁADACH PROGRAMOWALNYCH

Programowanie niskopoziomowe

Projektowanie z użyciem procesora programowego Nios II

FAQ: /PL Data: 3/07/2013 Konfiguracja współpracy programów PC Access i Microsoft Excel ze sterownikiem S7-1200

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

Ćwiczenie Zmiana sposobu uruchamiania usług

Symulacja systemu z procesorem MicroBlaze w środowisku ActiveHDL

Ćwiczenia z S S jako Profinet-IO Controller. FAQ Marzec 2012

Cyfrowe Przetwarzanie Obrazów i Sygnałów

Krótka instrukcja instalacji Adobe Acrobat Reader

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Instrukcja obsługi programu Do-Exp

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Product Update Funkcjonalność ADR dla przemienników Częstotliwości PowerFlex 750 oraz 525 6

Utworzenie aplikacji mobilnej Po uruchomieniu Visual Studio pokazuje się ekran powitalny. Po lewej stronie odnośniki do otworzenia lub stworzenia

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

AKADEMIA GÓRNICZO-HUTNICZA IM. STANISŁAWA STASZICA W KRAKOWIE. QuIDE Quantum IDE PODRĘCZNIK UŻYTKOWNIKA

Projekt procesora NIOSII w strukturze programowalnego układu logicznego CYCLONEII EP2C35F672C6 podłączenie i obsługa wyświetlacza LCD.

Projektowanie z użyciem softprocesora picoblaze w układach programowalnych firmy Xilinx

Instalacja programu:

KONFIGURACJA NOWEGO PROJEKTU W CODE COMPOSER STUDIO

Edytor tekstu OpenOffice Writer Podstawy

Programowanie obiektowe

Wybieramy File->New->Project Wybieramy aplikację MFC->MFC Application jak na rysunku poniżej:

Pracownia internetowa w każdej szkole (edycja Jesień 2007)

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 8. Karol Tarnowski A-1 p.

Materiały dodatkowe. Simulink Real-Time

Wprowadzenie do środowiska Qt Creator

INSTRUKCJA DO OPROGRAMOWANIA KOMPUTEROWEGO

Wydział Elektryczny. Katedra Automatyki i Elektroniki. Instrukcja do ćwiczeń laboratoryjnych z przedmiotu: PROGRAMOWALNE STRUKTURY LOGICZNE

etrader Pekao Podręcznik użytkownika Strumieniowanie Excel

Instalacja aplikacji

Tworzenie nowego projektu w asemblerze dla mikroprocesora z rodziny 8051

Rys. 1. Główne okno programu QT Creator. Na rysunku 2 oznaczone zostały cztery przyciski, odpowiadają kolejno następującym funkcjom:

Wygląd okna aplikacji Project Navigator.

INSTALACJA LICENCJI SIECIOWEJ NET HASP Wersja 8.32

Zadanie 2. Tworzenie i zarządzanie niestandardową konsolą MMC

Wprowadzenie do biblioteki klas C++

Programowanie Systemów Czasu Rzeczywistego

Laboratorium Projektowania Systemów VLSI-ASIC Katedra Elektroniki Akademia Górniczo-Hutnicza

MODUŁ OFERTOWANIE INSTRUKCJA OBSŁUGI

Dokumentacja techniczna

SYSTEMY DEDYKOWANE W UKŁADACH PROGRAMOWALNYCH

Instalowanie certyfikatów celem obsługi pracy urządzenia SIMOCODE pro V PN z poziomu przeglądarki internetowej w systemie Android

Platforma szkoleniowa krok po kroku. Poradnik Kursanta

WPROWADZENIE DO INFORMATYKI

7. Podstawy zarządzania szablonami

Zaawansowane aplikacje internetowe - laboratorium

Testowanie I. Celem zajęć jest zapoznanie studentów z podstawami testowania ze szczególnym uwzględnieniem testowania jednostkowego.

Załącznik 1 instrukcje instalacji

Git, Bitbucket, IntelliJ IDEA

Projektowanie baz danych za pomocą narzędzi CASE

Damian Daszkiewicz Tworzenie strony-wizytówki dla firmy XYZ

Krótkie wprowadzenie do ModelSim i Quartus2

Aby w pełni przetestować układ o trzech wejściach IN_0, IN_1 i IN_2 chcemy wygenerować wszystkie możliwe kombinacje sygnałów wejściowych.

Podstawy programowania. Ćwiczenie. Pojęcia bazowe. Języki programowania. Środowisko programowania Visual Studio

7 Business Ship Control dla Symfonia Handel

FAQ: /PL Data: 14/06/2007 Konfiguracja współpracy programów PC Access i Microsoft Excel ze sterownikiem S7-200

Instrukcja instalacji i obsługi modemu ED77 pod systemem operacyjnym Windows 98 SE (wydanie drugie)

LabVIEW PLATFORMA EDUKACYJNA Lekcja 5 LabVIEW i Arduino konfiguracja środowiska i pierwszy program

Projekt ZSWS. Instrukcja uŝytkowania narzędzia SAP Business Explorer Analyzer. 1 Uruchamianie programu i raportu. Tytuł: Strona: 1 z 31

Materiały dodatkowe. Raspberry Pi

Instrukcja instalacji oprogramowania. CardioScan 10, 11 i 12. w wersji 54a i 76a

Instrukcja pobrania i instalacji wersji testowej Invest for Excel

PORADNIK KORZYSTANIA Z SERWERA FTP ftp.architekturaibiznes.com.pl

Bramki logiczne Instrukcja do ćwiczeń laboratoryjnych

Podstawy WINDOWS 9x, 2000, XP

imei CYFROWE PRZETWARZANIE SYGNAŁÓW Laboratorium Temat: Tworzenie aplikacji w środowisku LabWindows/CVI Instytut Metrologii, Elektroniki i Informatyki

8. Generowanie raportów

Instrukcja instalacji i konfiguracji bazy danych SQL SERVER 2008 EXPRESS R2. Instrukcja tworzenia bazy danych dla programu AUTOSAT 3. wersja 0.0.

Instrukcjaaktualizacji

FAQ: /PL Data: 2/07/2013 Konfiguracja współpracy programów PC Access i Microsoft Excel ze sterownikiem LOGO!

Instrukcja użytkownika Platforma transakcyjna mforex Trader dla systemu Linux

Javadoc. Piotr Dąbrowiecki Sławomir Pawlewicz Alan Pilawa Joanna Sobczyk Alina Strachocka

Operacje na gotowych projektach.

Makropolecenia w PowerPoint Spis treści

Laboratorium A: Podstawy administrowania serwerem

Instalacja sieciowa Autodesk AutoCAD oraz wertykali

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE

Politechnika Łódzka. Instytut Systemów Inżynierii Elektrycznej

Załącznik 1 instrukcje instalacji

Transkrypt:

Akademia Górniczo Hutnicza im. Stanisława Staszica w Krakowie Wydział EAIiE Katedra Elektroniki PROGRAMOWALNE UKŁADY CYFROWE Ćwiczenie Wprowadzenie do języka Impulse C Zespół Rekonfigurowalnych Systemów Obliczeniowych Grzegorz Gancarczyk http://www.fpga.agh.edu.pl/gegula 06.11.011

1. Wstęp Celem niniejszego ćwiczenia jest przyjemne i przystępne zapoznanie Studentów ze sposobami projektowania systemów cyfrowych przy użyciu języków i syntezy wysokiego poziomu (High Level Languages, High Level Synthesis). Do tego celu posłuży język Impulse C autorstwa firmy Impulse Accelerated Technologies. Ponadto Studenci zostaną zapoznani z dedykowanym środowiskiem programistycznym firmy Impulse Accelerated Technologies narzędziem CoDeveloper i alternatywną metodą projektowania, wykorzystującą zintegrowane środowisko programistyczne Microsoft Visual Studio 008. Wymagania sprzętowe: komputer klasy PC, procesor o architekturze zgodnej z x86, procesor oferujący sprzętowy multithreading. Wymagania programowe: 3 bitowy system operacyjny Windows XP lub wyższy, narzędzie CoDeveloper, *środowisko Microsoft Visual Studio 008, środowisko ISE Design Suite. * opcjonalnie. Założenia projektowe Projekt realizowany w trakcie zajęć laboratoryjnych polegać będzie na stworzeniu generatora liczb pseudolosowym (PseudoRandom Number Generator). Ujmując jeszcze ściślej, projektowany generator będzie generatorem pseudolosowych permutacji. Układ generujący tworzyć będzie 16 bitowy rejestr przesuwny ze sprzężeniem zwrotnym (Linear Feedback Shift Register). Sprzężenie zwrotne należy zrealizować przy użyciu funkcji/bramki ex-or oraz wielomianu generującego Galoisa. Poprawnie zaprojektowany generator charakteryzuje się okresem równym 16 1. Ze względu na słabe właściwości statystyczne danych wynikowych, nie jest on jednak wykorzystywany w zaawansowanych systemach elektronicznych, jak np. systemy kryptograficzne. Powszechnie wykorzystuje się go jako scrambler, element składowy systemu kontroli sum kontrolnych CRC, czy też generator wymuszenia wykorzystywanych na potrzeby pomiaru odpowiedzi impulsowej układów liniowych.

3. Szkielet projektu w narzędziu CoDeveloper Doświadczenie uczy, że najskuteczniejszy model projektowania systemów cyfrowych w języku Impulse C bazuje na rozwiązaniu hybrydowym. Wykorzystuje ono równocześnie narzędzia CoDeveloper oraz Visual Studio w trakcie całej ścieżki projektowej. Programu CoDeveloper najlepiej użyć w początkowej fazie prac do stworzenia szkieletu całego projektu, gdyż oferuje on gotowe wzorce projektowe (template y), których brak we wtyczce (pluginie) do aplikacji Visual Studio. CoDeveloper okazuje się również bardzo przydatny do szybkiej kompilacji (software owej) projektu, generacji kodu wynikowego HDL oraz użycia dodatkowych narzędzi, jak np. Stage Master Explorer, których brak w Visual Studio. Wszystko to, jak również zalety Visual Studio, zostanie dokładniej omówione w dalszej części niniejszego dokumentu. 3.1. Tworzenie nowego projektu Na pulpicie znajduje się ikona, przy pomocy której nie należy uruchamiać programu Co- Developer. Program proszę uruchomić przy pomocy przygotowanego specjalnie do tego celu skryptu o nazwie CoDeveloper_start. Po chwili pojawić powinno się okno dialogowe informujące o wersji programu oraz statusie licencji. W przypadku, gdy program nie odnajdzie aktualnej licencji (zdalnej lub lokalnej) zgłoszony zostanie błąd. Jeśli sytuacja taka ma miejsce, należy zwrócić się o pomoc do osoby prowadzącej zajęcia. W nowo otwartym oknie startowym programu należy kliknąć na przycisk Create a New Project. 3

3.. Szablon projektu Pojawi się okno o nazwie Create New Project. Należy zaznaczyć w nim kolejno: Project types General Applications Templates, Templates One input stream, one output stream, 1 a następnie: nazwać stosownie projekt (np. generator) Project name: wybrać lokalizację projektu na dysku (np. C:\MyCoDesign) Location: zaznaczyć opcję Create a folder for the project kliknąć przycisk OK. 1 3 4 4

3.3. Czarodziej W oknie czarodzieja kliknąć przycisk Dalej. W nowym oknie kolejno: nazwać proces (np. generator) Process name: nazwać strumień wejściowy (np. input) Input stream name: nazwać strumień wyjściowy (np. random) Output stream name: określić szerokość bitową strumienia Stream width 16 określić głębokość strumienia Stream depth 1 kliknąć przycisk Dalej. 1 3 4 5 6 5

W ostatnim oknie dialogowym czarodzieja kliknąć przycisk Zakończ. 4. Projekt w Visual Studio W przypadku jakichkolwiek trudności z realizacją projektu w aplikacji Visual Studio należy poprosić o pomoc osobę prowadzącą zajęcia. Jeśli błędów mimo to nie uda się rozwiązać, należy zamiast punktu 4 zrealizować punkt A, umieszczony na końcu niniejsze instrukcji. 6

4.1. Tworzenie nowego projektu Z menu start lub przy pomocy ikony znajdującej się na pulpicie uruchomić program Visual Studio 008. Utworzyć nowy projekt wybierając kolejno File New Project 7

Programowalne Układy Cyfrowe Ćwiczenie nr W nowo otwartym oknie New Project: wybrać typ projektu Project types: Visual C++ wybrać wzorzec Templates: Impulse C Project nazwać projekt (np. generator) Name: zaznaczyć Create directory for solution kliknąć przycisk OK. 1 3 4 5 4.. Import plików Utworzony przez chwilą w Visual Studio projekt jest pusty. Aby móc przystąpić do pracy, należy wpierw zaimportować utworzony wcześniej pod CoDeveloperem szkielet projektu. W tym celu, w pierwszej kolejności należy skopiować trzy, utworzone przez CoDevelopera pliki (generator.h, generator_sw.c, generator_hw.c) do katalogu roboczego Visual Studio ( Visual Studio 008\Projects\generator\generator). 8

Następnie pliki należy dołączyć do aktywnego projektu. Z zakładki bocznej Solution Explorer wybrać kolejno generator Add Existing Item. 1 3 W oknie importu zaznaczyć odpowiednie pliki, a następnie kliknąć przycisk Add. 9

Aby sprawdzić, czy całość projektu utworzono prawidłowo, należy przeprowadzić próbną kompilację. W tym celu wcisnąć na klawiaturze kombinację klawiszy Alt + Shift + B. W oknie Output pojawi się stosowny komunikat. Jeśli projekt udało się zbudować poprawnie, należy przejść do punktu 5 instrukcji. W przeciwnym razie należy spróbować wyeliminować istniejące błędy samemu. Jeśli okaże się to za trudne, proszę zwrócić się o pomoc do osoby prowadzącej zajęcia. 5. Adaptacja szkieletu do projektu Adaptacja utworzonego wcześniej szkieletu będzie polegać m.in. na eliminacji nadmiarowego kodu, nielogicznych z punktu widzenia projektu strumienia, bloku wejściowego oraz edycji niektórych wartości. 5.1. Plik nagłówka generator.h Po otwarciu pliku nagłówkowego ukazać powinien się następujący kod. //////////////////////////////////////////////////////////////////////////// /// // // Generated by Impulse CoDeveloper // Impulse C is Copyright(c) 003-006 Impulse Accelerated Technologies, Inc. // #define STREAMDEPTH 1 /* buffer size for FIFO in hardware */ #define STREAMWIDTH 16 /* buffer width for FIFO in hardware */ #define INPUT_FILE "filter_in.dat" #define OUTPUT_FILE "filter_out.dat" Usunąć należy z niego wskazaną strzałką linijkę, a następnie zapisać plik (kombinacja klawiszy ctrl + s). Deklarację pliku wejściowego należy usunąć z oczywistego powodu generator nie wymaga żadnych danych wejściowych, wręcz przeciwnie, sam generuje dane. W pliku nagłówkowym znajdują się następujące deklaracje: głębokość strumienia wejściowego i wyjściowego, szerokość strumienia wejściowego i wyjściowego, 10

nazwa pliku wejściowego, z którego wczytywane są dane do strumienia wejściowego, nazwa pliku wyjściowego, do którego zapisywane są dane ze strumienia wyjściowego. 5.. Plik sprzętowy generator_hw.c Po otwarciu pliku generator_hw.c należy odnaleźć i usunąć następujące fragmenty kodu, wskazane przy pomocy strzałek. // Software process declarations (see generator_sw.c) extern void Producer(co_stream input); extern void Consumer(co_stream random); 1 ( ) // // This is the hardware process. // void generator(co_stream input, co_stream random) 1. Blok Producera nie będzie wykorzystywany, gdyż generator liczb pseudolosowych nie przyjmuje żadnych danych wejściowych. Wytwarza on natomiast dane wyjściowe, pobierane przez blok Consumera.. W deklaracji procesu sprzętowego (tzw. Filter) należy usunąć strumień wejściowy, pozostawiając jednocześnie strumień wyjściowy. IF_SIM(int samplesread; int sampleswritten;) ( ) do { // Hardware processes run forever IF_SIM(samplesread=0; sampleswritten=0;) 3 4 co_stream_open(input, O_RDONLY, INT_TYPE(STREAMWIDTH)); co_stream_open(random, O_WRONLY, INT_TYPE(STREAMWIDTH)); 5 3. Brak danych wejściowych oznacza, że zbędny jest licznik danych wejściowych. 4. Inicjalizacja licznika danych wejściowych również jest zbyteczna. 5. W całości należy usunąć funkcję otwierającą strumień wejściowy, gdyż nie będzie on wykorzystywany. 11

while ( co_stream_read(input, &nsample, sizeof(co_int16)) == co_err_none ){ #pragma CO PIPELINE IF_SIM(samplesread++;) 7 ( ) co_stream_close(input); co_stream_close(random); IF_SIM(cosim_logwindow_fwrite(log, 8 6 "Closing filter process, samples read: %d, samples written: %d\n", samplesread, sampleswritten);) 9 6. Warunek pętli tymczasowo należy zmienić na 1. Pozwoli to skompilować projekt na próbę. 7. Należy usunąć linijkę kodu opisującą inkrementację licznika danych wejściowych. 8. Usunąć funkcję zamykającą nieistniejący strumień danych wejściowych. 9. Usunąć partie kodu odpowiedzialne za odczyt stanu licznika danych wejściowych. Proszę zwrócić uwagę na dyrektywę kompilatora (#pragma) CO PIPELINE. Informuje ona kompilator, by utworzyć potok obejmujący wszystkie operacje znajdujące się wewnątrz pętli while. Potok taki znajdzie odzwierciedlenie w wygenerowanym kodzie HDL. Pragma CO PIPELINE jest jedną z podstawowych dyrektyw kompilatora języka Impulse C. void config_generator(void *arg) { co_stream input; co_stream random; 10 co_process generator_process; co_process producer_process; co_process consumer_process; 11 10. W funkcji konfigurującej moduł generatora należy usunąć deklarację strumienia wejściowego. 11. Należy również usunąć moduł/proces producera. 1

input = co_stream_create("input", INT_TYPE(STREAMWIDTH), STREAMDEPTH); random = co_stream_create("random", INT_TYPE(STREAMWIDTH), STREAMDEPTH); producer_process = co_process_create("producer", (co_function)producer, 1, 13 input); generator_process = co_process_create("generator", (co_function)generator,, input, 15 14 random); 1 1. Usunąć w całości funkcję tworzącą i deklarującą właściwości strumienia wejściowego. 13. Usunąć w całości funkcję tworzącą i deklarującą właściwości procesu Producera. 14. Zmienić na 1 ilość strumieni dołączonych do procesu generator. 15. Usunąć strumień wejściowy dla procesu generator. Zapisać plik. 5.3. Plik programowy generator_sw.c Po otwarciu pliku generator_sw.c należy znaleźć i usunąć w całości funkcję Producer. void Producer(co_stream input) { ( ) } Zapisać plik. Dokonać próbnej kompilacji projektu w celu sprawdzenia, czy wszystkie zmiany zostały wykonane poprawnie i nie zaburzają struktury szkieletu projektu. W oknie Output pojawi się informacja dotycząca wyniku kompilacji. Jeśli wszystkie zmiany zostały wprowadzone poprawnie, projekt zostanie zbudowany i pojawi się komunikat succeeded. W tym momencie należy przejść do następnej części ćwiczenia. W przypadku pojawienia się informacja o niepowodzeniu kompilacji (failed) pojawią się również komunikaty wskazujące jakie są jego przyczyny. Bazując na nich należy spróbować samodzielnie wyeliminować przyczyny błędów. Jeśli okaże się to zbyt trudne, proszę zwrócić się o pomoc do osoby prowadzącej zajęcia. 13

6. Sprzętowy generator liczb pseudolosowych W pliku generator_hw.c należy odnaleźć następujący fragment kodu // Sample is now in variable nsample. // Add your processing code here. co_stream_write(random, &nsample, sizeof(co_int16)); a następnie podmienić go na lfsr = (lfsr >> 1) ^ (-(lfsr & 1u) & 0xB400u); ++period; co_stream_write(random, &lfsr, sizeof(co_int16)); W tym miejscu proszę zastanowić się nad zasadą działania generatora. Teoria dotycząca LFSR znajduje się pod adresem http://www.newwaveinstruments.com/resources/articles/m_sequence_linea r_feedback_shift_register_lfsr.htm Uwaga! Czy rejestr LFS, którego opis wykonano w języki Impulse C jest rejestrem Fibonacci ego, czy Galoisa? W tabeli sprzężeń zwrotnych (link na samym dole strony) proszę wskazać zrealizowane w Impulse C sprzężenie. Zespół, który jako pierwszy udzieli poprawnych odpowiedzi na powyższe, zostanie nagrodzony za aktywność. Pojawienie się nowych zmiennych (lfsr oraz period) wymaga ich zadeklarowania. Po odnalezieniu void generator(co_stream random) { co_int16 nsample; należy zmienić kod na void generator(co_stream random) { uint16 lfsr; uint16 period; Zmienna nsample pochodziła z pierwotnego szkieletu projektu i jest ona zbędna. 14

Zmienna lfsr pełnić będzie rolę 16 bitowego rejestru przesuwnego ze sprzężeniem zwrotnym. Zmienna period używana będzie jako 16 bitowy licznik. Do czego posłuży licznik, zostanie wyjaśnione później. Wartość obu zmiennych interpretowana będzie jako liczba całkowita bez znaku. Generator należy zainicjalizować. Po odnalezieniu fragmentu kodu co_stream_open(random, O_WRONLY, INT_TYPE(STREAMWIDTH)); // Read values from the stream podmienić go na co_stream_open(random, O_WRONLY, INT_TYPE(STREAMWIDTH)); lfsr = 0xACE1u; period = 0; // Read values from the stream W ten sposób rejestr lfsr zostaje zainicjalizowany wartością ACE1, a licznik wyzerowany. Aby nie generować danych w nieskończoność, zmienić należy warunek pętli while z while ( 1 ){ #pragma CO PIPELINE na while ( period < 0xFFFFu ){ #pragma CO PIPELINE Ostatni krok polega na kompilacji projektu. W przypadku pomyślnej kompilacji należy przejść dalej. Jeśli kompilacja nie powiodła się, należy samodzielnie postarać się wyeliminować wszystkie błędy w projekcie. Jeśli okaże się to zbyt trudne, proszę poprosić o pomoc osobę prowadzącą zajęcia. 15

7. Symulacja Przed przystąpieniem do symulacji pracy generatora, należy wpierw umieścić w kodzie breakpoint. Breakpoint umieścić zaraz za pragmą CO PIPELINE, tak jak zilustrowano to na rysunku poniżej. Symulację uruchamia się wciskając klawisz F5. Po uruchomieniu symulacja zatrzyma się w linijce, w której założono breakpoint. Teraz należy dodać interesujące nas zmienne do listy obserwowanych. W tym celu ustawiamy kursor myszy na nazwie zmiennej (np. lfsr), naciskamy prawy przycisk myszy i wybieramy opcję Add Watch z pojawiającego się menu kontekstowego. Postępując w ten sposób należy dodać do listy obserwowanych dwie zmienne lfsr oraz period. 16

Jeśli wszystko zostało wykonane poprawnie, efekt powinien być podobny do tego przedstawionego na rysunku poniżej, a obie zmienne widoczne w nowej zakładce o nazwie Watch. Wykonują symulację krok po kroku (poprzez wciskanie kolejno klawisza F5), należy prześledzić pracę generatora. Po wykonaniu kilkunastu kroków zakończyć pracę debuggera (kombinacja klawiszy Shift + F5). Proszę zwrócić uwagę, że opis bloku generatora został wykonany w większości w języku ANSI C (bardzo niewiele jest charakterystycznych dla języka Impulse C funkcji, makr, itp.) Cały proces projektowania ograniczył się jedynie do kilku kroków: 1. Stworzenie szkieletu projektu i jego edycja.. Umieszczenie wykonanego w języku ANSI C behawioralnego opisu działania układu generatora w pliku _hw. 3. Drobne zabiegi kosmetyczne, jak np. edycja warunku pętli while. 17

8. Generacja kodu HDL Przed przystąpieniem do generacji wynikowego kodu HDL, należy poprawnie ustawić wszystkie opcje dotyczące projektu (wynikowy język HDL, platforma docelowa, itp.) Dopiero gdy to wszystko zostanie zrobione, można przystąpić do wygenerowania kodu, a następnie analizy raportu końcowego i schematu blokowego stworzonego układu. 8.1. Ustawienia Należy naprowadzić kursor myszy na ikonę symbolizującą projekt. Znajduje się ona w bocznej zakładce Solution Explorer. Klikając prawym przyciskiem myszy wywołujemy menu kontekstowe i wybieramy z niego właściwości (Properties). 1 18

W nowo otwartym oknie należy: wybrać opcję konfiguracji sprzętowej Configuration: Hardware zaznaczyć Configuration Properties Impulse C Build dołączyć stosowne pliki: Hardware files generator_hw.c Software files generator_sw.c, generator.h 1 3 4 W opcji Directories wprowadzić nazwy katalogów eksportowych: Hardware Export Directory export_hw Software Export Directory export_sw 3 1 19

Dla opcji generatora HDL (HDL Generator) ustawić co następuje: Target Generic (VHDL) Use std_logic Yes Export Files Yes Kolejno ustawiane opcje decydują o: a) Platformie docelowej. W przedstawionym przypadku jest to standardowy język VHDL (zgodny z normą IEEE), niededykowany dla żadnej konkretnej platformy sprzętowej. b) Dołączeniu i użyciu biblioteki std_logic_1164 w wygenerowanym kodzie HDL. c) Wyeksportowaniu plików wynikowych do wcześniej stworzonych katalogów docelowych. 3 4 1 0

Wybrać wszystkie opcje optymalizacji (Optimization) jako aktywne: Constant Propagation Yes Array Scalarization Yes Relocate Loop Invariants Yes Kolejno wybrane opcje decydują o: a) Zastąpieniu wyrażeń i zmiennych przez stałe, jeśli tylko ich wartości mogą zostać obliczone w chwili kompilacji i są niezmienne przez cały czas trwania procesu. Podejście takie prowadzi do przyspieszenia działania systemu i redukuje zajęte zasoby logiczne. b) Skalaryzacji tablic. Tablice implementowane standardowo jako bloki pamięci zostają zaimplementowane przez rejestry. Wpływa to pozytywnie na szybkość działaniu układu, jednak drastycznie zwiększa ilość zajętych zasobów logicznych. c) Przeniesienie pewnych wyrażeń poza ciało pętli. Opcja ta może doprowadzić do zrównoleglenia pewnych partii kodu. 4 3 1 5 Kliknąć przycisk Zastosuj. 1

8.. Generacja Z rozwijanego paska umiejscowionego u szczytu okna Visual Studio należy wybrać opcję kompilacji sprzętowej (Hardware), a następnie skompilować projekt (Alt + Shift + B). Jeśli generacja kodu HDL przebiegła pomyślnie, w oknie Output pojawi się komunikat o powodzeniu. W przeciwnym wypadku stosując się do wskazówek kompilatora, należy postarać się wyeliminować błędy uniemożliwiające poprawną kompilacji. Jeśli zadanie to okaże się za trudne, należy zwrócić się o pomoc do osoby prowadzącej zajęcia. W oknie raportu widoczny jest komunikat, że pojawił się plik o nazwie generator.xic, który wykorzystany zostanie za chwilę.

Przybliżona analiza zasobów sprzętowych, jakie zajmuje stworzony moduł generatora również pojawia się w oknie raportu (Output). Aby mu się przyjrzeć, należy przewinąć raport do góry. Powinien on przypominać w swojej formie i treści raport przedstawiony poniżej. W przedstawionym raporcie można wyszczególnić kolejno: bloki: nazwa i numer bloku, typ bloku (np. pętla, pipeline), liczba stanów (Stages), maksymalne wnoszone opóźnienie (Max. Unit Delay), latencja (Latency), wydajność (Rate), efektywna wydajność (Effective Rate), operatory: typ, liczba operatorów danego typu, szerokość bitowa argumentów, informacja dodatkowe: liczba wszystkich stanów (Total Stages), maksymalne opóźnienie pojedynczego bloku (Max. Unit Delay), oszacowana ilość użytych bloków DSP (Estimated DSP). W realizowanym projekcie użyte zostają dwa 16 bitowe sumatory i jeden 16 bitowy komparator. Maksymalne opóźnienie układu wynosi 3 takty zegara. Jest to wartość najgorsza (worst case), 3

która wystąpi jeśli operacja dodawania i/lub porównywania będzie przeprowadzana sekwencyjnie bit po bicie. W rzeczywistości zewnętrzny program, który przeprowadzi operacje syntezy i implementacji (np. Xilinx ISE) zrealizuje sumator/komparator w taki sposób, by nie wnosił on żadnego opóźnienia. Analiza raportu na tym poziomie pozwala w łatwy sposób stwierdzić, czy otrzymany kod HDL jest optymalny. 8.3. Schemat blokowy Schemat blokowy generatora znajduje się we wspomnianym wcześniej pliku z rozszerzeniem xic. Do jego podglądu służy program o nazwie Stage Master Explorer. Nie można go otworzyć bezpośrednio z poziomu Visual Studio, toteż koniecznym staje się użycie narzędzia CoDeveloper. W tym celu w CoDeveloperze należy rozwinąć zakładkę Tools i wybrać Stage Master Explorer. W nowo otwartym oknie należy wybrać plik z rozszerzeniem xic i kliknąć przycisk Otwórz. 1 4

Okno Stage Master Explorera zawierać będzie identyczny raport, jak ten widoczny wcześniej w Visual Studio. Zaznaczając kolejne bloki zauważyć można w zakładce Source Code podświetlenie różnych partii pseudokodu (kodu pośredniego). Dolne indeksy przy poszczególnych zmiennych i funkcjach odnoszą się do numeru taktu zegara, w którym dana zmienna lub funkcja są wykorzystywane. 5

W tym miejscu należy zastanowić się nad funkcjonalnością pseudokodu i możliwością samodzielnego przełożeni go na wygenerowaną logikę. W zakładce Datapath widoczny jest schemat blokowy zaznaczonego bloku (schemat przepływu). Przeglądając diagramy przepływu każdego z bloków należy: zastanowić się na ich funkcjonalnością, przyjrzeć się jak realizowane są poszczególne operacje arytmetyczne i logiczne, zwrócić uwagę na opóźnienie wnoszone przez poszczególne bloki, zastanowić się nad wpływem bloków konwersji typu danych. 6

9. Optymalizacja projektu Zredagować kod Impulse C tak, by: operować jedynie na danych typu całkowitoliczbowego (int), używać jedynie typów dedykowanych dla sprzętu (co_), używać jedynie operacji dedykowanych dla danego typu danych (np. IADDxx(arg1, arg)). Należy zwrócić uwagę na to jaką wartością inicjalizujemy zmienne i dopilnować, by nadal został wygenerowany pojedynczy okres generatora. Wskazówki odnośnie poszczególnych typów i funkcji można znaleźć w User Guide CoDevelopera. 10. Sprzętowa implementacja generatora Implementacja generatora zostanie wykonana z użyciem programu ISE Design Suite. W pierwszym kroku należy uruchomić aplikację poprzez dwukrotne kliknięcie ikony znajdującej się na pulpicie. Wygląd ikon dla poszczególnych wersji ISE może różnić się między sobą. 10.1. Tworzenie projektu W zakładce File wybieramy New Project 7

W oknie czarodzieja należy stosownie nazwać projekt (np. generator) Name:, a następnie kliknąć przycisk Next. 1 8

W następnym oknie należy wybrać: rodzinę układów Virtex 5 (Family Virtex5), układ xc5vlx0 (Device XC5VLX0), typ obudowy ff1760 (Package FF1760), opóźnienie (Speed -), narzędzie do syntezy (Synthesis Tool XST (VHDL/Verilog)), symulator ModelSim (Simulator Modelsim-xx VHDL), preferowany język VHDL (Preferred Language VHDL), standard języka (VHDL Source Analysis Standard VHDL-93), a następnie kolejno kliknąć przyciski Next i Finish. 4 3 1 7 6 5 8 9 9

10.. Dołączanie źródeł Gdy już nowy projekt zostanie utworzony, koniecznie należy dołączyć do niego pliki źródłowe. W tym celu kliknąć należy na ikonę Add Source, a następnie dodać wszystkie pliki znajdujące się w podkatalogu hw w katalogu export_hw (katalog eksportowy CoDevelopera). 30

W oknie informującym o statusie dołączanych plików należy kliknąć przycisk OK. 10.3. Tworzenie biblioteki Aby projekt mógł zostać zsyntezowany, a następnie zaimplementowany, koniecznym jest dołączenie do niego wszystkich plików charakterystycznych dla języka Impulse C i aktualnie używanego PSP (Platform Support Package). Pliki te zebrane zostać powinny w bibliotekę o nazwie impulse. 31

W programie ISE DS należy wybrać zakładkę Libraries, a następnie z menu kontekstowego wybrać New Source 1 3

W nowym oknie wybrać VHDL Library, a następnie nazwać bibliotekę (File name:) impulse. Nazwa impulse jest obligatoryjna! Gdy zostanie to zrobione należy kliknąć przyciski Next, a następnie Finish. 1 3 Do nowo stworzonej biblioteki koniecznie należy dodać pliki. W tym celu klikając prawym przyciskiem myszy na nazwie biblioteki impulse, wybieramy z menu kontekstowego opcję Add Source, 33

a następnie dodajemy wszystkie pliki zawarte w podkatalogu impulse_lib w katalogu export_hw (katalog eksportowy CoDevelopera). W oknie informującym o statusie dołączanych plików należy kliknąć przycisk OK. 34

10.4. Synteza Przejść do zakładki Design i uruchomić syntezę. W tym celu kliknąć dwukrotnie lewym przyciskiem myszy na opcji Syntesize XST lub umieścić nad nim kursor myszy, kliknąć prawym przyciskiem myszy wywołując menu kontekstowe, a następnie wybrać z niego opcję Run. Synteza powinna się zakończyć po paru minutach. 3 1 Gdy synteza zostanie zakończona, należy zapoznać się z jej wynikami maksymalną częstotliwością pracy systemu, zajętymi zasobami logicznymi, schematem RTL układu, itp. 35

10.5. Implementacja Aby przeprowadzić implementację układu, należy wykonać identyczny szereg czynności, jak w przypadku syntezy. W zakładce Design dwukrotnie klikamy lewym przyciskiem myszy na opcji Implement Design. Po kilku minutach implementacja powinna zostać zakończona. 3 1 Po zakończeniu implementacji proszę zapoznać się z jej wynikami. Zwrócić szczególną uwagę na wyniki analizy czasowej Static Timing. 10.6. Podsumowanie Proszę zastanowić się nad różnicami wyników (pochodzących z syntezy oraz implementacji) dotyczących maksymalnej częstotliwości pracy układu/minimalnego okresu sygnału zegarowego. Czy częstotliwość pracy układu jest duża, czy mała? Proszę zastanowić się nad ilością zajętych przez układ zasobów logicznych. Czy jest to duża ilość zasobów? Proszę zastanowić się nad szybkością projektowania całego systemu, wykonania testów poprawności działania układu, a na końcu przeprowadzenia operacji sprzętowej implementacji. Czy poświęcony na to czas był długi? Raport z syntezy i implementacji w postaci pliku html znajduje się w katalogu roboczym projektu. Proszę go zachować, gdyż będzie on jeszcze potrzebny. Uwaga! Oglądane wyniki syntezy i implementacji dotyczą samego układu generatora. Samego jego rdzenia. Aby móc uruchomić zaprojektowany system cyfrowy na platformie sprzętowej (np. DRC AC00), konieczną jest jeszcze implementacja interfejsów komunikacyjnych. Spowoduje to dodatkowo powiększenie zajętych zasobów logicznych, eliminując jednocześnie problem interfejsu komunikacyjnego pomiędzy układem FGPA a światem. Ilość zajętych przez interfejs komunikacyjny zasobów jest praktycznie stała i zależna od platformy sprzętowej. 36

11. Optymalizacja projektu pod platformę sprzętową Powtórzyć kroki z punktów 8.1 oraz 8., wybierając tym razem jako cel implementacji (Target) Xilinx Generic (VHDL). Po skończonym etapie generacji kodu HDL z języka Impulse C, należy przystąpić do założenia nowego projektu w ISE DS. Powtórzyć wszystkie kroki z punktu 10, zmieniając jedynie nazwę projektu (np. generator_xilinx). Po wykonaniu syntezy i implementacji zapoznać się z ich wynikami. Porównać nowo otrzymane wyniki, z wynikami dla projektu poprzedniego. Określić, jak zmieniły się: maksymalna częstotliwość pracy układu, zajętość zasobów logicznych. Czy poprawnie zdefiniowana platforma sprzętowa ma istotne znaczenie? Czy wykonywanie poprawek i optymalizacji w raz stworzonym projekcie jest trudne? Kiedy już dotrzesz to tego miejsca, poinformuj o tym osobę prowadzącą zajęcia. Z uczuciem satysfakcji i spełnienia możesz opuścić salę 309. 37

A. Projekt w CoDeveloperze Jeśli nie udało się z jakichś przyczyn utworzyć projektu w Visual Studio, ćwiczenie laboratoryjne będzie kontynuowane w narzędziu CoDeveloper. Konieczną jest edycja kodu wygenerowanego przez narzędzie CoDeveloper tak, by dostosować utworzony szkielet, do tworzonego w trakcie zajęć projektu. Należy kolejno wykonać wszystkie polecenia zawarte w punktach od 5.1 do 5.3. W przypadku punktu 5.3. próbna kompilacja projektu przebiega inaczej niż w Visual Studio. W celu jej wykonania należy kliknąć na ikonę opisaną jako EXE (wskazaną przez czerwoną strzałkę na rysunku poniżej). W oknie Build pojawią się komunikaty. Jeśli wszystkie zmiany zostały wprowadzone poprawnie, projekt zostanie skompilowany i pojawią się komunikaty Processing completed successfuly oraz Build of target build_exe complete. W tym momencie należy przejść do następnej części ćwiczenia. W przypadku pojawienia się informacja o niepowodzeniu kompilacji (komentarz Error) pojawią się również komunikaty wskazujące jakie są jego przyczyny. Bazując na nich należy spróbować samodzielnie wyeliminować przyczyny błędów. Jeśli okaże się to zbyt trudne, proszę zwrócić się o pomoc do osoby prowadzącej zajęcia. Następnie należy wykonać wszystkie polecenia zawarte w punkcie 6 niniejszego opracowania. Praktyczna symulacja pracy krokowej generatora jest niemożliwa do wykonania przy użyciu CoDevelopera. Można sobie wyobrazić co prawda sytuację, gdy po każdej linijce kodu zapisanego w języku C pojawia się instrukcja zatrzymująca pracę programu, a w oknie wiersza poleceń pojawiają się aktualne wartości interesujących nas zmiennych. Podejście takie jest jednakże bardzo kłopotliwe i nie gwarantuje, że wyniki symulacji pokrywać się będą z rzeczywistymi stanami układu. Możliwa jest jednak programowa emulacja działania projektowanego układu. Przed jej wykonaniem, należy jednak dopilnować, by poprawnie ustawione zostały wszystkie opcje kompilacji. W tym celu należy kliknąć przycisk Options. 38

Większość rubryk uzupełnia za nas automatycznie sam CoDeveloper. Może się jednak czasami zdarzyć, że pewne opcje nie zostaną poprawnie skonfigurowane. Należy upewnić się, że w zakładce Build poprawnie dołączone zostały następujące pliki: CoBuilder Hardware Files Source (.c) files: generator_hw.c Include (.h) files: generator.h CoBuilder Software Files Source (.c) files: generator_sw.c Include (.h) files: generator.h Desktop Simulation (.EXE) Build Options Source (.c) files: generator_hw.c generator_sw.c Include (.h) files: generator.h Zaznaczone powinny zostać również następujące opcje: Generate makefile Build for debug (-g) 1 6 3 7 4 5 9 8 39

W zakładce Simulate dopilnować, by załączone zostały następujące pliki: Software simulation executable name: generator.exe Update hardware simulation executable: generator.exe Zaznaczone powinny zostać również opcje: Update software simulation executable Update hardware simulation executable Jeśli chcielibyśmy dokonać jeszcze weryfikacji poprawności działania układu opisanego językiem HDL przy pomocy ModelSima, należałoby zaznaczyć opcję Generate ModelSim testbench (na tym ćwiczeniu nie będziemy wykonywać takiej symulacji), która doprowadzi do wygenerowania stosownego testbencha dla zaprojektowane przez nas układu. Wektory wymuszeń testbencha będą identyczne z danymi wejściowymi dla symulacji software owej. 1 4 5 3 40

W tym miejscu skonfigurowane zostaną również od razu opcje dotyczące generacji wynikowego kodu HDL. W zakładce Generate należy upewnić się, że uzupełnione poprawnie zostały następujące pola: Output Directories Hardware build directory: hw Software build directory: sw Hardware export directory: export_hw Software export directory: export_sw Ponadto wybrane powinny zostać następujące opcje: Platform Support Package: Generic (VHDL) Hardware Optimization and Generation Enable constant propagation Scalarize array variables Relocate loop invariant expressions Use std_logic types for VHDL interfaces Do not include co_ports interface Gdy wszystko zostało już poprawnie skonfigurowane, należy kliknąć przycisk Zastosuj, a potem OK. 1 6 11 8 7 9 10 3 4 5 13 1 41

W tym momencie można wykonać symulację software ową. Aby tego dokonać należy nacisnąć przycisk Lunch wskazany na poniższym rysunku. Z wynikiem symulacji można się zapoznać w nowo otwartym oknie wiersza poleceń. Jeśli wynik jest zgodny z oczekiwanym, należy przejść dalej. W przeciwnym wypadku należy zastanowi się, co sprawia, że układ działa niepoprawnie, a następnie wyeliminować przyczynę tej awarii. Generacja kodu HDL w przypadku CoDevelopera odbywa się sprawniej, niż dla Visual Studio. Jeśli wyniki symulacji są zgodne z oczekiwanymi, można śmiało wygenerować pliki opisujące zaprojektowany przez nas układ w języku VHDL lub Verilog. Aby dokonać generacji kodu HDL wystarczy kliknąć na ikonę Generate HDL zaznaczoną poniżej. W oknie Build pojawi się komunikat o powodzeniu lub niepowodzeniu kompilacji. Jeśli generacja przebiegła poprawnie, prócz stosownego komunikatu widoczną również będzie informacja o wygenerowaniu pliku generator.xic. Jeśli kompilacja nie powiodła się, należy postarać się wyeliminować błędy. Jeśli zadanie to okaże się za trudne, należy zwrócić się o pomoc do osoby prowadzącej zajęcia. Przybliżona analiza zasobów sprzętowych, jakie zajmuje stworzony moduł generatora również pojawia się w oknie raportu (Build). Aby mu się przyjrzeć, należy przewinąć raport do góry. Kopię raportu i komentarze do niego umieszczono w rozdziale 8.. Dalsza część ćwiczenia polega na wykonaniu poleceń zawartych w punktach od 8.3 do 11. 4