• Nie Znaleziono Wyników

3 Układy FPGA

3.2 Architektura

3.2.5 Bloki pamięci RAM

Kolejnym typowym blokiem funkcjonalnym spotykanym w układach FPGA jest wbudowana pamięć statyczna RAM do wykorzystania przez aplikację użytkownika. Pamięć taka dostępna jest w blokach, które można ze sobą łączyć aby uzyskać odpowiednią pojemność. Pamięci wbudowane w układy FPGA mogą być skonfigurowane jako jedno- i dwuportowe, jako pamięci FIFO, CAM lub ROM. Dwuportowość pamięci pozwala na niezależny, jednoczesny zapis i odczyt nawet przy różnej szerokości słowa dla obu portów. Takie rozwiązanie umożliwia konstruowanie np. kolejek FIFO, których dane wejściowe to 8-bitowe, a wyjściowe są już 32-bitowe, co jest „przezroczyste” dla modułów wpisujących i odczytujących dane z tej kolejki.

Pamięci SRAM mogą być również zainicjowane przy włączaniu zasilania układu FPGA w sposób analogiczny jak pamięć SRAM, do której ładowana jest konfiguracja bloków i połączeń między nimi. Dla przykładu, na rysunku 3.6 pokazano schemat blokowy pamięci BlockRAM układu Spartan-6.

Rysunek 3.6. Schemat BlockRAM – jeden port [22]

Strona 30 z 162 3.3 Projektowanie układów cyfrowych

Projektowanie układów cyfrowych, które mają działać w strukturze FPGA to proces, który rozpoczyna się od przygotowania specyfikacji projektu. Kolejne etapy projektowania pokazano na rysunku 3.7.

Rysunek 3.7. Etapy projektowania układów cyfrowych

Są to kolejno:

 Opisanie projektu - polega na zdefiniowaniu działania poprzez schemat, opis behawioralny lub bezpośredni opis połączeń.

 Kompilacja – na tym etapie odbywa się sprawdzenie składni opisu projektowanego układu oraz przygotowanie skompilowanych plików do dalszego przetwarzania.

 Synteza – skompilowane pliki projektu są następnie zamieniane na listę połączeń (tzw.

netlistę), która odzwierciedla już fizyczne połączenia pomiędzy blokami

Strona 31 z 162

funkcjonalnymi docelowego układu cyfrowego. Pomimo poprawnej kompilacji, synteza może zakończyć się niepowodzeniem jeśli niektóre elementy projektu nie mogą zostać odzwierciedlone fizycznie dla wybranego układu FPGA.

 Symulacja behawioralna – jeśli synteza zakończy się powodzeniem, można przystąpić do symulacji behawioralnej układu. Symulacja taka ma na celu weryfikację zachowania układu, tj. jego funkcjonalności, jednak bez uwzględniania rzeczywistych ograniczeń układu, dla którego nastąpi implementacja projektu. Symulację behawioralną przeprowadza się przygotowując tzw. testbench, który pozwala zdefiniować zewnętrzne środowisko układu, czyli np. sygnał zegarowy, dane wejściowe (które mogą pochodzić np. z pliku) itp. Symulacja behawioralna z wykorzystaniem testbench to potężne narzędzie pozwalające już na tym etapie wyeliminować błędy w funkcjonalności projektu, a nawet zdecydować o wprowadzeniu zmian w specyfikacji projektu, tak aby zoptymalizować jego działanie w docelowej aplikacji.

 Implementacja – po pozytywnym wyniku syntezy i zweryfikowaniu funkcjonalnym projektu można przystąpić do implementacji projektu, czyli fizycznego rozmieszczenia komponentów i połączeń między nimi w konkretnym, wybranym układzie FPGA na podstawie pliku netlisty. Proces implementacji dzieli się na etapy:

tłumaczenia netlisty w formacie EDIF na format podstawowy NGD (ang. Native Generic Database), mapowanie projektu w układzie FPGA, rozmieszczenie komponentów i połączeń między nimi (Place and Route – najdłużej trwający etap implementacji) oraz analizę czasową zgodnie z ograniczeniami zdefiniowanymi przez użytkownika (np. minimalna częstotliwość taktowania z zewnętrznego źródła zegarowego).

 Symulacja czasowa – jest to symulacja uwzględniająca informacje pochodzące z procesu implementacji, czyli zależności czasowe występujące w konkretnym układzie FPGA (na podstawie jego modelu). Ten rodzaj symulacji pozwala zdiagnozować problemy związane z różnymi opóźnieniami występującymi w docelowym układzie FPGA.

 Wytworzenie pliku służącego do konfiguracji układu FPGA – na podstawie wyników implementacji możliwe jest utworzenie pliku binarnego, który stanowi podstawowy zbiór informacji niezbędny do zaprogramowania układu FPGA.

