Uwaga
Lepsza wersja! http://jaktodziala.eu/Rozdz. 8 Ostateczna wersja rejestru CRCPod rejestrem
CRC są "fotografie" 9 stanów rejestru
CRC i
Dzielna + 3 zera dla dzielnej
100011. Jest to powtórzony rys. 14.2 z
części 1 artykułu.
Zrób schemat rejestru
CRC w/g poniższego przepisu "na małpę", a układ na pewno obliczy resztę z wprowadzonej
dzielnej ( oczywiście z 3 dodatkowymi zerami) przez dzielnik
1011. Słowo harcerza.
1 - Napisz dzielnik
2 - Wstaw między bity dzielnika przerzutniki typu
D (D2, D1, D0)3 - Dokończ schemat, tak jak na rys. 15
Rys. 15 Rejestr CRCAnalogicznie możesz zbudować
CRC dla dowolnego dzielnika. np
1011011000010101. Ważne tylko, żeby dzielnik zaczynał i kończył się
jedynką.
Pierwsze pytanie. A gdzie
ROM dzielnika? Odpowiedź- Jest ujęty w sprzężeniu zwrotnym zawierającym (lub nie)
xor-y. Super. Z układu znika
ROM.
Gdy "małpa" wystarczy - przejdź do rozdziału
9.
Gdy nie - dokończ rozdz.
8.
Najpierw o samym DRys.15.1 Przerzutnik typu D Narastające zbocze zegara (czerwone) zapamiętuje wejście
x gdzieś wewnątrz przerzutnika
. Opadające zbocze zegara (zielone) odtwarza ten stan na wyjściu
D przerzutnika. Czyli wyjście przerzutnika odtwarza stan wejścia z opóźnieniem impulsu zegarowego. Opóźnienie umożliwia realizację takich układów, jak np. rys. 15, w których na wejście mogą wchodzić sygnały zależne (tu pośrednio) od wyjścia. Możliwy jest nawet pojedynczy przerzutnik typu
D, którego wyjście (ale w stanie
następnym), zależy od tego wyjścia
D (ale w stanie
aktualnym) i od wejścia
x przerzutnika (też w stanie
aktualnym). Przykład tego znajdziesz dalej na rys. 23.
Analiza układu na rys. 15, gdy
dzielną + 3 zera jest
100011000.
Gdy wyjście D2=0 to
D1 i
D0 oraz
D0 i
komunikat będą miały bezpośrednie połączenie. Takie same jak
D2 i
D1. Dlatego że
0 XOR x =
x. Patrz rozdz. 5 cz. 1. Czyli w następnym okresie
CRC będzie zachowywał się jak zwykły rejestr przesuwny.
W stanie
0 D2=
0. Czyli następny stan
1 to przesunięte bity D1, D0 i najstarszy bit komunikatu
1, czyli
001W stanie
1 D2=
0. Czyli następny stan
2 to przesunięte bity D1, D0 i najstarszy bit komunikatu
1, czyli
010W stanie
2 D2=
0. Czyli następny stan
3 to przesunięte bity D1, D0 i najstarszy bit komunikatu
1, czyli
100 W stanie
3 D2=
1. Czyli następny stan
4 to....??? No właśnie jaki będzie ten stan
4?
Teraz: na
wejście D2 wchodzi
D0 (bezpośrednie połączenie)
na
wejście D1 wchodzi
1 XOR
D0 czyli
Negacja D0na
wejście D0 wchodzi
1 XOR
komunikat czyli
Negacja komunikatDokończmy więc przerwane wyżej zdanie.
W stanie
3 D2=
1. Czyli następny stan
4 to
011 Wyjaśnienie dla stanu 4D2=
0 bo w poprzednim stanie
3 D1=
0 a między D2 i D1 jest zwykłe połączenie
D1=
1 bo w poprzednim stanie
3 D0=
0 a na D1 wchodzi
Negacja (
D0=0), czyli
1D0=
1 bo w poprzednim stanie
3 komunikat=
0 a na D0 wchodzi
Negacja (
komunikat=0), czyli
1Jedziemy dalej:
W stanie
4 D2=
0. Czyli następny stan
5 to przesunięte bity D1, D0 i najstarszy bit komunikatu
1, czyli
111 ....
W ten sposób dojdziemy do stanu końcowego
CRC =
111 Czyli
111 jest resztą z dzielenia
100011 przez
1011Może to było mętne. W każdym bądź razie starałem się przekonać,że układ z rys. 15 oblicza resztę z dzielenia.
Rozdz. 9 Nadajnik-Odbiornik z CRC .
WstępPrzedstawione niżej rys.
17...21 zawierają wszystkie stany
Nadajnika wysyłającego do
Odbiornika komunikat
100011 wykorzystując dzielnik
1011 do wykrywania błędów. Przypomnę tylko, że dzielnik ten jest ujęty w strukturze rejestru
CRC-N nadajnika i w
CRC-O odbiornika-->
rys. 16.Rysunek ten przedstawia schemat dokładny i uproszczony. Dalej będą używane tylko schematy uproszczone
CRC (
CRC-N dla Nadajnika i
CRC-O dla Odbiornika). Gdy na torze między nadajnikiem i odbiornikiem (np w kablu) nie wystąpiły przekłamania, to
w każdym stanie wartości rejestrów CRC-N i CRC-O są takie same, co łatwo zauważyć. Stany
0...9 odpowiadają stanom
0...9 z
rys. 15. W stanie
9 w rejestrach tych będzie ta sama wartość, reszta z dzielenia
100011:1101 równa
111. Następnie w stanach
10,11,12 wartość z
CRC-N wprowadzana jest do
CRC-O, w celu ich porównania.
W stanie
12 wartość
CRC-O = 000, co oznacza, że nie wystąpiły błędy transmisji. Puste bity na rysunkach, oznaczają że nic do nich nie zostało jeszcze wpisane, albo że nie mają już żadnego znaczenia. Gdybym wpisał tam np. zera, to trudniej byłoby zauważyć, jak
"bity przesuwają się" w każdym stanie.
Rysunki
17...21 są podobne do rys.
1,2 lub
3,4. z części 1. Drobne różnice wynikają z tego, że na rys.
1,2 lub
3,4 obowiązuje reszta
zwykłego dzielenia, a na rys.
17...21 obowiązuje reszta z dzielenia
xor-owego.
Rys.16 Rejestr CRC schemat dokładny i uproszczonyRys. 17 Nadajnik-Odbiornik stany 0,1,2Stan 0 Rejestr Nadajnika
RN zawiera komunikat do wysłania
+3 zera tj.
110101000. Rejestry
RN i
RO są zawsze rejestrami przesuwnymi.
W stanach
0,1,2 rejestry
CRC-N i
CRC-Ozachowują się bardzo miło. A to dlatego że jedynka nie dotarła jeszcze do najstarszego bitu. Ponieważ w najstarszym bicie jest
0, to zgodnie z algorytmem (rys. 15) w następnym stanie bity w rejestrach będą tylko przesunięte. W stanie
3 jedynka co prawda już dotarła do najstarszego bitu
CRC-N i
CRC-O. Ale dopiero w następnym stanie
4, zgodnie z algorytmem, po przesunięciu , nastąpi
xor-owanie odpowiednich bitów. Dlatego rejestry
CRC-N i
CRC-O do końca stanu
3, zachowują się jak zwykłe rejestry przesuwne. Stan wszystkich rejestrów zależy też od położeń przełączników
K1 i K2. Dotyczy to wszystkich rysunków
17...21.
stan 1 - jako następny po
stanie 0 --> rys. 15
stan 2 - jako następny po
stanie 1 --> rys. 15
stan 3 - jako następny po
stanie 2 --> rys. 15
Rys. 18 Nadajnik-Odbiornik stany 3,4,5Od tej pory rejestry mogą być tylko przesunięte lub przesunięte i
xor-owane . Już nie jest tak miło jak w stanach
0,1,2.
stan 3 - jako następny po
stanie 2 --> rys. 15
stan 4 - jako następny po
stanie 3 --> rys. 15
stan 5 - jako następny po
stanie 4 --> rys. 15
Rys. 19 Nadajnik-Odbiornik stany 6,7,8stan 6 - jako następny po
stanie 5 --> rys. 15
Cały komunikat
100011 został już przesłany do
RO. Nie ma sensu przesyłania
000. Dlatego pod koniec tego stanu zmieni się położenie przełącznika
K1. Do końca transmisji zawartość
RO nie ulegnie zmianie. Następnie będą modyfikowane tylko
CRC-N i
CRC-O. Będą też "znikać" zera w
RN.
stan 7 - jako następny po
stanie 6 --> rys. 15 (widać zmienione
K1)
stan 8 - jako następny po
stanie 7 --> rys. 15
Rys. 20 Nadajnik-Odbiornik stany 9,10,11 stan 9.. - jako następny po
stanie 8 --> rys. 15
W
CRC-N i
CRC-O jest już ostatecznie obliczona ta sama reszta z dzielenia
111.
Ta sama-tzn. że na kablu
Nadajnik-
Odbiornik nie było zakłóceń. W następnych stanach
10,11,12 Odbiornik będzie sprawdzał, czy rzeczywiście są takie same. Dane z
CRC-N w
Nadajniku będą więc wprowadzane do
CRC-O w
Odbiorniku i porównywane
bit po bicie.Pod koniec stanu
9 zmieni się położenie
K2. W następnych stanach
10,11,12 najstarszy bit
CRC-N będzie wprowadzany do najmłodszego bitu
CRC-Ostan 10 - jako następny po
stanie 9 Widać zmienione położenie
K2. Pojawił się też dodatkowy niebieski bit, do którego będzie wprowadzany najstarszy bit z
CRC-O. Jednocześnie do najmłodszego bitu
CRC-O będzie wprowadzony najstarszy bit z
CRC-N i
natychmiast porównany z bitem niebieskim. Czyli będą porównane 2 najstarsze bity z
CRC-N i
CRC-O ze stanu poprzedniego.
Porównanie czyli
xor-owanie. Ponieważ były takie same, to w najmłodszym bicie
CRC-O będzie
0.
stan 11 - jako następny po
stanie 10.
Porównane będą 2 następne bity z
CRC-N i
CRC-O. Wynik (
0) wpisany będzie do najmłodszego bitu
CRC-O.
Rys. 21 Nadajnik-Odbiornik stany 12 - ostatnistan 12 - ostatni - jako następny po
stanie 11 Porównane będą 2 następne bity z
CRC-N i
CRC-O. Wynik (
0) wpisany będzie do najmłodszego bitu
CRC-O.
KONIEC!!!--ZWYCIĘSTWO. Rejestr
CRC-O =
000 oznacza, że
(z pewnym prawdopodobieństwem!) nie było błędów transmisji. Dlaczego
z pewnym prawdopodobieństwem? Mogło tak się zdarzyć, że były zakłócenia na linii, ale przypadkowo "zakłócona" liczba (inna niż nadana!) dała taką samą resztę resztę jak liczba nadana.
Podsumowanie:Każdorazowemu wprowadzeniu bitu z
RN do
RO towarzyszą aktualizacje rejestrów
CRC-N w nadajniku i
CRC-O w odbiorniku. Jeżeli na kablu
Nadajnik-Odbiornik nie było zakłóceń, to w każdej chwili
CRC-N =
CRC-O . Gdy cały komunikat znajdzie się w
RO to
CRC-N =
CRC-O =
111. W 3 następnych krokach porównujemy zawartości tych rejestrów. Końcowy stan
CRC-O = 000 oznacza, że nie było błędów.
Można zaproponować pewna modyfikację wyżej opisanej metodyWróć na chwilę do rys.
14.3 w rozdz. 8. Gdybyśmy jakimś cudem w stanie
0 znali
resztę = 111 i wstawili ją jako
111 , zamiast
000, to w stanie
9 będzie
CRC = 000. Można teraz zaproponować 2 wersje zmodyfikowanej metody.
Metoda nr 1 Prymitywna. Są 2 cykle. W pierwszym cyklu obliczymy resztę
111. Drugi cykl, to powtórzony pierwszy tylko zamiast
000 damy resztę
111. Obliczona w 2 cyklu reszta =
000, oznacza że nie było błędów. Podstawowa wada, to 2 razy wydłużony czas transmisji.
Metoda nr 2 Zauważmy, że
CRC w stanach 0...6 na rys.
14.2 i 14.3 nie różnią się. Jest to oczywiste, bo 3 ostatnie bity
000 lub
111 jeszcze nie dotarły do
CRC. Zapamiętajmy więc stan
CRC w stanie
6 w jakimś rejestrze pomocniczym. Potem w 3 krokach dojdziemy do staniu
9, w którym mamy obliczoną resztę
CRC=111. Teraz wprowadźmy z rejestru pomocniczego do
CRC ten zapamiętany stan
6 (
CRC=100). Czyli sztucznie wróciliśmy do stanu
6. Zaś do rejestru
Dzielna + 3 zera wprowadzimy resztę
111 (którą już znamy!). Dojdziemy do stanu końcowego
CRC = 000. Oznacza ,że transmisja była bezbłędna! I zrobiliśmy to tylko w
jednym cyklu. Co prawda, wydłużonym o 3 dodatkowe kroki. Nie będę analizował elektroniki dla zmodyfikowanej metody a ściślej dla metody nr 2 .Chyba jest trochę bardziej skomplikowana niż na rys.
17...21Rys. 22 Metoda zmodyfikowana Rozdz. 10 Takie sobie rozważania o dzielnej, dzielniku i rejestrze CRCCzęsto słyszymy coś takiego. Komunikat ma 10 000 bitów. Wystąpiły przekłamania tylko na 2 pozycjach bitowych tego komunikatu.
Dany algorytm ze 100% pewnością wykrywa te przekłamania. Tu powinna się zapalić czerwona lampka. Przecież nie ma rzeczy w 100 % pewnych. Nie mam przecież 100% pewności, że jutro nie zapuka do mnie Jej Wysokość Królowa Elżbieta II i powie "hello". Prawdopodobieństwo że takie zdarzenie zajdzie (tzn. jutro ta pani nie zapuka) to jest 99,99999999999...%. Ale nie 100%. Dlatego zdanie o tych 2 przekłamaniach powinno brzmieć.
Dany algorytm ze 100% pewnością wykrywa te przekłamania powstałe na torze sygnałowym między Nadajnikiem i Odbiornikiem. Czyli milcząco zakładamy, że elektronika nadajnika i odbiornika realizuje ze 100% pewnością dany algorytm. Elektronika jak żona Cezara, jest poza wszelkimi podejrzeniami.
Poważni ludzie zamiast słowa
dzielna używają
komunikat lub
wiadomość lub
message. Tak samo zamiast
dzielnik mówią
wielomian generujący lub
generator. Nie znalazłem innych nazw dla rejestru
CRC, w którym będzie wynik
reszta z dzielenia. Tu liczę na pomoc czytelników.
Dzielnik może być przedstawiony, tak jak dotychczas, tzn. jako liczba binarna np.
Dzielnik =
1011. Symbol
1011 to skrócony zapis
1x
2^
3 +
1x
2^
1 +
1x
2^
0, gdzie
3 to nr najstarszego bitu, a
0 to nr najmłodszego. Nie powinienem tego pisać na szacownym forum, ale tak tylko sobie powiem, że
2^
0 =
1. Jest też inna forma przedstawiania dzielnika. Zamiast
Dzielnik =
1011, można napisać
Wielomian generujący =
x^
3 +
x^
1 +
1. Zauważ, że dla
x=
2 wartość tego wielomianu odpowiada dokładnie
1011=9.
Porozmawiajmy teraz o samym
dzielniku ( inaczej,
wielomianie generującym lub
generatorze). Jak go dobierać, jaka powinna być jego długość ...itp. Powinien zaczynać i kończyć się na
1. Czyli może to być np.
11,
101 lub
100001. Odpada za to
001 lub
00110100. Dlaczego? Chyba dlatego, że zera z lewej i prawej strony nie zawierają informacji ważnej dla obliczania reszty z dzielenia.
Zaczniemy od najprostszego
dzielnika=
11 lub inaczej
wielomian generujący =
x^
1 +
x^
0 =
x +
1. Odpowiada mu 1-bitowy rejestr
CRC.
Rys. 23 CRC dla dzielnika 11Rejestr
CRC został zrealizowany zgodnie z rys. 15. Nowy stan przerzutnika
D0 jest
xor-em z wejścia i poprzedniego stanu
D0. Gdy na wejściu jest
0 to stan się nie zmieni (jak było
0 to będzie
0, jak
1 to też
1). Gdy na wejściu jest
1, to stan zmieni się na przeciwny. W technice cyfrowej
toto nazywa się
dwójka licząca lub
przerzutnik typu T. Analizę pozostawiam Czytelnikowi.
To jest klasyczny układ z bitem parzystości! Rzeczywiście, zakładając że stanem początkowym jest
D0=0, to jeżeli nie było przekłamań to bit ten pozostanie też
0. Gdy nie ma błędów, to
(jednobitowe!) rejestry
CRC-N i
CRC-0, są zawsze takie same. Niestety, tu nie mamy pewności, że błędy nie wystąpiły. Po każdej parzystej liczbie błędów rejestry
CRC-N i
CRC-O też będą takie same. Czasami jednak korzystamy z takich układów. Np. gdy komunikaty są krótkie, lub wiemy z doświadczenia że układ jest pewny i rzadko występują przekłamania. Jeżeli już, to bardzo rzadko pojedyncze przekłamanie, a podwójne to "prawie nigdy".
Rys. 24 Przerywnik żartobliwy trochę - Inna realizacji dzielnika 11Żeby było jasne. Na górze widzisz paluszki projektanta. Tak wyglądał przerzutnik lampowy komputera z 1958 r. Taki mały, a przechowuje
cały jeden bit. Z wikipedii.
Dlaczego CRC mimo wszystko przepuszcza błędy? Odpowiedź jest prosta. Przecież
CRC oblicza resztę z dzielenia
komunikatu przez
wielomian generacyjny. Do znudzenia wałkowaliśmy przykład obliczania
reszty z dzielenia liczby
100011 przez
1011. Pamiętamy że reszta to
111. Jest to co prawda reszta z dzielenia
xor-owego, ale jest pełna analogia do dzielenia zwykłego. Np
327 :
13 =
25 reszta
2. Zauważ, że taką samą resztę otrzymamy gdy wykonamy
314 :
13 =
24 reszta
2, lub
301 :
13 =
23 reszta
2 itd. Gdyby więc na kablu
Nadajnik -
Odbiornik jakiś złośliwy chochlik podmienił wysyłane z
Nadajnika 327 na
314 lub
301 , to w
CRC-N nadajnika i w
CRC-O odbiornika byłyby takie same reszty
2. A ponieważ w
CRC-O występuje odjęcie tych wartości (patrz stany
10...12 w rozdz.
10), to nadajnik na podstawie
CRC-O = 000, wyciągnie fałszywy wniosek, że nie było błędów.
Jaki powinien być dzielnik, żeby przepuszczał najmniej błędów?Odpowiedź jest trudna. Z tego robi się doktoraty lub prace habilitacyjne. Tu pytanie do znawców tematu. Czy w ogóle ma ono sens?
Jaki wielomian generujący o danej ilości bajtów-1,2,3 lub 4, zapewnia najmniejszą liczbę błędów transmisj?. Byłem prawie pewien, że dla współczesnej matematyki to sprawa zamknięta. Jak twierdzenie Pitagorasa. Z internetu odniosłem jednak wrażenie, że temat stale się rozwija. Trafiłem na dyskusję z 2006 r gdzie bardzo poważni panowie, kłócili się czy ten wielomian jest lepszy czy inny. Z niecierpliwością czekam na jakiś komentarz, np biegłego magistranta. To teraz jako maluczki powiem to co wiem o
dzielniku, albo się domyślam.
1- Powinien zaczynać i kończyć się
jedynką - była o tym mowa wczęśniej
2- Im większy dzielnik tym mniej przepuszcza błędów. Wcześniej stwierdziliśmy, że dla np
327 :
13 resztą jest
2. Ta sama reszta
2 będzie też dla dzielnej
314,
301 i innych. Wystarczy więc zwiększyć ...
dzielnik np na
47, żeby dzielnych, które dają tę samą resztę (tu dla
327 :
47 =
6 reszta
45),
było mniej.
...
Wniosek - Większy dzielnik-->mniej błędów. W przypadku dzielenia
xor-owego jest jeszcze prościej. Więcej bitów ma dzielnik-->mniej błędów. To jest chyba pewne.
3 - Chociaż komunikat wysyłany jest
bit po bicie, to wiadomo że bity te zorganizowane w bajty. Dlatego dzielnik też będzie miał strukturę bajtową + 1 bit najstarszy. Dzięki temu nasz rejestr
CRC będzie miał pełne bajty. W praktyce 1,2 3 lub 4.
4- To teraz pytanie na deser. Jaki
dzielnik "4-bajtowy + 1 bit" (inaczej
wielomian generujący lub
generator) przepuszcza najmniej
dzielnych (komunikatów) które dają tę samą resztę. Inaczej - przepuszcza najmniej błędów.
Odpowiedź jest banalnie prosta. Jest to liczba
1.0000.0100.1010.0001.0001.1101.1011.0111. Dlaczego? Chyba każdy to widzi.
Oczywiście to żart!. Ale zastanawiam się jak ludzie do tego doszli? Przecież tu jest chyba ponad 4 miliardy kombinacji. Czy poprzez twierdzenia algebry wyższej? A może symulacje. Sprawdzamy wszystkie możliwe 33 bitowe kombinacje, przy wszystkich kombinacjach komunikatów o długości np. 1024 bajty. Może wystarczą krótsze np. 128 bajtów? I wybierzemy taką, która daje najmniej reszt. Może to jest właśnie ta w/w liczba? Może ktoś rozwinie ten temat? Tak przy okazji. Używasz tego
dzielnika codziennie jako wielomian używany w standarcie ETHERNET tzw CRC-32.
Postać wielomianowa dzielnika
CRC-32 = x^32 + x^26 +x^22 + x^16 + x^12 + x^11 + x^10 + x^8 +x^7 ++ x^5+ x^4 + x^2 + x + 1. Aby zbudować rejestr
CRC dla tego wielomianu wystarczy oczywiście skorzystać z rys. 15. Tu już nie żartuję.
Podam jeszcze 2 często używane wielomiany generujące
Wielomian używany przez protokoł HDLC
CRC-16 = x^16 + x^15 + x^2 + 1Standart CCITT CRC-CCITT = x^16 + x^12 + x^5 + 1Nie jestem tego pewien, ale
CRC na rys. 23 to realizacja wielomianu
CRC-2 = x+1 . Mądrych ludzi proszę o potwierdzenie. Jeżeli takowego nie ma, to zdanie to traktuj z przymrużeniem oka!
NAJWAŻNIEJSZE - JAKA JEST SKUTECZNOŚĆ WYKRYWANIA BŁĘDÓW!!!!Znalazłem coś takiego dla
CRC-16Metodą CRC-16 można wykryć :
- wszystkie
pojedyncze błędy transmisji (błędy tylko w jednym bicie) -
komentarz - Nic wielkiego,to robi głupi przerzutnik na rys. 23!
- wszystkie
podwójne błędy -
komentarz - Nie rzuca na kolana, ale może być
- wszystkie błędy
w nieparzystej ilości bitów
- wszystkie błędy w bloku do 16 bitów
-
99,9984% pozostałych błędów transmisji.
I to jest samo miodzio - bardzo ważna informacja. Nie wiem czy mam rację, ale podejrzewam że 0,0016% błędów wiąże się "z tymi samymi resztami" omówionymi wcześniej.
Nie znalazłem danych dotyczących
CRC-32. Podejrzewam, że jako metoda używająca 2 razy większego
dzielnika będzie dużo lepsza od
CRC-16.
Jeszcze taki mały paradoks. Zauważ że
CRC-16 wykrywa w 100% błędy transmisji, które "tylko trochę" zniekształcają informację wyjściową np. w 1 bicie lub kilku. Jest to oczywiste. Przypominam że w
CRC siedzi reszta z dzielenia
komunikatu (liczby którą Nadajnik wysyła do Odbiornika) przez jakiś
dzielnik. Nie jest to zwykłe dzielenie, ale
xor-owe. Nie mniej jednak efekty tych
dzieleń (
"zwykłych" i
xor-owych) są podobne. Wiadomo że np. reszta z dzielenia np.
578:19 to
8. (578=19x30 +
8). Zauważ jednak że ta sama reszta =
8, będzie też przy wysyłanym komunikacie
559,
540,
521...
46,
27 i
8. Czyli gdyby komunikat został "zniekształcony" do w/w liczb to byłaby ta sama reszta
8 i Odbiornik potraktujemy odebrany komunikat jako bezbłędny. To gdzie ten paradoks? No właśnie. Gdy zniekształcenie jest małe, np Odbiornik odebrał liczbę
576 (zamiast
578, to na 100% błąd ten będzie wykryty, bo na 100% będzie inna reszta. Gdy zniekształcenie jest duże (w krańcowym wypadku zupełnie przypadkowa liczba) to odbiornik wykryje ten błąd, ale z prawdopodobieństwem np.
99,99%, a nie
100%. To
0,01% to wtedy, gdy przypadkowo reszta będzie taka sama, chociaż komunikat będzie zupełnie inny.
Gdyby te reguła obowiązywał w życiu codziennym, to na 100% odróżnimy strongmana Pudzianowskiego od jego podobnego brata bliźniaka (gdyby miał takowego), ale tylko na 99,99% od jakiegoś przedszkolaka.
Rozdz. 11 Prawdziwy Nadajnik-Odbiornik z CRCRys. 25 jest uogólnieniem
rys.17...21 z
rozdz. 10Różnice są następujące
Rys. 17...21 - 1 komórka oznacza
1 bitRys. 25 - 1 komórka oznacza
1 bajt (oprócz komórki "niebieskiej" w stanach
10...12, która jest
bitem)
Rys. 17...21 -
RN dla komunikatu
6-bitowego +
3 zeraRys. 25 -
RN dla komunikatu
1020-bajtowego +
4 bajtowe zera (czyli 8160 bitów +
32 zera)
Rys. 17...21 -
RO dla komunikatu
6-bitowego Rys. 25 -
RO dla komunikatu
1020-bajtowego + (czyli 8160 bitów)
Rys. 17...21 CRC-N i
CRC-O 3-bitowe realizujące dzielnik =
1011Rys. 25 CRC-N i
CRC-O 4-bajtowe (32-bitowe) realizujące dzielnik
CRC-32 =
1.0000.0100.1010.0001.0001.1101.1011.0111Wspólnymi cechami dla rys. 17...21 i 25 są:- transmisje między rejestrami są takie same
tzn. po jednym bicie!- "niebieska"
jednobitowa komórka jako przedłużenie rejestru
CRC-O-
gdy na kablu Nadajnik-Odbiornik nie ma zakłóceń, to w każdym stanie w rejestrach CRC-N i CRC-O są takie same wartości!rys. 25 Nadajnik-Odbiornik z 4-bajtowym CRC i z 1020-bajtowym komunikatemRys. 17...21 odnoszą się do sytuacji "dydaktycznej", gdzie komunikat miał tylko 6 bitów. Dlatego bez problemu można było przedstawić "fotografie" wszystkich 12 stanów.
Rys. 25 dotyczy komunikatu o długości 8160 bitów nie mówiąc już o 32 zerach. Trudno byłoby przestawić 8192 "fotografii" dla wszystkich stanów. Okazuje się, że można to zrobić na 3 "fotografiach", jak na
rys. 25. Każdej fotografii przyporządkowany jest symbol
0...6,
7...9 lub
10...12.
Stanom
0...6 na
rys. 25 odpowiadają te stany na
rys. 17...19Stanom
7...9 na
rys. 25 odpowiadają te stany na
rys. 19...20Stanom
10...12 na
rys. 25 odpowiadają te stany na
rys. 20...21Opis poszczególnych stanów na rys. 25 Uwaga - komórki to
bajty a nie
bity (oprócz "niebieskiej", która jest bitem)
Stany 0...6 - Przesuwanie komunikatu z
RN do
RO. Aktualizacje
CRC-N i CRC-O.
Stan 0 RN komórki 0...3 -
4 x zero (czyli
32 zerowe bity)
RN komórki 4...1019 -
komunikat CRC-N i CRC-O - wyzerowane
Stany 1...5W tych stanach komórki będą stopniowo wprowadzane z
RN do
RO,
CRC-N i
CRC-O. W każdym kroku będą odpowiednio modyfikowane rejestry
CRC-N i
CRC-O. Rejestr
RO będzie się "wydłużał" do lewej strony a rejestr
RN będzie się skracał z prawej strony.
Stan 6 RN - tylko 4 najstarsze komórki -
4 x zero (czyli
32 zerowe bity), pozostałe nieistotne
RO -
Komunikat zajmuje cały rejestr. Ze względu na stan przełącznika w stanach 7...12,tak będzie już do końca.
CRC-N i CRC-O - takie same wartości.
Stany 7...9 - Komunikat w
RO ustalony. Tylko aktualizacje
CRC-N i CRC-O.
W stanie
9 w
CRC-N i CRC-O są już
te same, ostatecznie obliczone wartości
reszt.
Stany 10...12 - Komunikat w
RO ustalony. Porównywanie wartości w
CRC-N i CRC-O.
"Niebieski" bit pełni dokładnie taką samą rolę w porównywaniu, jak na
rys. 20, 21 w stanach
10...12W stanie końcowymRN - "pusty" (zera albo nieistotne)
R0 - komunikat
CRC-N - "pusty" (zera albo nieistotne)
CRC-O - gdy nie było błędów -->
wyzerowany........- gdy były-->wartość
niezerowaGdy
Odbiornik na podstawie
CRC-O stwierdzi, że były błędy, to może zażądać od
Nadajnika ponownego przesłania komunikatu.
Rozdz. 12 Programowe obliczanie reszty CRC - metoda SIMPLE (1-bitowa)Do tej pory reszta była obliczana w
CRC metodą bit po bicie. Przy okazji proszę zwrócić uwagę jak prosty jest ten hardware (rys. 15). Nawet gdyby realizowany był wielomian
CRC-32. Rysunek miałby wtedy 32 przerzutniki D i inną konfigurację
xor-ów. Też byłby to w miarę prosty układ, który jednak potrafi obliczyć resztę z dzielenia np. liczby 1000 bajtowej przez 4 bajtową. I to prawie nie opóźniając transmisji. A co zrobić gdy nasz mikrokontroler nie ma wbudowanego mechanizmu
CRC? Jedyne wyjście to metody
programowe. Zaczniemy od metody
SIMPLE. Jest to bezpośrednia realizacja programowa algorytmu "rejestrowego". Jedynego jakiego znamy do tej pory. Niestety, program bardzo zmniejsza prędkość transmisji, ponieważ realizowany jest metodą "bit po bicie".
Rys. 26 Jakie będzie CRC po wprowadzeniu 1 bitu?Rys. 26a - bit sterujący 0Lewa strona -wersja "rejestrowa" algorytmuDzielnik 1
011011. (Najstarszy bit zawsze 1, lecz tylko "czerwone" bity wpływają na algorytm)
Aktualny stan
CRC=011001 widoczny w górnym wierszu prostokąta (1 "czeka" na wejściu)
Bit sterujący (najstarszy)
CRC=0, dlatego bity będą tylko przesunięte w lewo.
Prawa strona - wersja "xor-owania pisemnego z 2 kreskami"Czyli inna wersja algorytmu dająca ten sam wynik.
Pod dolną kreską
0110011 CRC+"czekająca" jedynka. Nazwijmy to dzielną.
Bit sterujący
CRC=0, dlatego dzielną należy
xor-ować z przesuniętymi
000000 o 1 bit w prawo. Wynik widoczny nad górną kreską. Taki sam jak w dolnym wierszu prostokąta.
Rys. 26b - bit sterujący 1Lewa strona -wersja "rejestrowa" algorytmuAktualny stan
CRC=111001 widoczny w górnym wierszu prostokąta (1 "czeka" na wejściu)
Bit sterujący (najstarszy)
CRC=1, dlatego bity będą
- przesunięte w lewo (jak w dolnym wierszu prostokąta z lewej strony) a potem
-
xor-owane z czerwonymi bitami
011011 dzielnika (jak w dolnym wierszu prostokąta "środkowego")
Prawa strona - wersja "xor-owania pisemnego z 2 kreskami"Pod dolną kreską
0110011 CRC+"czekająca" jedynka. Nazwijmy to dzielną.
Bit sterujący
CRC=1, dlatego dzielną należy
xor-ować z przesuniętymi czerwonymi bitami
011011 dzielnika. Wynik widoczny nad górną kreską. Taki sam jak w dolnym wierszu prostokąta środkowego.
Uwaga Nazwa
"sterujący" najstarszego bitu
CRC jest chyba oczywista. Gdy
0 to tylko przesunięcie. Gdy
1 to przesunięcie +
xor-owanie z "czerwonymi" bitami dzielnika.
Rys. 26c - wersja "tablicowa" algoryrmuJest odpowiednikiem "
xor-owania pisemnego z 2 kreskami"
Lewa stronaW czarnym prostokącie jest aktualny stan
CRC=111001. Z prawej strony "czekająca" jedynka
Pod rejestrem tablica z wierszami o adresach 0 i 1
- wiersz o adresie 0 zawiera
000000- wiersz o adresie 1 zawiera
011011 (czerwone jedynki dzielnika)
Środek stronyBity w czarnym prostokącie + lewa jedynka są przesunięte w lewo. Tu sterujący bit
1 (najstarszy)
CRC został "wypchnięty" w lewo. Ponieważ bit sterujący =
1, to rejestr
CRC będzie
xor-owany z wierszem o adresie też
1. Wynik tego
xor-owania będzie widoczny na prawej stronie.
Prawa stronaOstateczny wynik operacji.
CRC = 001000Uwaga. Gdyby na początku (lewa strona) było
CRC=011001 , to bitem sterującym będzie
0. Wtedy po przesunięciu
CRC będzie
xor-owane z zawartością wiersza o adresie
0. Czyli wynikiem będzie
110011.
Zarys programu obliczającego resztę CRCNiniejszy program będzie obliczał resztę tak jak na rys. 15.
Tzn. Przesyłaną wiadomością jest
100011Dzielnikiem jest
1011Program w C-podobnym języku
bunga-bunga powinien policzyć resztę z dzielenia
100011:1011Wyzeruj rejestr CRC (3 bity)
Dopisz do wiadomości 3 zera - stan 0 na rys. 15
WHILE(jeszcze nie jest wprowadzona cała wiadomość z zerami){...
PRZESUŃ CRC o jeden bit w lewo i wprowadź najstarszy bit wiadomości z zerami do CRC...
IF(wychodzący bit jest 1) (XOR-uj CRC z 011)}Przetestuj ten program pomagając sobie rys.15, a przekonasz się że na końcu
CRC=111Rozdz. 13 Programowe obliczanie reszty CRC - metoda tablicowa ĆWIERĆBAJTOWA (2-bitowa)Od razu zastrzegam, że metoda ta nie jest (chyba?) stosowana w praktyce. Potraktujmy ją jako wstęp dla metody " prawdziwej" tj
tablicowej "BAJTOWEJ".
Z załączonego na końcu poprzedniego programu wynika, że wysłanie jednego bitu wymaga 2 instrukcji w języku wyższego poziomu niż assembler (np.
C). Odpowiadać to może, tu strzelę np. 10 instrukcjom maszynowym. Może trochę upraszczam, ale zakładając że transmisja jednego bitu odpowiada jednej instrukcji maszynowej, to od razu rzuca sie w oczy jak program może opóźniać transmisję! Jak zwiększyć "szybkość" programu? Nie trzeba być Eugeniuszem żeby zaproponować wprowadzanie dwóch bitów (ćwierćbajtu) jednocześnie do rejestru
CRC.
Przy wprowadzaniu do CRC 1 bitu tablica zawiera tylko 2 wiersze (rys. 26c). Pierwszy o adresie 0 gdy bitem sterującym jest 0 i drugi o adresie 1, gdy bitem sterującym jest 1.
Przy wprowadzaniu do CRC 2 bitów, będą odpowiednio 4 kombinacje bitów sterujących, czyli najstarszych 2 bitów rejestru CRC - 00, 01, 10 i 11. Czyli tablica będzie 4 wierszowa. W zależności od tych bitów, rejestr będzie odpowiednio przesuwał i (ewentualnie)
xor-ował swoje bity. Rozpatrzmy więc te 4 kombinacje.
Pierwsza kombinacja - bity sterujące 00Rys. 27 Jakie będzie CRC po wprowadzeniu "ćwierćbajtu" (2 bitów)? - bity sterujące 00Rys. 27a - wersja algorytmu "rejestrowa" Dzielnik 1
011011. (Najstarszy bit zawsze 1, lecz tylko "czerwone" bity wpływają na algorytm)
Aktualny stan
CRC=001001 widoczny w górnym wierszu prostokąta (
01 "czeka" na wejściu). Bit sterujący (najstarszy)
CRC=0, dlatego bity będą tylko przesunięte w lewo.Efekt
010010 widać w środkowym wierszu. Tu znowu bit sterujący
CRC=0. Bity ponownie będą tylko przesunięte w lewo. Efekt
100101 widać w dolnym wierszu.
Akurat w powyższym przykładzie 2 pierwsze bity to
00. Dlatego zmiany w
CRC to tylko 2 przesunięcia bez
xor-owania.
Rys. 27b - Wstępna wersja algorytmu "xor-owania pisemnego z 2 kreskami" Aktualny stan + 2 bity "czekające"
CRC=00100101 pod dolną kreską.
bity
000000 nad kreską odpowiadają pierwszemu przesunięciu. Następne
000000 drugiemu. Po
xor-owaniu ostatnich 6 bitów (pod dolną kreską) z 2 wierszami, nad górną kreską otrzymamy
100101 - to samo co w dolnym wierszu prostokąta z rys. 27a.
Rys. 27c - Ostateczna wersja algorytmu "xor-owania pisemnego z 2 kreskami" Bity
000000 są wynikiem sumowania 2 wierszy
000000 na rys. 27b. Czyli
100101 nad górną kreską jest
xor-em z
100101 i
000000. Wynik oczywiście taki sam jak na rys. 27a.
Rys. 27d Wersja tablicowa algorytmu dla bitów sterujących 00 - stan początkowyW czarnym prostokącie jest początkowy stan rejestru
CRC=001001 + 2 bity "czekające"
01. Z bitami sterującymi
00 związany jest wiersz o adresie też 00, zawierający
000000Rys. 27e Wersja tablicowa algorytmu dla bitów sterujących 00 - stan pośredniBity w rejestrze należy przesunąć o 2 pozycję w lewo. Następnie rejestr
xor-ujemy z wierszem tablicy o adresie 00. czyli z
000000. Wynik tego działania będzie widoczny na rys. 27f
Rys. 27f Wersja tablicowa algorytmu dla bitów sterujących 00 - stan końcowyTaki sam wynik jak na rys. 27a.
Druga kombinacja - bity sterujące 01Rys. 28 Jakie będzie CRC po wprowadzeniu "ćwierćbajtu" (2 bitów)? - bity sterujące 01Rys. 28a - wersja algorytmu "rejestrowa" Dzielnik 1
011011.
Aktualny stan
CRC=011001 widoczny w górnym wierszu prostokąta (
01 "czeka" na wejściu). Bit sterujący (najstarszy)
CRC=0, dlatego bity będą tylko przesunięte w lewo.Efekt 110010 widać w środkowym wierszu. Ale teraz bit sterujący
CRC=1. Bity ponownie będą przesunięte w lewo a potem
xor-owane przez
011011. Efekt
111110 widać w dolnym wierszu.
Rys. 28b - Wstępna wersja algorytmu "xor-owania pisemnego z 2 kreskami" Aktualny stan + 2 bity "czekające"
CRC=01100101 pod dolną kreską. Bity
000000 nad kreską odpowiadają pierwszemu przesunięciu. Następne - przesunięciu i
xor-owaniu przez
011011. Po
xor-owaniu ostatnich 6 bitów (pod dolną kreską) z 2 wierszami, nad górną kreską otrzymamy
111110 - to samo co w dolnym wierszu prostokąta z rys. 28a.
Rys. 28c - Ostateczna wersja algorytmu "xor-owania pisemnego z 2 kreskami" Bity
011011 są wynikiem
xor-owania wierszy
000000 i
011011 na rys. 28b. Czyli
111110 nad górną kreską jest
xor-em z
100101 i
011011. Wynik oczywiście taki sam jak na rys. 28a.
Rys. 28d Wersja tablicowa algorytmu dla bitów sterujących 01 - stan początkowyW czarnym prostokącie jest początkowy stan rejestru
CRC=011001 + 2 bity "czekające"
01. Z bitami sterującymi
01 związany jest wiersz o adresie też 01, zawierający
011011.
Rys. 28e Wersja tablicowa algorytmu dla bitów sterujących 01 - stan pośredniBity w rejestrze należy przesunąć o 2 pozycję w lewo. Następnie rejestr
xor-ujemy z wierszem tablicy o adresie 01. Wynik tego działania będzie widoczny na rys. 28f
Rys. 28f Wersja tablicowa algorytmu dla bitów sterujących 01 - stan końcowyTaki sam wynik jak na rys. 28a.
Trzecia kombinacja - bity sterujące 10Rys. 29 Jakie będzie CRC po wprowadzeniu "ćwierćbajtu" (2 bitów)? - bity sterujące 10Rys. 29a - wersja algorytmu "rejestrowa" Dzielnik 1
011011.
Aktualny stan
CRC=101001 widoczny w górnym wierszu prostokąta (
01 "czeka" na wejściu).Bit sterujący
CRC=1. Bity będą przesunięte w lewo, a potem
xor-owane przez
011011. Efekt 001001 widać w środkowym wierszu. Ale teraz bit sterujący (najstarszy)
CRC=0, dlatego bity będą tylko przesunięte w lewo.Efekt
010011 widać w dolnym wierszu.
Rys. 29b - Wstępna wersja algorytmu "xor-owania pisemnego z 2 kreskami" Aktualny stan + 2 bity "czekające"
CRC=01100101 pod dolną kreską. Bity
011011 nad kreską odpowiadają pierwszemu przesunięciu i
xor-owaniu przez
011011. Następne
000000 - tylko przesunięciu. Po
xor-owaniu ostatnich 6 bitów (pod dolną kreską) z 2 wierszami, nad górną kreską otrzymamy
010011 (to samo co w dolnym wierszu prostokąta z rys. 29a).
Rys. 29c - Ostateczna wersja algorytmu "xor-owania pisemnego z 2 kreskami" Bity
011011 są wynikiem
xor-owania wierszy
011011 i
0000000 na rys. 29b. Czyli
010011nad górną kreską jest
xor-em z
100101 i
110110. Wynik oczywiście taki sam jak na rys. 29a.
Rys. 29d Wersja tablicowa algorytmu dla bitów sterujących 10 - stan początkowyW czarnym prostokącie jest początkowy stan rejestru
CRC=101001 + 2 bity "czekające"
01. Z bitami sterującymi
10 związany jest wiersz o adresie też 10, zawierający
110110.
Rys. 29e Wersja tablicowa algorytmu dla bitów sterujących 10 - stan pośredniBity w rejestrze należy przesunąć o 2 pozycję w lewo. Następnie rejestr
xor-ujemy z wierszem tablicy o adresie 10. Wynik tego działania będzie widoczny na rys. 29f
Rys. 29f Wersja tablicowa algorytmu dla bitów sterujących 10 - stan końcowyTaki sam wynik jak na rys. 29a.
Czwarta kombinacja - bity sterujące 11Rys. 30 Jakie będzie CRC po wprowadzeniu "ćwierćbajtu" (2 bitów)? - bity sterujące 11Rys. 30a - wersja algorytmu "rejestrowa" Dzielnik 1
011011.
Aktualny stan
CRC=111001 widoczny w górnym wierszu prostokąta (
01 "czeka" na wejściu). Bit sterujący (najstarszy)
CRC=1, dlatego bity będą przesunięte w lewo a potem
xor-owane przez
011011. Efekt 101001 widać w środkowym wierszu. Teraz bit sterujący znowu
CRC=1. Bity ponownie będą przesunięte w lewo a potem
xor-owane przez
011011. Efekt
001000 widać w dolnym wierszu.
Rys. 30b - Wstępna wersja algorytmu "xor-owania pisemnego z 2 kreskami" Aktualny stan + 2 bity "czekające"
CRC=11100101 pod dolną kreską. Bity
011011 nad kreską odpowiadają pierwszemu przesunięciu i
xor-owaniu przez
011011. Następne - drugiemu przesunięciu i
xor-owaniu . Po
xor-owaniu ostatnich 6 bitów (pod dolną kreską) z 2 wierszami, nad górną kreską otrzymamy
001000 - to samo co w dolnym wierszu prostokąta z rys. 30a.
Rys. 30c - Ostateczna wersja algorytmu "xor-owania pisemnego z 2 kreskami" Bity
101101 są wynikiem
xor-owania 2 wierszy
011011 na rys. 30b. Czyli
001000nad górną kreską jest
xor-em z
100101 i
101101. Wynik oczywiście taki sam jak na rys. 30a.
Rys. 30d Wersja tablicowa algorytmu dla bitów sterujących 11 - stan początkowyW czarnym prostokącie jest początkowy stan rejestru
CRC=111001 + 2 bity "czekające"
01. Z bitami sterującymi
11 związany jest wiersz o adresie też 11, zawierający
101101.
Rys. 30e Wersja tablicowa algorytmu dla bitów sterujących 11 - stan pośredniBity w rejestrze należy przesunąć o 2 pozycję w lewo. Następnie rejestr
xor-ujemy z wierszem tablicy o adresie 11. Wynik tego działania będzie widoczny na rys. 30f
Rys. 30f Wersja tablicowa algorytmu dla bitów sterujących 11 - stan końcowyTaki sam wynik jak na rys. 30a.
Metoda tablicowa ćwierćbajtowaMetoda pozwala na szybkie obliczenie następnego stanu
CRC po wprowadzeniu do niego "ćwierćbajtu" (2 bitów)
Rys. 31 Jaki będzie następny stan po wprowadzeniu "ćwierćbajtu" 01?Na początku w
CRC było
101001 01 czeka na wejściu. Metoda pozwoli na szybkie ("w jednym ruchu") obliczenie następnego stanu
010011. Milcząco zakładamy oczywiście, że znany jest dzielnik 1
011011. Następny rysunek pokazuje jak to zrobić.
Rysunek 32 jest "złożeniem do kupy" rysunków 27,28,29 i 30 w części dotyczącej metody tablicowej (d,e,f)
Rys.32 Przykład metody tablicowej "ćwierćbajtowej"Rys. 32a przedstawia stan początkowy.
CRC = 101001. Na wejściu "czeka"
01. Pod rejestrem
CRC jest tablica 4 wierszowa, która "powstała" z rysunków 27d, 28d, 29d i 30d. Adres 3 wiersza
10 jest wytłuszczony, dlatego że "ćwierćbajt" sterujący (2 najstarsze bity
CRC), też jest
10.
Rys. 32b przedstawia
CRC z bitami przesuniętymi o 2 pozycje w lewo. "Ćwierćbajt" sterujący wyjdzie na zewnątrz, a do rejestru wprowadzony będzie "czekający ćwierćbaj"
01. Teraz program będzie
xor-ował
CRC z wierszem o adresie wskazanym przez "wypchnięty" ćwierćbajt" sterujący -
10. Wynik
xor-owania na rys. 32c.
Rys. 32c - Wynik końcowy
CRC=010011Widzimy że metoda tablicowa "ćwierćbajtowa" pozwala na dwukrotne przyspieszenie obliczania następnego stanu
CRC. Nic za darmo. Kosztem jest tablica. Czyli zapotrzebowanie na pamięć. Akurat w poważniejsszych mikrokontrolerach nie jest to problemem.
Zarys programu obliczającego resztę CRCNiniejszy program będzie obliczał resztę
CRC, tak obliczając następny stan
CRC jak na rys. 32.
Założenia.
Dzielnikiem jest
1011011Z powyższego wynika że
CRC jest 6-bitowe ( bo dzielnik 7-bitowy)
Przesyłaną wiadomością dowolna liczba (więcej niż 6 bitowa oczywiście).
Program w C-podobnym języku powinien policzyć resztę z dzielenia
wiadomość:1011011Wcześniej w dyrektywach program założy tablice 4x6 (4 wiersze po 6 bitów) tak jak na rys. 32. Ten kawałek nie jest pokazany w poniższym programie.
Wyzeruj rejestr CRC (6 bitów)
Dopisz do wiadomości 000000 WHILE(jeszcze nie jest wprowadzona cała wiadomość z zerami){...
Zapamiętaj"ćwierćbajt" sterujący...
PRZESUŃ CRC o 2 bity w lewo i wprowadź 2 najstarsze bit wiadomości z zerami do CRC...
XOR-uj CRC z wierszem tablicy wskazanym przez "ćwierćbajt" sterujący }Gdy cała wiadomość z dołączonymi 6 zerami zostanie wprowadzona do CRC, to program wyjdzie z pętli
WHILE {...}.
W
CRC będzie reszta z dzielenia
wiadomość:1011011Rozdz. 14 Programowe obliczanie reszty CRC - metoda tablicowa BAJTOWA (8-bitowa)Porównanie metody ćwierćbajtowej i bajtowej rys.33 i 34Rys.33 Metoda tablicowa ćwierćbajtowaKrótkie przypomnienie poprzedniego rozdziału.
1 - wprowadzany jest jeden ćwierćbajt (2 bity)
2 - dzielnik 7 bitowy (1bit + 3 ćwierćbajty)
3 - rejestr
CRC 3 ćwierćbajty (6 bitów)
4 - tablica zawiera 4 wiersze po 3 ćwierćbajty (po 6 bitów)
Rys 33a Stan początkowy rejestru
CRC - ćwierćbajt
01 z prawej strony "czeka" na wprowadzenie
Rys 33b Stan końcowy rejestru
CRC - po wprowadzeniu ćwierćbajtu
Rysunki
c, d, e przedstawiają dokładnie jak realizowana jest modyfikacja rejestru
CRC po wprowadzeniu ćwierćbajtu.
Rys. 33c Stan początkowy rejestru
CRC z tablicą - ćwierćbajt
01 z prawej strony "czeka" na wprowadzenie
Rys. 33d Stan pośredni rejestru
CRC z tablicą
- przesunięcie rejestru o 2 bity w lewo ( w tym wprowadzenie ćwierćbajtu
01 i "wypchnięcie" ćwierćbajtu sterującego
10)
- adresowanie wiersza wskazanego przez "wypchnięty" ćwierćbajt sterujący (
10)
-
xor-owanie
CRC przez adresowany wiersz
11 01 10. Wynik operacji na rys. 33e
Rys. 33e - Wynik operacji
Metoda ćwierćbajtowa nie jest raczej stosowana w praktyce. Ma tylko znaczenie dydaktyczne. Tablica jest tylko 4-wierszowa ponieważ są tylko 2 bity sterujące, Dlatego możliwa jest jeszcze dokładna analiza działania rejestru dla wszystkich 4 kombinacji bitów sterujących. Natomiast rządzą te same mechanizmy jak w metodzie bajtowej.
Rys.34 Metoda tablicowa bajtowaJest to już metoda stosowana w praktyce. Tu akurat realizowany jest wielomian
CRC-32 stosowany w internecie. Czyli jak czytasz ten tekst, coś tam kliknąłeś, to jakiś chochlik przy pomocy tablicy majstruje w
CRC.
W odróżnieniu od metody ćwierćbajtowej
1 - wprowadzany jest jeden bajt (8 bitów)
2 - dzielnik 33 bitowy (1bit + 4 bajty)
3 - rejestr
CRC 4 bajty (32 bity)
4 - tablica zawiera 256 wierszy po 8 bajtów (po 32 bity) (256 = FF)
Podkreślam, że na rys. 33 komórki są
bitowe, na rys.34
bajtowe. Zawartość każdego bajtu przedstawiona jest tu w kodzie hexa. Metoda tablicowa
bajtowa jest rozwinięciem metody ćwierćbajtowej z poprzedniego rozdziału. Różnice są tylko "ilościowe".
Rys 34a Stan początkowy rejestru
CRC - bajt
2D z prawej strony "czeka" na wprowadzenie. Liczba
1 04 A1 1D B7 odpowiada wielomianowi
CRC-32. Bajtem sterującym jest
21=00100001.
Rys 34b Stan końcowy rejestru
CRC - po wprowadzeniu bajtu
Rysunki
c, d, e przedstawiają dokładnie jak realizowana jest modyfikacja rejestru
CRC po wprowadzeniu bajtu
2D.
Rys. 34c Stan początkowy rejestru
CRC z tablicą - bajt
2D z prawej strony "czeka" na wprowadzenie.
Rys. 34d Stan pośredni rejestru
CRC z tablicą
- przesunięcie rejestru o bajt w lewo (w tym wprowadzenie bajtu
2D i "wypchnięcie" bajtu sterującego
21)
- adresowanie wiersza wskazanego przez "wypchnięty" bajt sterujący (
21)
-
xor-owanie
CRC przez adresowany wiersz
14 23 B6 E0. Wynik operacji na rys. 34e
Rys. 34e - Wynik operacji
Tablice dla metody bajtowej są tworzone w sposób analogiczny jak dla metody ćwierćbajtowej i właściwie na tym można byłoby zakończyć artykuł. Dla czystego sumienia pokaże jednak jak to się robi.
Bajt sterujący ma 8 bitów. Odpowiada to 256 różnym kombinacjom --> tablica będzie miała 256 wierszy 4 bajtowych. Wg tej samej zasady na rys. 33 tablica ma 4 wiersze 3 razy po ćwierć bajtu, ponieważ 2 bity sterujące dają 4 kombinacje. Oczywiście nie będę tworzył 256 4-bajtowych wierszy! Po prostu nie mam zdrowia. Dla przykładu stworzę tylko wiersz o adresie
00 i
21.
Dlatego pozostałe wiersze tablic na rysunkach 34c, 34d i 34e wypełniłem przypadkowymi liczbami!.
Kombinacja - bajt sterujący 00Rys. 35 Jakie będzie CRC po wprowadzeniu bajtu ? - bajt sterujący 00Rys. 35 jest odpowiednikiem rys. 27. Różnice między rys. 27 i 35 są tylko ilościowe. Zasady są takie same.
Rys. 27- CRC 3 x ćwierćbajtowe (6 bitowe)
- 2 bity sterujące czyli prostokąt ma wysokość 3=2+1 wierszy (rys. 27a)
- szerokość prostokąta 3 ćwierćbajty - 6 bitów (rys. 27a)
- 2 wiersze "zerowe" między kreskami (rys. 27b)
Rys. 35- CRC 4 x bajt (32 bity)
- 8 bitów sterujących czyli prostokąt ma wysokość 9=8+1 wierszy (rys. 35a)
- szerokość prostokąta ma 4 bajty - 32 bity (rys. 35a)
- 8 wierszy "zerowych" między kreskami (35b)
Rys. 35a - wersja algorytmu "rejestrowa" Na rys. 35a, 35b i 35c dane przedstawione są w kodzie binarnym, bo liczby te łatwo się
xor-uje. W opisach natomiast przedstawione będą w kodzie hexa ze względu na ich "zwięzłość".
Dzielnik 1
04 A1 1D B7 (Najstarszy bit zawsze 1, lecz tylko "czerwone" bity wpływają na algorytm)
Aktualny stan
CRC=00 72 B9 72 widoczny w górnym wierszu prostokąta
(2D "czeka" na wejściu). Bit sterujący (najstarszy)
CRC=0, dlatego bity będą tylko przesunięte w lewo. Tu znowu bit sterujący
CRC=0 itd...Bity ponownie będą tylko przesunięte w lewo.
W ten sposób wszystkie bity będą przesunięte w lewo o 1 bajt (8 bitów) i nowy stan
CRC (9 "wytłuszczony" wiersz prostokąta) to
CRC=72 B9 72 2D.
Rys. 35b - Wstępna wersja algorytmu "xor-owania pisemnego z 2 kreskami" Aktualny stan
CRC + bajt "czekający"
00 72 B9 72 2D pod dolną kreską.
8 czerwonych zerowych wierszy nad kreską odpowiada kolejnym przesunięciom w rejestrze CRC.
Nad górną kreską (po
xor-owaniu 8 zerowych wierszy) widzimy nowy "przesunięty" stan rejestru
72 B9 72 2D. Ten sam wynik jak w dolnym wierszu na rys. 35a.
Rys. 35c - Ostateczna wersja algorytmu "xor-owania pisemnego z 2 kreskami" Bajty
00 00 00 00 są wynikiem
xor-owania 8 wierszy na rys. 35 b.Wynik oczywiście taki sam jak w dolnym wierszu na rys. 35a.
Rys. 35d Wersja tablicowa algorytmu dla bajtu sterującego 00 - stan początkowywiersz tablicy o adresie
00 wynika bezpośrednio z rys. 35c
W czarnym prostokącie jest początkowy stan rejestru
CRC=00 72 B9 72 + bajt "czekający"
2D. Z bajtem sterującymi
00 związany jest wiersz o adresie też 00, zawierający
00 00 00 00Rys. 35e Wersja tablicowa algorytmu dla bajtu sterującego 00 - stan pośredniBajty w rejestrze należy przesunąć o 1 pozycję w lewo. Następnie rejestr xor-ujemy z wierszem tablicy o adresie
00. czyli z
00 00 00 00. Wynik tego działania będzie widoczny na rys. 35f
Rys. 35f Wersja tablicowa algorytmu dla bitów sterujących 00 - stan końcowyAkurat dla tego przypadku -
xor-owanie przez zera rys. 35e i 35f są takie same.
Taki sam wynik jak na rys. 35a.
Kombinacja - bajt sterujący 21Rys. 36 Jakie będzie CRC po wprowadzeniu bajtu ? - bajt sterujący 21Rys. 36a - wersja algorytmu "rejestrowa" Aktualny stan
CRC=21 72 B9 72 widoczny w górnym wierszu prostokąta
(2D "czeka" na wejściu). Pierwszy bit sterujący (najstarszy)
CRC=0, dlatego bity będą tylko przesunięte w lewo. Tu znowu bit sterujący
CRC=0 ,czyli bity znowu będą przesunięte w lewo.
Ale teraz bit sterujący =
1. Czyli w następnym wierszu bity będą przesunięte w lewo i
xor-owane z "czerwonymi' bitami dzielnika. Tak się szczęśliwie złozyło, że przy następnych przesunięciach, bity sterujące będą
zerowe . Czyli będą tylko gołe przesunięcia, bez
xor-owań. W ten sposób po przesunięciu o bajt, dojdziemy do
wytłuszczonego wiersza nr 9 ze stanem
CRC= 66 9A C4 CB .
Uwaga Tylko jeden wiersz "do
xor-owania", to tylko przypadek! Przy innym bajcie sterującym, mogłoby być ich np. 5 a nawet 8.
Rys. 36b - Wstępna wersja algorytmu "xor-owania pisemnego z 2 kreskami" Aktualny stan
CRC + bajt "czekający"
21 72 B9 72 2D pod dolną kreską.
7 czerwonych zerowych wierszy odpowiada gołym przesunięciom w rejestrze CRC. Wiersz nr 3 - z czerwonymi bitami dzielnika, odpowiada przesunięciu i
xor--owaniu. Przy innych danych takich wierszy mogło być oczywiście więcej.
Nad górną kreską widzimy nowy stan rejestru
66 9A C4 CB. Taki sam wynik jak w dolnym wierszu na rys. 36a.
Rys. 36c - Ostateczna wersja algorytmu "xor-owania pisemnego z 2 kreskami" Bajty
14 23 B6 E0 są wynikiem
xor-owania 8 wierszy na rys. 36 b.Wynik oczywiście taki sam jak w dolnym wierszu na rys. 36a.
Rys. 36d Wersja tablicowa algorytmu dla bajtu sterującego 21 - stan początkowywiersz tablicy o adresie
21 wynika bezpośrednio z rys. 36c
W czarnym prostokącie jest początkowy stan rejestru
CRC=21 72 B9 72 + bajt "czekający"
2D. Z bajtem sterującymi
21 związany jest wiersz o adresie też
21, zawierający [img]14%2023%20B6%20E0[/img]
Rys. 36e Wersja tablicowa algorytmu dla bajtu sterującego 21 - stan pośredniBajty w rejestrze należy przesunąć o 1 pozycję w lewo. Następnie rejestr xor-ujemy z wierszem tablicy o adresie
21. czyli z
14 23 B6 E0. Wynik tego działania będzie widoczny na rys. 36f
Rys. 36f Wersja tablicowa algorytmu dla bitów sterujących 21 - stan końcowyTaki sam wynik jak na rys. 36a.
Zarys programu obliczającego resztę CRC-32Niniejszy program będzie obliczał resztę
CRC-32, tak obliczając następny stan
CRC jak na rys. 34. Jest prawie kopią programu z rozdz. 13.
Założenia.
Dzielnikiem jest 1
04 A1 1D B7Z powyższego wynika że
CRC jest 4-bajtowe (32 bo bo dzielnik 33-bitowy)
Przesyłaną wiadomością dowolna liczba (więcej niż 4 bajty oczywiście).
Program w C-podobnym języku powinien policzyć resztę z dzielenia
wiadomość:1 04 A1 1D B7Wcześniej w dyrektywach program założy tablice 256x4 bajty (256 wierszy po 4 bajty) tak jak na rys. 34. Ten kawałek nie jest pokazany w poniższym programie.
Wyzeruj rejestr CRC (4 bajty)
Dopisz do wiadomości 00 00 00 00 WHILE(jeszcze nie jest wprowadzona cała wiadomość z zerami){...
Zapamiętaj bajt sterujący...
PRZESUŃ CRC o 1 bajt w lewo i wprowadź najstarszy bajt wiadomości z zerami do CRC...
XOR-uj CRC z wierszem tablicy wskazanym przez bajt sterujący }Gdy cała wiadomość z dołączonymi 32 zerami zostanie wprowadzona do CRC, to program wyjdzie z pętli
WHILE {...}.
Wtedy w
CRC będzie reszta z dzielenia
wiadomość:1 04 A1 1D B7powrót do części 1 LINK