Michał Leśniewski Tomasz Władziński Układy Cyfrowe projekt Korekcja jasności obrazów w 24-bitowym formacie BMP z użyciem funkcji gamma Opis głównych modułów sprzętowych Realizacja funkcji gamma entity gamma Sercem opracowanego układu jest oczywiście komponent, który korzystając z pamięci ROM oblicza aproksymowane wartości funkcji gamma. W projekcie odpowiada mu plik gamma.vhd. Układ ten nie jest automatem, działa praktycznie jak układ logiczny. Ponieważ wiele wartości (przede wszystkim zawartość pamięci ROM) musiały zostać przygotowane wcześniej, zostały więc wyliczone w programie OpenOffice Calc. Wyniki obliczeń znajdują się w pliku Obliczenia do układu.ods. Wejścia układu gammaval Parametr gamma Jest to stałoprzecinkowa liczba 8-bitowa bez znaku. Przecinek znajduje się za 2 bitem liczby. Dzięki temu może on przyjmować wartości z zakresu od 0 do 3,984375, a więc zgodnie z zakresem gamma. Według tej liczby wyznaczany jest numer krzywej n, którą powinno się wykorzystać. Granice zakresów odpowiadających tym samym wartościom n zostały wyliczone w automatycznie (plik Obliczenia do układu.ods zakładka Podział na krzywe ). x Parametr funkcji Jest to całkowita liczba 8-bitowa bez znaku. Jest parametrem funkcji (jasnością), dla której zostanie obliczony wynik. Wyjście układu y - Wynik funkcji Jest to całkowita liczba 8-bitowa bez znaku. Jest wynikiem funkcji dla zadanego parametru x oraz parametru gammaval. Pamięć ROM entity gammarom oraz jej alternatywy Zgodnie ze wstępnymi założeniami, komponent gamma wykorzystuje pamięć ROM z wcześniej obliczonymi wartościami dla wybranych parametrów. Moduł pamięci ROM został utworzony automatycznie narzędziem MegaWizard. Jej zawartość jest zdefiniowana w pliku gammarom.mif, a sam plik pamięci to gammarom.vhd. Pamięć ma 256 komórek 8-bitowych. Nie wykorzystano rejestrów trzymających wartości adresu ani wartości wyjściowych.
Alternatywy dla gammarom Dzięki temu, że ROM zdefiniowano w osobnym pliku, został użyty jako osobny komponent, co pozwoliło nam na łatwe podmienienie tego komponentu na alternatywne. W pliku gamma można zamienić nazwy komponentu z gammarom na gammarom_alt1 lub gammarom_alt2, co spowoduje dołączenie zamiast pamięci ROM, układów działających tak samo, lecz inaczej zbudowanych. gammarom_alt1 Ten komponent opisany jest bezpośrednio przy pomocy tablicy prawdy (with address select q <= 10101001 when 11101101,...). Zawartość sekcji architecture w pliku vhdl została wygenerowana arkuszem kalkulacyjnym (plik Obliczenia do układu.ods zakładka Tablica prawdy w VHDL ). gammarom_alt2 Ten komponent ma każdy bit wyjściowy opisany równaniem wygenerowanym przez program Espresso. Plik wejściowy dla programu został również utworzony automatycznie (plik Obliczenia do układu.ods zakładka Tablica prawdy dla ESPRESSO ). Program Espresso użyty został z parametrem -oeqntott, dzięki czemu wyjściowy plik zawierał gotowe równania. Po zastąpieniu odpowiednich znaków w równaniach ( & na and, na or...), wynik można było użyć w VHDLu. Porównanie rozwiązań gammarom i alternatyw Niezależnie od rodzaju komponentu, czas potrzebny na obliczenie wartości funkcji gamma jest dosyć zbliżony, jednak ze względu na liczbę potrzebnych komórek logicznych znaczną przewagę ma układ gammarom. Porównanie maksymalnych czasów oraz liczby komórek (dla całego modułu gamma) podano w tabeli: Komponent Maksymalny czas [ns] Liczba komórek logicznych gammarom 112,3 221 gammarom_alt1 120,1 540 gammarom_alt2 141,5 801
Automat odbiorczo-nadawczy USB entity automatusb Do komunikacji między komputerem a płytką wykorzystany został moduł USB (FTDI FT245BM) wpinany do płytki. Jego obsługa jest dosyć skomplikowana, dlatego też do komunikacji z tym układem został wykorzystany dodatkowy automat. Wejścia i wyjścia do komunikacja z układem FT245BM Wejścia RXT oraz TXE Wejścia informujące o stanie układu FT245BM. RXT związane jest z odczytem danych, zaś TXE z wysyłaniem. Wyjścia RD oraz WR Wyjścia, przez które układ FT245BM jest informowany o chęci odczytu (RD) bądź wysłania (WR) danych. Port dwukierunkowy data Port typu inout, z którego dane są odczytywane przy odbiorze danych i do którego są zapisywane przy wysyłaniu. Układ FT245BM pozwala na odczyt/wysłanie jednocześnie całych bajtów (a więc po 8 bitów). Pozostałe wejścia clk zegar Port, do którego powinien zostać podłączony zegar. Automat reaguje na rosnące zbocze zegara. rst reset Wejście, które w przypadku pojawienia się zera powoduje przywrócenie całego automatu do stanu oczekiwania (idle). wrstart start zapisu Wejście, które w przypadku pojawienia się jedynki powoduje rozpoczęcie wysyłania danych przez układ. rdstart start odczytu Wejście, które w przypadku pojawienia się jedynki powoduje rozpoczęcie odbioru danych przez układ. wrbyte dane do zapisu Wejście 8-bitowe zawierające dane, które mają zostać wysłane. Pozostałe wyjścia rdready odczyt zakończony Wyjście sygnalizujące stanem wysokim, że odbieranie zostało zakończone. wrready zapis zakończony Wyjście sygnalizujące stanem wysokim, że wysyłanie zostało zakończone.
rdbyte dane odebrane Wyjście 8-bitowe zawierające dane, które zostały odebrane. Na wyjściu podtrzymywany jest ostatnio odebrany bajt aż do odczytu kolejnego. Odbieranie danych Aby odebrać dane, automat sterujący powinien wykonać następujące kroki: 1. Ustawić rdstart = '1' (tylko aby rozpocząć, dalsze kroki wykonywane są niezależnie od stanu rdstart). 2. Oczekiwać na sygnał rdready = '1'. 3. Odczytać odebrane dane z rdbyte. Uwaga: rdbyte nie zmieni swojej wartości, dopóki ponownie nie uruchomimy odbierania (nawet po resecie). Wysyłanie danych Aby wysłać dane, automat sterujący powinien wykonać następujące kroki: 1. Ustawić dane do wysłania w wrbyte. 2. Ustawić wrstart = '1' (również jedynie, aby rozpocząć). 3. Oczekiwać na sygnał wrready = '1'. Dopiero w momencie można zmienić wartość ustawioną na wrbyte. Uwaga: Wysyłanie i odbieranie realizowane są wewnętrznie przez 2 odrębne automaty, więc nie należy przerywać cyklu odbioru lub nadawania uruchamiając drugi automat. Uwaga: Oba automaty sygnał gotowości przekazują w momencie, gdy są w stanie gotowości. Można więc czekać najpierw na stan gotowości, a dopiero następnie wysyłać. Działanie automatu Automat jest złożony z 3 prostych elementów osobnego automatu nadawczego i odbiorczego oraz bufora trójstanowego, który obsługuje przełączanie portu data między jednym a drugim automatem. Automat odbiorczy i nadawczy zostały zrealizowane identycznie jak w przykładach dr inż. Mariusza Rawskiego z wykładów (przykład USBRam w VHDL-u). Modyfikacje w stosunku do przykładu USBRam: Automaty nadawczy i odbiorczy nie zajmują się zapisem/odczytem danych z pamięci, więc usunięto stan, w którym inkrementowano licznik adresów, zapisywano dane itp. Dla większej przejrzystości podzielono całość na osobne pliki. Usunięto stany oczekiwania (przykład z wykładu był projektowany dla płytki z zegarem 66MHz, nasz zegar ma częstotliwość tylko 25,175MHz, zatem stany oczekiwania można było ograniczyć w odbiorniku do 2, w nadajniku do 1).
Automat sterujący gammamodule Automatem sterującym działaniem całego układu jest automat gammamodule. Są do niego dołączone wszystkie przedstawione wcześniej komponenty oraz komponent wygenerowany funkcją MegaWizard gammaram, a więc pamięć układu. Wejścia i wyjścia układu Układ porty związane z układem FT245BM te same, które zostały wymienione w opisie automatu USB. Poza tym jedyne wejścia to: clk zegar Wejście, do którego powinien zostać podłączony zegar. Automat reaguje na rosnące zbocze. rst reset Wejście, które przy stanie '0' powoduje reset automatu, czyli przejście do pierwszego stanu. Resetowanie zrealizowane jest asynchronicznie. Pin ten powinien zostać podłączony do jednego z przycisków na płytce. Ważniejsze sygnały wewnętrzne i rejestry gammar, gammag, gammab 8-bitowe wartości parametrów gamma dla składowych odpowiednio: czerwieni, zieleni, błękitu. pixelmax 8-bitowa liczba przechowująca liczbę wszystkich pikseli, które powinny zostać przetworzone, minus 1. addresscnt 10-bitowy licznik przechowujący adres komórki w komponencie gammaram, do którego dane są zapisywane, lub z którego są czytane. pixelcnt 8-bitowy licznik przetworzonych już pikseli. Po doliczeniu do pixelmax i ostatniej składowej, układ przechodzi z trybu odczytu do czytania lub odwrotnie. rgbcnt 4-bitowy licznik składowych. Wartość 00 (=0) odpowiada czerwieni, 01 (=1) zieleni, a 10 (=2) błękitowi. Według tego licznika układ ustala, którą wartość ma podać jako parametr do komponentu gamma (gammar, gammag, czy gammab).
Schemat działania W trakcie działania automat przechodzi przez następujące stany (jeżeli w punkcie nie opisano inaczej, po każdym stanie automat przechodzi do kolejnego niżej na liście): 1. Stan reset: Reset licznika adresów, licznika pikseli i licznika składowych. 2. Odbiór liczby pikseli wysyłanych naraz (pixelmax): 1. Stan start_rcv_pixelcnt: Uruchomienie automatu odbiorczego (rdstart <= '1'). 2. Stan wait_rcv_pixelcnt: Jeżeli zakończono odczyt (rdready = '1'), przejście do stanu start_rcv_gammar, w przeciwnym razie pozostanie w tym samym 3. Odbiór parametru gamma dla składowej czerwonej. 1. Stan start_rcv_gammar: Uruchomienie automatu odbiorczego (rdstart <= '1'), zapisanie wartości ostatnio odebranej z rdbyte do pixelmax. 2. Stan wait_rcv_gammar: Jeżeli zakończono odczyt (rdready = '1'), do stanu start_rcv_gammag, w przeciwnym razie pozostanie w tym samym 4. Analogicznie odebranie parametru gamma dla składowej zielonej. 1. Stan start_rcv_gammag: Uruchomienie automatu odbiorczego (rdstart <= '1'), zapisanie wartości ostatnio odebranej z rdbyte do gammar. 2. Stan wait_rcv_gammag: Jeżeli zakończono odczyt (rdready = '1'), do stanu start_rcv_gammab, w przeciwnym razie pozostanie w tym samym 5. Analogicznie odebranie parametru gamma dla składowej niebieskiej. 1. Stan start_rcv_gammab: Uruchomienie automatu odbiorczego (rdstart <= '1'), zapisanie wartości ostatnio odebranej z rdbyte do gammag. 2. Stan wait_rcv_gammab: Jeżeli zakończono odczyt (rdready = '1'), do stanu save_gammab, w przeciwnym razie pozostanie w tym samym 3. Stan save_gammab: Specjalny stan, w którym do gammab zapisywana jest ostatnio odebrana wartość z rdbyte. 6. Odbiór wartości, dla której powinna zostać obliczona funkcja gamma. 1. Stan start_rcv_val: Uruchomienie automatu odbiorczego (rdstart <= '1'). 2. Stan wait_rcv_val: Jeżeli zakończono odczyt (rdready = '1'), do stanu calc1, w przeciwnym razie pozostanie w tym samym 7. Stan calc1: Oczekiwanie na obliczenie wartości funkcji. 8. Stan calc2: Dalsze oczekiwanie (należy odczekać około 45ns 2 stany to około 80ns)
9. Stan save_value: Ustawienie '1' na wejściu we (write-enable) komponentu gammaram i zapis wyniku obliczenia. 10.Stan next_value: W przypadku, gdy licznik składowych ma wartość 10 (= 2), następuje sprawdzenie, czy przetworzono już wszystkie piksele (pixelmax = pixelcnt). Jeżeli tak, to wszystkie liczniki zostają zerowane i następuje przejście do stanu start_send. Jeżeli nie, licznik adresów oraz pikseli jest inkrementowany, a licznik składowych zostaje ustawiony na 00 (= 0), a automat przechodzi do stanu start_rcv_val. W przypadku, gdy licznik składowych ma wartość inną niż 10, następuje inkrementacja licznika składowych i adresów, a automat przechodzi do stanu start_rcv_val. 11.Wysyłanie wyniku funkcji: 1. Stan start_send_result: Uruchomienie automatu nadawczego (wrstart <= '1'). 2. Stan wait_send_result: Jeżeli zakończono wysyłanie (wrready = '1'), następuje przejście do stanu next_result, w przeciwnym razie pozostanie w tym samym 12.Stan next_result: Stan analogiczny do stanu next_value, jednak przechodzimy tym razem odpowiednio do stanu reset lub start_send. Przełączanie odpowiednich wyjść (np. gammaval) następuje poza automatem na podstawie wartości w licznikach.