Strona 32 z 162

 Weryfikacja w docelowym układzie FPGA – pomimo wykonania symulacji behawioralnej i czasowej konieczna jest weryfikacja projektu zaimplementowanego i uruchomionego w docelowym układzie FPGA. Nowoczesne metody testowania w docelowym okładzie pozwalają na zlokalizowanie punktów pomiarowych wewnątrz układu FPGA poprzez umieszczenie dodatkowej logiki komunikującej się z zewnętrznym oprogramowaniem. Firma Xilinx udostępnia w tym celu narzędzie o nazwie ChipScope [31]. Nadal przydatne są również tradycyjne narzędzia diagnostyczne takie jak oscyloskop, czy analizator stanów logicznych.

3.3.1 Opis strukturalny

Strukturalne opisywanie układu to takie, w którym definiuje się konkretne połączenia pomiędzy komponentami układu cyfrowego. Opis taki jest odpowiednikiem opisu graficznego (schematu) danego układu. Takie podejście wywodzi się z tradycyjnych metod projektowania układów cyfrowych, jednak jest nieefektywne i nieoptymalne w przypadku nowoczesnych, złożonych układów programowalnych. Ponieważ poziom skomplikowania dzisiejszych układów cyfrowych jest bardzo duży, konstruktorzy wykorzystują przede wszystkim opis behawioralny jako narzędzie projektowe.

3.3.2 Opis behawioralny

Opis behawioralny, w przeciwieństwie do opisu strukturalnego, nie opisuje struktury układu cyfrowego, a jego zachowanie. Nie musimy więc wiedzieć, jak ma być skonstruowany dany układ, a tylko jaki efekt chcemy uzyskać. Narzędzia projektowe zamienią taki opis działania układu na format odpowiedni do implementacji w układzie programowalnym. Projektant nie musi zatem znać nawet budowy i zasady działania bloków logicznych, które finalnie znajdą się w układzie, musi jedynie poprawnie opisać projektowany układ pod względem logicznym i formalnym (składnia języka opisu sprzętu). W praktyce, aby opisać zachowanie układu, korzysta się z jednego z języków opisu sprzętu HDL. Do najbardziej znanych języków HDL należą VHDL oraz Verilog.

Języki opisu sprzętu są wzorowane na językach programowania takich jak Pascal, czy C++, ale sposób ich interpretacji mocno różni się od sekwencyjnie wykonywanych instrukcji zapisanych w języku programowania. W językach opisu sprzętu opisuje się wygląd lub zachowanie układu, pamiętając jednak o współbieżności działania opisanych elementów,

Strona 33 z 162

w przeciwieństwie do sekwencyjności w ujęciu tradycyjnym, charakterystycznej dla języków programowania.

3.3.3 Języki opisu sprzętu

Jednymi z najpopularniejszych języków opisu sprzętu, szczególnie w zastosowaniach akademickich, są VHDL oraz Verilog. Poza nimi wykorzystywane są również języki:

 ABEL (ang. Advanced Boolean Expression Language) – jeden z najstarszych języków opisu sprzętu opracowany przez firmę amerykańską Data I/O w pierwszej połowie lat 80.

 AHDL (ang. Altera Hardware Description Language) – prosty język o niskim poziomie abstrakcji, wykorzystywany głównie jako element edukacji wprowadzający do projektowania układów cyfrowych w strukturach programowalnych.

 inne (CUPL, ZEUS, CONLAN, KIDLAN).

Język Verilog swą popularność zawdzięcza w dużej mierze łatwości opanowania przez osoby, które miały styczność z językiem programowania C++. Ponieważ inżynierowie, elektronicy często wykorzystują język C++ dla różnych celów, opanowanie podstaw języka Verilog jest dla nich stosunkowe łatwe.

Język VHDL cechuje się nieco trudniejszą składnią i jej opanowanie zajmuje zazwyczaj więcej czasu. Posiada jednak większe możliwości opisu wysokiego poziomu, których nie ma język Verilog.

