All hands on deck!!! 92
Założenia projektowe Budujemy generator liczb pseudolosowych Moduł generujący LFSR (Linear Feedback Shift Register) Źródło: en.wikipedia.org/wiki/linear_feedback_shift_register Wersja 16 bitowa 93
LFSR Budowa rejestr przesuwny ze sprzężeniem zwrotnym na bramkach EX-OR. Podstawa działania wielomian charakterystyczny (pierwotny, pierwszy, generujący) Galoisa. Właściwości T = 2 N -1, słabe własności statystyczne danych wynikowych. Zastosowanie CRC (Cyclic Redundancy Check), Scrambler, Pomiary IR (Impulse Response). 94
Plan działania Projekt w C pod narzędziem Visual Studio Projekt w Impuse C pod narzędziem CoDeveloper Projekt w Impulse C pod narzędziem Visual Studio Symulacja działania generatora programowego i sprzętowego Generacja kodu HDL Analiza wyników Optymalizacja kodu Synteza i Implementacja 95
Projekt software owy Utworzyć projekt pod narzędziem Visual Studio 2008 uruchomić program, 96
Projekt software owy utworzyć nowy projekt File New Project, 97
Projekt software owy wybrać typ projektu Project types: Visual C++, zaznaczyć Templates: Win32 Console Application, 98
Projekt software owy nazwać projekt Name: (np. generator_sw), kliknąć przycisk OK, 99
Projekt software owy kliknąć przycisk Next >, 100
Projekt software owy określić typ aplikacji Application type: Console application, wybrać opcję Additional options: Empty project, kliknąć przycisk Finish. 101
Projekt software owy Tworzenie generatora dodać nowy plik do projektu pod Visual Studio Solution Explorer generator_sw Add New Item, 102
Projekt software owy wybrać kategorię Categories: Visual C++, zaznaczyć Templates: C++ File(.cpp), nazwać projekt z rozszerzeniem c Name: (np. rng.c), kliknąć Add, 103
Projekt software owy w nowo otwartym oknie umieścić następującą deklarację: #include <stdio.h> int main() { unsigned short lfsr = 0xACE1; unsigned short period = 0; do { lfsr = (lfsr >> 1) ^ (-(lfsr & 0x0001) & 0xB400); ++period; printf("wartosci losowe: 0x%04X\n", lfsr); } } while(lfsr!= 0xACE1); Źródło: en.wikipedia.org/wiki/linear_feedback_shift_register 104
Projekt software owy zbudować projekt (alt + shift + B) i przejść do następnego etapu. 105
Projekt hardware owy Utworzyć projekt pod narzędziem CoDeveloper uruchomić program, w oknie startowym kliknąć przycisk Create a New Project, 106
Projekt hardware owy zaznaczyć Project types General Application Templates, zaznaczyć Templates One input stream, one output stream, nazwać projekt (np. generator), 107
Projekt hardware owy wybrać lokalizację projektu na dysku Location, kliknąć przycisk OK, 108
Projekt hardware owy kliknąć przycisk Dalej >, 109
Projekt hardware owy nazwać proces Process name: (np. generator), nazwać strumień wejściowy Input stream name: (np. input) nazwać strumień wyjściowy Output stream name: (np. random), 110
Projekt hardware owy określić szerokość strumienia Stream width: 16 bit, określić głębokość strumienia Stream depth: 1 bit, kliknąć przycisk Dalej >, 111
Projekt hardware owy kliknąć przycisk Zakończ. 112
Projekt hardware owy Utworzyć projekt pod narzędziem Visual Studio 2008 uruchomić program, 113
Projekt hardware owy utworzyć nowy projekt File New Project, 114
Projekt hardware owy wybrać typ projektu Project types: Visual C++, zaznaczyć Templates: Impulse C Project, 115
Projekt hardware owy nazwać projekt Name: (np. generator), kliknąć przycisk OK. 116
Projekt hardware owy Kopiowanie projektu skopiować pliki utworzone pod CoDeveloperem (generator.h, generator_hw.c, generator_sw.c) do katalogu roboczego Visual Studio ( Visual Studio 2008\Projects\generator\generator), dołączyć skopiowane pliki, do projektu pod Visual Studio Solution Explorer generator Add Existing Item, 117
Projekt hardware owy zaznaczyć odpowiednie pliki (generator.h, generator_hw.c, generator_sw.c) i kliknąć przycisk Add, 118
Projekt hardware owy Próbna kompilacja zbudować projekt (alt + shift + B). 119
Projekt hardware owy Eliminacja zbędnych bytów generator.h, Generator nie wymaga danych wejściowych /////////////////////////////////////////////////////////////////////////////// // // Generated by Impulse CoDeveloper // Impulse C is Copyright(c) 2003-2006 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" 120
Projekt hardware owy Eliminacja zbędnych bytów generator_hw.c, Proces wejściowy nie jest potrzebny // Software process declarations (see generator_sw.c) extern void Producer(co_stream input); extern void Consumer(co_stream random); ( ) // // This is the hardware process. // void generator(co_stream input, co_stream random) Strumień wejściowy jest zbędny 121
Projekt hardware owy Eliminacja zbędnych bytów generator_hw.c, Brak danych wejściowych = licznik danych wejściowych jest zbędny IF_SIM(int samplesread; int sampleswritten;) ( ) Opis licznika jest zbędny do { // Hardware processes run forever IF_SIM(samplesread=0; sampleswritten=0;) co_stream_open(input, O_RDONLY, INT_TYPE(STREAMWIDTH)); co_stream_open(random, O_WRONLY, INT_TYPE(STREAMWIDTH)); Nie ma sensu otwierać coś, co nie istnieje 122
Projekt hardware owy Eliminacja zbędnych bytów generator_hw.c, Wyedytować tymczasowo na 1 while ( co_stream_read(input, &nsample, sizeof(co_int16)) == co_err_none ) { #pragma CO PIPELINE IF_SIM(samplesread++;) ( ) Opis licznika danych wejściowych jest zbędny Ten strumień nie istnieje co_stream_close(input); co_stream_close(random); IF_SIM(cosim_logwindow_fwrite(log, "Closing filter process, samples read: %d, samples written: %d\n", samplesread, sampleswritten);) Nie odczytamy coś, co nie istnieje 123
Projekt hardware owy Eliminacja zbędnych bytów generator_hw.c, void config_generator(void *arg) { co_stream input; Ten strumień nie istnieje co_stream random; co_process generator_process; co_process producer_process; co_process consumer_process; Ten proces nie istnieje 124
Projekt hardware owy Eliminacja zbędnych bytów generator_hw.c, Ten strumień nie istnieje 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, input); Ten proces nie istnieje generator_process = co_process_create("generator", (co_function)generator, 2, input, random); Wyedytować na 1. Usunąć strumień wejściowy 125
Projekt hardware owy Eliminacja zbędnych bytów generator_sw.c, void Producer(co_stream input) { ( ) Eliminujemy całego Producera } 126
Projekt hardware owy Próbna kompilacja alt + shift + B, jeśli succeeded, przejść dalej, jeśli failed, poprosić o pomoc prowadzącego. 127
Projekt hardware owy Czas na pytania 128
Projekt hardware owy Tworzenie modułu sprzętowego podmienić // Sample is now in variable nsample. // Add your processing code here. co_stream_write(random, &nsample, sizeof(co_int16)); na lfsr = (lfsr >> 1) ^ (-(lfsr & 1u) & 0xB400u); ++period; co_stream_write(random, &lfsr, sizeof(co_int16)); 129
Projekt hardware owy zadeklarować zmienne lsfr oraz period void generator(co_stream random) { co_int16 nsample; void generator(co_stream random) { uint16 lfsr; uint16 period; 130
Projekt hardware owy warunki początkowe zmiennych lsfr oraz period co_stream_open(random, O_WRONLY, INT_TYPE(STREAMWIDTH)); // Read values from the stream co_stream_open(random, O_WRONLY, INT_TYPE(STREAMWIDTH)); lfsr = 0xACE1u; period = 0; // Read values from the stream 131
Projekt hardware owy warunek pętli while, while ( 1 ) { #pragma CO PIPELINE while ( period < 0xFFFFu ) { #pragma CO PIPELINE zbudować projekt (alt + shift + B). 132
Symulacja Wstawienie breakpointów w kodzie programu (sw) 133
Symulacja Wstawienie breakpointów w kodzie programu (hw) 134
Symulacja Uruchomienie symulacji F5 (hw + sw) 135
Symulacja Obserwacja zmiennych (hw + sw) dodać zmienne lsfr oraz period do listy obserwowanych, umieścić kursor nad nazwą zmiennej menu kontekstowe Add Watch, 136
Symulacja zmienne i ich wartości pojawią się w nowym oknie Watch, prześledzić i porównać pracę obu generatorów (praca krokowa F5), zakończyć pracę debuggera (shift + F5). 137
Wnioski Model funkcjonalny RNG (Random Number Generator) opisany w językach C oraz Impulse C jest identyczny Symulacje można zredukować jedynie do symulacji układu opisanego w języku Impulse C Proces tworzenia układu sprowadził się do: umieszczenia behawioralnego opisu działania układu zapisanego w języku C wewnątrz pliku _hw, wykonania niewielkich modyfikacji kodu C do kodu Impulse C, innych zabiegów (np. warunek pętli while). 138
Generacja kodu HDL Opcje wybrać opcje projektu. generator menu kontekstowe Properties 139
Generacja kodu HDL Drzewo plików wybrać konfigurację sprzętową Configuration: Hardware, 140
Generacja kodu HDL dodać pliki sprzętowe i programowe Configuration Properties Impulse C Build Hardware files generator_hw.c, Software files generator_sw.c, generator.h, 141
Generacja kodu HDL dodać katalogi eksportowe Configuration Properties Impulse C Directories Hardware Export Directory export_hw, Software Export Directory export_sw. 142
Generacja kodu HDL Opcje generatora Configuration Properties Impulse C HDL Generation Target Generic (VHDL), Use std_logic Yes, Export Files Yes. 143
Generacja kodu HDL optymalizacje Configuration Properties Impulse C Optimization Constant Propagation Yes, Array Scalarization Yes, Relocate Loop Zastosuj. Invariants Yes, 144
Generacja kodu HDL Wybór kompilatora kompilacja sprzętowa (Hardware). Generacja kodu (alt + shift + B). 145
Generacja kodu HDL Wynik kompilacji 146
Analiza wygenerowanej logiki Analiza przybliżona bloki budowa, typ (np. pipeline), liczba stanów (Stages), maksymalne opóźnienie (Max. Unit Delay), latencja (Latency) wydajność (Rate) efektywna wydajność (Effective Rate). 147
Analiza wygenerowanej logiki operacje arytmetyczne/logiczne, typ (np. Adder), liczba, szerokość bitowa argumentów. 148
Analiza wygenerowanej logiki Informacje dodatkowe liczba wszystkich stanów (Total Stages), maksymalne opóźnienie pojedynczego bloku (Max. Unit Delay), ilość użytych bloków DSP (Estimated DSP). 149
Analiza wygenerowanej logiki Stage Master Explorer uruchomić narzędzie Stage Master Explorer CoDeveloper Tools Stage Master Explorer, 150
Analiza wygenerowanej logiki załadować plik xic generator.xic Otwórz, 151
Analiza wygenerowanej logiki przyglądnąć się wynikom, 152
Analiza wygenerowanej logiki przyglądnąć się pseudokodowi (Source Code) odpowiadającemu poszczególnym blokom zastanowić się nad funkcjonalnością pseudokodu, spróbować przełożyć (samodzielnie) pseudokod na wygenerowaną logikę. 153
Analiza wygenerowanej logiki przyglądnąć się diagramom przepływu danych (Datapath) odpowiadającym poszczególnym blokom zastanowić się nad funkcjonalnością diagramów przepływu, przyjrzeć się, jak realizowane są poszczególne operacje arytmetyczne i logiczne, zwrócić uwagę na opóźnienia wnoszone przez bloki, zastanowić się nad blokami konwersji typu danych. 154
Optymalizacja projektu Zespoły 1 4 wyedytować kod tak, by: operować jedynie na danych typu int, używać jedynie typów sprzętowo dedykowanych co_ (co_int??), używać jedynie operacji dedykowanych dla danego typu danych (IADD??). Zespoły 5 8 wyedytować kod tak, by: operować jedynie na danych typu uint, używać jedynie typów sprzętowo dedykowanych co_ (co_uint??), używać jedynie operacji dedykowanych dla danego typu danych (UADD??). 155
Optymalizacja projektu Kompilacja (programowa) projektu zespoły 1 4 zmiany w następujących po sobie stanach generatora. 156
Optymalizacja projektu Generacja logiki zespoły 1 4 brak widocznych zmian na poziomie logów. 157
Optymalizacja projektu Generacja logiki zespoły 1 4 zmniejszenie liczby stopni konwersji typów 158
Optymalizacja projektu Wnioski Zespoły 1 4. Zespoły 5 8. 159
Synteza Utworzyć projekt pod narzędziem ISE Design Suite uruchomić program, wybrać File New Project, 160
Synteza nazwać projekt Name: (np. generator), kliknąć przycisk Next, 161
Synteza wybrać rodzinę układów Family Virtex5, wybrać urządzenie Device XC5VLX220, wybrać obudowę Package FF1760, wybrać opóźnienie Speed -2, 162
Synteza wybrać narzędzie do syntezy Synthesis Tool XST (VHDL/Verilog), wybrać symulator Simulator Modelsim-?? VHDL, wybrać preferowany język Preferred Language VHDL, 163
Synteza wybrać standard analizy języka VHDL Source Analysis Standard VHDL- 93, kliknąć Next, w nowo otwartym oknie kliknąć Finish. 164
Synteza Dodać pliki źródłowe kliknąć ikonę Add Source, 165
Synteza zaznaczyć wszystkie pliki z podkatalogu hw katalogu export_hw, kliknąć Otwórz, 166
Synteza kliknąć OK. 167
Synteza Utworzyć bibliotekę impulse przełączyć widok na zakładkę Libraries, dodać nowe pliki menu kontekstowe New Source, 168
Synteza wybrać VHDL Library, nazwać bibliotekę File name: impulse, kliknąć Next, w nowym oknie kliknąć Finish. 169
Synteza dodać pliki do biblioteki impulse menu kontekstowe Add Source, 170
Synteza zaznaczyć wszystkie pliki z podkatalogu impulse_lib katalogu export_hw, kliknąć Otwórz, 171
Synteza kliknąć OK, 172
Synteza Synteza w zakładce Design uruchomić syntezę Synthesize XST menu kontekstowe Run. 173
Implementacja Implementacja w zakładce Design uruchomić implementację Implement Design menu kontekstowe Run. 174
Synteza i implementacja Zapoznać się z logami syntezy i implementacji Wnioski maksymalna częstotliwość pracy, zajętość zasobów logicznych, inne. 175
Synteza i implementacja Xilinx generic Wyeksportować nowe pliki HDL Visual Studio, Target Xilinx Generic (VHDL). Założyć nowy projekt ISE zaimportować nowe pliki źródłowe, zaimportować nowe pliki biblioteki impulse, wykonać syntezę i implementację. 176
Synteza i implementacja Xilinx generic Zapoznać się z wynikami syntezy i implementacji Wnioski maksymalna częstotliwość pracy, zajętość zasobów logicznych, porównanie z implementacją Generic (VHDL). 177
Podsumowanie Czas poświęcony na zaprojektowanie, testy, optymalizację, syntezę oraz implementację modułu sprzętowego w języku Impulse C jest krótki. Ilość narzędzi użytych podczas projektowania układu była duża, przez co projektowanie może wydawać się żmudne i długie. Czas poświęcony na przełączanie się między narzędziami jest długi, w porównaniu do czasu spędzonego na wykonaniu opisu behawioralnego projektowanego układu. 178
Podsumowanie Stage Master Explorer znacząco przyspiesza proces projektowania układu, gdyż eliminuje każdorazowo potrzebę wykonania syntezy i implementacji w celu sprawdzenia, czy układ dobrze działa oraz czy przeprowadzone działania odniosły zamierzony skutek. Kluczowym jest wybranie odpowiedniego PSP, który zapewni optymalny wariant implementacyjny. 179
Pytania sprawdzające 180