Akademia Górniczo Hutnicza im. Stanisława Staszica w Krakowie Wydział IET Katedra Elektroniki Projektowanie systemów za pomocą języków wysokiego poziomu ESL Ćwiczenie 2 Implementacja funkcji Hash z użyciem języka Impulse C Zespół Rekonfigurowalnych Systemów Obliczeniowych Maciej Wielgosz, Grzegorz Gancarczyk http://home.agh.edu.pl/~wielgosz/ 09.10.2013
Wstęp Celem ćwiczenia jest praktyczne zapoznanie Studentów z możliwościami przyspieszenia czasu obliczeń poprzez wykorzystanie platform rekonfigurowalnych. Przykładem realizowanym w trakcie zajęć będzie sprzętowa akceleracja funkcji Hash (skrótu). Ponadto Studenci utrwalą i wykorzystają zdobytą w trakcie ostatnich zajęć wiedzę dotyczącą języka Impulse C oraz metodyki projektowania układów cyfrowych z wykorzystaniem narzędzia CoDeveloper (środowiska Microsoft Visual Studio 2008). Wymagania sprzętowe: komputer klasy PC, procesor o architekturze zgodnej z x86, procesor oferujący sprzętowy multithreading. Wymagania programowe: 32 bitowy system operacyjny Windows XP lub wyższy, środowisko ISE Design Suite. Wymagane doświadczenie: ukończone ćwiczenie nr 1. 2
1. Założenia projektowe Projekt realizowany samodzielnie przez Zespoły Studenckie w trakcie zajęć laboratoryjnych polegać będzie na zaimplementowaniu funkcji hash przy użyciu języka Impulse C. Moduł sprzętowy powinien charakteryzować się: 32 bitowym strumieniem danych wejściowych, 32 bitowym strumieniem danych wyjściowych, pełną potokowością w przetwarzaniu danych, czterema, kaskadowymi realizacjami funkcji hash. Funkcja haszująca, zwana również funkcją hash, mieszającą lub skrótu realizuje odwzorowanie, które przyporządkowuje dowolnie dużej liczbie, blokowi danych, strumieniowi znaków (oryginałowi) pewną wartość (obraz). Wartość ta z założenia zajmuje znacznie mniej bitów niż oryginał, posiada stały rozmiar i pseudolosową wartość. Poglądową ilustrację obrazującą przykładową, idealną, nie minimalną funkcję mieszającą przedstawiono Funkcje hash wykorzystywane są powszechnie w informatyce i elektronice (np. generacja sygnatur logicznych) oraz kryptografii (np. jądro algorytmów szyfrujących z rodziny SHA). Poprawnie zaprojektowany system cyfrowy powinien wykonać haszowanie tekstu Inwokacji z Pana Tadeusza autorstwa Adama Mickiewicza. Tekst Inwokacji powinien znaleźć się w pliku filter_in.dat. 3
2. Szkielet projektu Ponieważ czas trwania zajęć laboratoryjnych jest ograniczony, dlatego też w niniejszym rozdziale umieszczone zostaną wskazówki, mające na celu pomóc Zespołom Studenckim sprostać postawionemu przed nimi zadaniu. 2.1. Ciało funkcji Przykładowe ciało funkcji haszującej zapisanej w języku ANSI C przedstawiono w ramce unsigned int hash_soft(char* str, unsigned int len) { unsigned int hash = 5381; unsigned int i = 0; for(i = 0; i < len; str++, i++) hash = ((hash << 5) + hash) + (*str); } return hash; Przed przystąpieniem do zapisu algorytmu w języku Impulse C, proszę wpierw zaznajomić się i zrozumieć zasadę działania przedstawionej powyżej funkcji hash. Szczególnie proszę dopilnować, by strumień danych wejściowych był 32, a nie 8 bitowy. Wykorzystując CoDeveloper User s Guide zapoznać się z definicją i właściwościami dyrektywy #pragma CO INLINE, która powinna zostać użyta w celu spełnienia warunku wielokrotnej, kaskadowej realizacji funkcji hash. W tej samej pozycji odnaleźć oraz zaznajomić się z definicjami i właściwościami funkcji co_array_config( ) oraz dyrektyw #pragma CO UNROLL, #pragma CO PRIMITIVE, #pragma CO PIPELINE. 2.2. Schemat blokowy systemu Schemat blokowy omawianego systemu, który proponuje się zaimplementować, przestawiono Na schemacie można wyróżnić bloki: programowe danych wejściowych (Producer), danych wyjściowych (Consumer), sprzętowy (Filter), oraz strumienie (określone względem bloku Filter): danych wejściowych (in), danych wyjściowych (out). 4
2.3. Architektura bloku Filter Preferowaną architekturę projektowanego systemu cyfrowego przedstawiono na rysunku Na rysunku wyróżnić można dwa typy bloków. Są to: blok realizujący funkcję haszującą, blok przechowujący wartości wyników cząstkowych (rejestr). Ponadto widoczne są dwa strumienie przepływu danych: strumień danych oryginalnych (oznaczony kolorem zielonym), strumień klucza skracającego i danych skróconych (oznaczony kolorem czerwonym). 2.4. Budowa elementarnego bloku hash module Rysunek obrazujący budowę bloku elementarnego hash module przedstawiono 5