Język Verilog doczekał się również rozszerzonego standardu zwanego SystemVerilog, który jest w dużym stopniu zgodny z językiem, z którego się wywodzi. Nowością w SystemVerilog jest odrębna część umożliwiająca weryfikację działania opisanego układu cyfrowego.

Weryfikacja taka oparta jest o obiektowy język programowania przypominający swoją strukturą język programowania Java.

3.4 Konfiguracja

Konfigurowanie układów programowalnych polega na ustawieniu trybu pracy poszczególnych komórek logicznych oraz zestawieniu połączeń pomiędzy tymi komórkami.

W układach programowalnych stosuje się trzy rodzaje łączników konfiguracyjnych:

ścieżki przepalenia (ang. fuse) – są to odpowiednio przygotowane ścieżki, które podczas konfiguracji układu programowalnego są na stałe usuwane,

Strona 34 z 162

ścieżki udrożnienia (ang. antifuse) – są to struktury nieprzewodzące, które podczas konfiguracji układu programowalnego są przebijane (przebicie izolatora rozdzielającego ścieżki przewodzące),

 tranzystory MOS, które po włączeniu łączą ze sobą ścieżki przewodzące.

W układach FPGA stosowane są tranzystory MOS, które jako jedyne z wymienionych, posiadają możliwość dynamicznej, wielokrotnej konfiguracji, bez stałej zmiany struktury układu programowalnego. Elementy łączące w układach FPGA mogą mieć różną budowę.

Mogą to być komórki pamięci typu EPROM, EEPROM, Flash lub zwykłe tranzystory MOS, których stan włączenia podtrzymywany jest z pamięci statycznej RAM.

Zalety rozwiązania z pamięcią SRAM (łatwość wytworzenia w strukturze krzemowej, niewielkie wymiary, bark problemu z kasowaniem promieniami UV jak w przypadku pamięci EPROM) zdecydowały o tym, że większość dostępnych układów FPGA wykonana jest w tej właśnie technologii. Ponieważ pamięć statyczna SRAM jest pamięcią ulotną i jej zawartość jest kasowana po odłączeniu zasilania, do konfiguracji układów FPGA niezbędna jest zewnętrzna pamięć nieulotna. Może to być pamięć typu EEPROM lub Flash, ale nic nie stoi na przeszkodzie, aby zastosować rozwiązanie, które dane konfiguracyjne pobiera z lokalnej sieci typu Ethernet, czy nawet z zewnętrznego serwera. Przykładowo, układy rodziny Spartan-3 firmy Xilinx mogą być konfigurowane w jednym z pięciu trybów: JTAG, Master Serial, Slave Serial, Master Parallel, Slave Parallel. W zależności od wybranego trybu sygnał taktujący dane konfiguracyjne pochodzi z układu FPGA (Slave Serial, Slave Parallel) lub z zewnątrz (Master Serial, Master Parallel), a dane przesyłane są szeregowo (Master Serial, Slave Serial) lub równolegle (Master Parallel, Slave Parallel). Możliwa jest również konfiguracja bezpośrednio z łańcucha JTAG.

Dane konfiguracyjne ładowane są do pamięci SRAM podczas każdego uruchamiania układu.

Układ potrzebuje nieco czasu po włączeniu zasilania, zanim będzie gotowy do pracy.

Zazwyczaj nie są to jednak czasy dłuższe niż kilkaset milisekund, więc nie stanowią problemu dla docelowej aplikacji.

Zastosowanie pamięci typu SRAM stwarza również nowe możliwości wykorzystania układów FPGA jako układy w części lub całości rekonfigurowalne. Układy takie mogą zmieniać swoją funkcjonalność w docelowej aplikacji, w zależności od aktualnych potrzeb.

Strona 35 z 162 3.5 Obszary aplikacji

Układy FPGA stanowią odpowiedź na potrzebę rynku, która wypełnia lukę pomiędzy małymi układami programowalnymi (PLD), a układami specjalizowanymi (ASIC). Technologia ASIC pozwala wytwarzać szybkie, specjalistyczne układy cyfrowe, ale sposób ich wytwarzania sprawia, że wprowadzenie ich na rynek jest czasochłonne i drogie, a tym samym opłacalne dopiero przy produkcji masowej. Układy programowalne typu PLD pozwalają na szybkie przygotowanie i przetestowanie projektu w docelowym układzie, ale są stosunkowo powolne i posiadają zbyt mało zasobów, aby wykorzystać je przy złożonych projektach.

Układy FPGA natomiast wpisują się dokładnie pomiędzy te dwie grupy: są szybsze od układów PLD, a wolniejsze od ASIC, posiadają więcej zasobów niż układy PLD i mniej niż układy ASIC. Dzięki układom FPGA możliwe stało się szybkie wprowadzanie na rynek niewielkich serii skomplikowanych układów elektronicznych, zawierających w swej strukturze złożone układy cyfrowe. Układy FPGA pozwalają również na fizyczne przetestowanie projektu, który docelowo zostanie zrealizowany w technologii ASIC.

Obecnie coraz częściej spotkać można zastosowanie technologii ASIC i FPGA w jednym układzie. Na przykład układy rodziny Zynq firmy Xilinx zawierają w swej strukturze procesory ARM oraz matrycę FPGA. W 2014 roku Intel wprowadził technologię FPGA do swoich procesorów x86 [32].

3.6 FPGA i generatory liczby pseudolosowych

Generatory liczb pseudolosowych, których zasada działania opiera się o znany algorytm z łatwością implementowane są, z wykorzystaniem dowolnego z języków programowania.

Przykładem mogą być liczne implementacje generatorów Lehmera, które nie tylko zostały zrealizowane w danym języku programowania, ale również zostały ujęte jako element danego standardu [33].

Drugą grupą generatorów losowych są generatory TRNG, których działanie opiera się o różne zjawiska fizyczne, cechujące się pewną miarą szumu (np. szum termiczny, szum fazowy).

Tego typu generatory nie są realizowalne w klasycznych językach programowania, gdyż żaden z nich nie dysponuje informacją pochodzącą bezpośrednio z fizycznego źródła sygnału z cechami losowymi. Oczywiście możliwe jest dołączenie zewnętrznego urządzenia, które np.

wzmocni i spróbkuje szum, a następnie dostarczy go do aplikacji za pomocą portu komunikacyjnego USB. Jednak bez takiego dodatkowego urządzenia, operując jedynie językiem programowania, nie jesteśmy w stanie wytworzyć sygnału losowego.

Strona 36 z 162

W przypadku układów FPGA możliwe jest wytworzenie ciągu liczb z generatora TRNG bazując na języku opisu sprzętu i zjawiskach, które mogą wystąpić wewnątrz zaprojektowanego układu logicznego. Przykładami takich zjawisk mogą być szumy fazowe generatorów pierścieniowych lub stany metastabilne [34].

Wracając do generatorów pseudolosowych, które są tematem rozprawy, układy FPGA mają również przewagę nad klasycznymi językami programowania, gdyż:

 Pozwalają zrównoleglić wybrane operacje – jeśli tylko dany algorytm wytwarzania liczb pseudolosowych posiada elementy, które mogą być wykonywane jednocześnie, można to bez problemu zrealizować w programowalnym układzie cyfrowym. Niestety zazwyczaj algorytmy służące do wytworzenia kolejnej liczby wymagają podania na ich wejście liczby poprzedniej, co zmniejsza możliwości przyspieszania pojedynczego generatora. Tutaj jednak wystarczy zauważyć, że nie trzeba zrównoleglać poszczególnych operacji algorytmu. Zamiast tego można uruchomić równolegle wiele generatorów.

 Pozwalają na tworzenie generatorów o dowolnie wybranej długości słowa.

W przeciwieństwie do klasycznych języków programowania, które działają na procesorach 32 lub 64-bitowych determinujących długość słowa wytwarzanego przez generator, implementacje w FPGA pozwalają na konstruowanie generatorów, których długość słowa jest większa od 64-bitów. Górny limit długości słowa wyznaczają dostępne zasoby wybranego układu FPGA. Istotną kwestią jest to, że nawet jeśli implementacje w klasycznych językach programowania byłyby możliwe, to tylko w układach FPGA zwiększanie długości słowa nie wpływa istotnie na zmniejszenie szybkości (liczonej w cyklach zegarowych) wytwarzania kolejnych słów.

 Są szybsze – ponieważ obliczenia realizowane są przez specjalizowane układy logiczne zaprojektowane do tego celu i zaimplementowane w układzie FPGA.

Dodatkowo szybkość może być zwiększana przez zwiększanie długości generowanego w jednym cyklu słowa pseudolosowego.

Warto również wspomnieć o operacjach tablicowych, które pojawiają się w algorytmach poprawiających własności statystyczne wytwarzanych ciągów pseudolosowych (tasowanie), a które bez problemu mogą być zrealizowane w układach FPGA dzięki wykorzystaniu wbudowanej w ich struktury blokowej pamięci statycznej SRAM. Dla niektórych algorytmów możliwe jest również wykorzystanie bloków cyfrowego przetwarzania sygnałów, choć są one

Strona 37 z 162

projektowane raczej dla działań ze stosunkowo krótkim słowem wejściowym (bloki DSP w układach Spartan-6 przyjmują na wejściu dwie liczby 18-bitowe – choć można je także łączyć by uzyskać większe możliwości).

Strona 38 z 162

4 Przegląd rozwiązań generatorów pseudolosowych

Rozdział zawiera przegląd najbardziej znanych rozwiązań w obszarze generatorów pseudolosowych. Dla usystematyzowania wprowadzono podział na trzy typy generatorów:

generatory liniowe, generatory nieliniowe, generatory łączone.

4.1 Generatory liniowe

Do generatorów liniowych można zaliczyć każdy generator, który jest opisany wyłącznie funkcjami liniowymi.

4.1.1 Liniowy generator kongruencyjny

Istnienie rodziny generatorów liniowych zapoczątkowała publikacja D. H. Lehmera z 1949 roku opisująca generator znany dziś w literaturze jako liniowy generator kongruencyjny LCG (ang. Linear Congruential Generator) [35]. Generator LCG jest jednym z podstawowych generatorów pseudolosowych. Jego działanie polega na dostarczaniu kolejnych liczb zgodnie ze wzorem:

𝒑𝒏 = (𝒂 ∗ 𝒑𝒏−𝟏+ 𝒄)𝒎𝒐𝒅𝑴, 𝒏 = 𝟏, 𝟐, … (4.1) gdzie a, c, M to liczby całkowite. Własności statystyczne generatora LCG zależą od parametrów a, c oraz M, a jego maksymalny możliwy okres wynosi M. Aby generator LCG wytwarzał ciąg o maksymalnym okresie, konieczne jest spełnienie następujących warunków [36], [37]:

 modulnik M oraz przesuniecie c powinny być względnie pierwsze,

 a – 1 jest podzielne przez wszystkie czynniki pierwsze liczby M,

 a – 1 jest podzielne przez 4 jeśli M jest podzielne przez 4.

Generatory LCG, których parametry a oraz c są różne od zera (równanie 4.1) nazywane są kongruencyjnymi generatorami mieszanymi MxCG (ang. Mixed Congruential Generator).

Powszechność stosowania generatorów LCG wynika z faktu, iż są one łatwe w implementacji, nie wymagają dużych zasobów pamięci i zostały zaimplementowane w wielu popularnych językach programowania np. w ANSI C (a = 1103515245; c = 12345; M

= 232). Badacze wykazali jednak kilka istotnych wad tego generatora, między innymi, struktura kratowa [3] czy problem z przewidywalnością [38].

Strona 39 z 162

W przypadku, gdy parametr c = 0 mówimy o kongruencyjnym generatorze multiplikatywnym MCG (ang. Multiplicative Congruential Generator):

𝒑𝒏 = (𝒂 ∗ 𝒑𝒏−𝟏)𝒎𝒐𝒅𝑴, 𝒏 = 𝟏, 𝟐, … (4.2) Właściwości ciągu wytwarzanego przez generator MCG silnie zależą od jego parametrów konstrukcyjnych, czyli liczb a oraz M.

Maksymalny okres ciągu wyjściowego generatora MCG wynosi M – 1. Wynika to z faktu, iż konieczne jest pominięcie stanu 0, z którego generator nie jest w stanie wyjść. Warunki wystarczające do wytwarzania ciągu maksymalnego to [37]:

 pn-1 jest względnie pierwsze w stosunku do M (dlatego do uzyskania m-ciągu wybiera się takie M, które jest liczbą pierwszą),

mnożnik a powinien być elementem pierwotnym modulo M.

W praktyce wybór liczby M nie jest dowolny ze względu na fakt, że generator ma z założenia wytwarzać liczby o określonej liczbie bitów. Narzucenie liczby bitów determinuje wybór liczby M i w efekcie własności statystyczne ciągu wyjściowego mogą być modyfikowane wyłącznie poprzez zmianę parametru a.

4.1.2 Wielokrotnie rekursywny generator liniowy

Wielokrotnie rekursywny generator liniowy opisany jest wzorem:

𝒑𝒏 = (𝒂𝟏∗ 𝒑𝒏−𝟏+ 𝒂𝟐∗ 𝒑𝒏−𝟐+ ⋯ + 𝒂𝒓∗ 𝒑𝒏−𝒓+ 𝒄)𝒎𝒐𝒅𝑴, 𝒏 = 𝟏, 𝟐, … ; 𝒓 > 𝟏 (4.3) Z uwagi na łatwiejszą analizę matematyczną i mniej skomplikowaną implementacją, zainteresowanie badaczy koncentruje się na wielokrotnie rekursywnym generatorze multiplikatywnym, czyli dla c = 0. Zasadniczą przewagą tego generatora nad MCG jest znacznie dłuższy maksymalny okres wytwarzanych ciągów wynoszący Mr – 1. Okres o takiej długości można uzyskać pod warunkiem, że M jest liczbą pierwszą i współczynniki a są dobrane we właściwy sposób [3], [37].

4.1.3 Opóźniony generator Fibonacciego

Generator ten opisany jest wzorem:

𝒑𝒏 = (𝒑𝒏−𝒔+ 𝒑𝒏−𝒓)𝒎𝒐𝒅𝑴, 𝒏 = 𝟏, 𝟐, … ; 𝟎 < 𝒔 < 𝒓 (4.4)

Strona 40 z 162

Zasada działania opóźnionego generatora Fibonacciego LFG (ang. Lagged Fibonacci Generator) opiera się na sumowaniu dwóch elementów, które są poprzednimi wynikami ciągu wyjściowego. Dlatego generator ten nazywany jest generatorem Fibonacciego, natomiast przymiotnik opóźniony odnosi się do modyfikacji polegającej na przesunięciu tych elementów o s i r względem bieżącego.

Nietrudno zauważyć, że opóźniony generator Fibonacciego stanowi szczególny przypadek wielokrotnie rekursywnego generatora linowego, dla którego parametry as = an = 1 i a = 0 dla n nie należące do (s, r). Odpowiednio dobrane parametry pozwalają na uzyskanie maksymalnego okresu tego generatora równego (2𝑟 – 1) ∗ 2𝑙−1, gdzie M = 2l [39].

Opóźniony generator Fibonnaciego został uogólniony poprzez zastąpienia operatora dodawania inną operacją:

𝒑𝒏 = (𝒑𝒏−𝒔 𝒐𝒑 𝒑𝒏−𝒓)𝒎𝒐𝒅𝑴, 𝒏 = 𝟏, 𝟐, … ; 𝟎 < 𝒔 < 𝒓 (4.5) gdzie op może być: +, -, * lub XOR.

Dla operatora „-” maksymalny okres jest identyczny jak dla operatora „+”, natomiast dla „*”

wynosi (2𝑟 – 1) ∗ 2𝑙−3, gdzie M = 2l, a dla XOR 2𝑟− 1 [40].

Aby uzyskać maksymalny okres, wielomian, którym można opisać generator powinien być wielomianem pierwotnym (modulo 2).

Generator LFG wymaga ostrożnego dobrania opóźnień, gdyż mają one znaczący wpływ na okres wytwarzanego ciągu oraz jego własności statystyczne [40]. Ze względu na wykonywanie obliczeń na liczbach wytworzonych wcześniej, generator ten wymaga większych zasobów pamięci niż liniowe generatory kongruencyjne.

4.1.4 Generatory Add-with-Carry, Subtract-with-Borrow, Multiply-with-Carry

W 1991 Marsaglia i Zaman [41] zaproponowali dwa generatory, które swoją konstrukcją nawiązują do opóźnionego generatora Fibonacciego. Są to:

 generator oparty o operację dodawania z przeniesieniem AWC (ang. Add with Carry),

 generator oparty o operację odejmowania z pożyczeniem SWB (ang. Subtract with Borrow).

Generatory zdefiniowane są przez następujące równania:

Strona 41 z 162

𝒑𝒏 = (𝒑𝒏−𝒔 + 𝒑𝒏−𝒓+ 𝒄𝒏)𝒎𝒐𝒅𝑴, 𝒏 = 𝟏, 𝟐, … ; 𝟎 < 𝒔 < 𝒓 (4.6) dla generator AWC oraz:

𝒑𝒏 = (𝒑𝒏−𝒔 − 𝒑𝒏−𝒓− 𝒄𝒏)𝒎𝒐𝒅𝑴, 𝒏 = 𝟏, 𝟐, … ; 𝟎 < 𝒔 < 𝒓 (4.7) dla generatora SWB, gdzie c1 = 0, natomiast dla n > 1, cn jest równe 0 jeśli w poprzedniej iteracji nie było przekroczenia zakresu (M dla sumowania i 0 dla odejmowania) lub 1 w przeciwnym wypadku.

Generatory (4.6) i (4.7) cechuje bardzo długi okres wytwarzanych ciągów. Dla generatora AWC maksymalny możliwy okres wynosi 𝑀𝑟+ 𝑀𝑠− 2 i jest osiągany pod warunkiem, że [41]:

 𝐿 = 𝑀𝑟+ 𝑀𝑠− 1 jest liczbą pierwszą,

𝑀 jest elementem pierwotnym modulo L.

W przypadku generatora SWC, maksymalny okres wynosi 𝑀𝑟− 𝑀𝑠 i jest osiągany po spełnieniu analogicznych warunków jak w przypadku generatora AWC. Szczegółową analizę długości okresu generatora SWB można znaleźć w pracy [37].

W 1993 roku Tezuka, L’Ecuyer oraz Couture dowiedli, że ciągi wytwarzane przez generatory AWC i SWB są zasadniczo równoważne do sekwencji z LCG z bardzo dużym M [42]. Mogą więc służyć jako alternatywna metoda ich implementacji. Rok później, Marsaglia zaproponował rozszerzoną wersję generatora AWC, nazwaną MWC (ang. Multiply-with-Carry) [43]:

𝒑𝒏 = (𝒂 ∗ 𝒑𝒏−𝒓+ 𝒄𝒏)𝒎𝒐𝒅𝑴, 𝒏 = 𝟏, 𝟐, … ; 𝒓 > 𝟎 (4.8) Spoglądając na wzór (4.8), można odnieść wrażenie, że jest to generator LCG. W zasadzie jedyną różnicą jest to, że cn jest zmienną, która przyjmuje wartość:

𝒄

𝒏

= ⌊

𝒂∗𝒑𝒏−𝒓+𝒄𝒏−𝟏

𝑴

(4.9)

Tak mała różnica powoduje znaczną poprawę własności statystycznych wytwarzanych ciągów w stosunku do generatora MCG z takimi samymi parametrami a oraz M [41].

Generator MWC może wytwarzać ciąg o maksymalnej długości wynoszącej 𝑙 − 1 , gdzie 𝑙 = 𝑎 ∗ 𝑀𝑟− 1. Aby wytworzyć m-ciąg, parametr a powinien być pierwiastkiem pierwotnym modulo l.

Strona 42 z 162

Kolejną modyfikacją MWC jest komplementarny generator MWC (CMWC) zaproponowany w 2003 roku przez M. Goreskyego i A. Klappera [44]. Generator CMWC opisuje równanie:

𝒑𝒏 = (𝑴 − 𝟏) − (𝒂 ∗ 𝒑𝒏−𝒓+ 𝒄𝒏)𝒎𝒐𝒅𝑴, 𝒏 = 𝟏, 𝟐, … ; 𝟎 < 𝒓 (4.10) gdzie wartość 𝑐𝑛 jest obliczana ze wzoru (4.9), czyli jak w przypadku generatora MWC.

Wprowadzenie małej modyfikacji pozwala na łatwiejsze znalezienie parametrów konstrukcyjnych, gwarantujących uzyskanie maksymalnego okresu ciągu wejściowego, który w przypadku generatorów CMWC wynosi 𝑎 ∗ 𝑀𝑟.

4.1.5 LFSR (generator Tausworthe’a)

Generator LFSR zwany też Generatorem Tausworthe’a [45], czyli rejestr przesuwny

Generator LFSR zwany też Generatorem Tausworthe’a [45], czyli rejestr przesuwny

Powiązane dokumenty