PODSTAWY TEORII UKŁADÓW CYFROWYCH Jednostki informacji Informacja jest tworem czysto abstrakcyjnym. Nie istnieje materialnie. Nie można jej dotknąć, poczuć, zobaczyć. Informację da się natomiast wyrażać za pomocą symboli, znaków, kodu. Człowiek najczęściej używa słów, pisma, gestów do przekazywania informacji. Ta sama informacja (idea) może przybierać formę symboli, które, chociaż różne, oznaczają to samo pojęcie. Skoro do wyrażania informacji możemy używać różnych symboli (słów),to dlaczego nie zastosować do tego celu bitów? Bit jest symbolem, który może przyjmować dwie różne postacie. Jeśli chcemy zapisać go na papierze, to stosujemy symbole pomocnicze 0 i 1. Technicznie bit realizowany jest za pomocą dwóch różnych sygnałów. W technice cyfrowej określa się poziomy napięć, które odpowiadają bezpośrednio dwóm postaciom bitu: 0,4 ... 0,8 V - stan 0 (oznaczany również L - Low - Niski) 2,0 ... 2,4 V - stan 1 (oznaczany również H - High - Wysoki) Układy elektroniczne komputera reagują na te napięcia i w ten sposób przetwarzają bity. Zamiast napięć mogą to być również prądy o różnych natężeniach lub zwrotach, sygnały o dwóch rozróżnialnych częstotliwościach oraz wiele innych sposobów. Poprzestańmy, więc na stwierdzeniu, iż bit to sygnał dwustanowy - jeden stan oznaczamy jako 0, a drugi jako 1. Każdy ze stanów bitu może przenosić jedną wiadomość w identyczny sposób, jak np. słówko "stół" przenosi wiadomość na temat rzeczy z płaskim blatem i zwykle czterema nogami. Tyle tylko, że słowa naszego języka mają ustalone od stuleci znaczenia, bity natomiast możemy przystosowywać do dowolnych wiadomości w miarę potrzeb. Jeden bit pozwoli w ten sposób przekazać jedną z dwóch wiadomości. Taśma dziurkowana. Tak kiedyś zapisywano dane. Każda dziurka odpowiadała bitowi o stanie 1. Brak dziurki oznaczał stan 0. Przykład Pojedyncze bity używane są do komunikacji z prostymi czujnikami, które reagują na określoną sytuację - np. gaz w chronionym pomieszczeniu, wzrost temperatury ponad wartość dopuszczalną, osiągnięcie przez ciecz w naczyniu określonego poziomu, otwarcie drzwi, przerwanie wiązki światła, itp. Czujnik ruchu. W razie wykrycia ruchu w okolicy przekazuje bit o stanie 1. PODSTAWY TEORII UKŁADÓW CYFROWYCH Bity możemy łączyć w grupy i traktować je wspólnie jako symbol złożony. Przy takim podejściu otrzymujemy nieograniczone możliwości tworzenia słów binarnych i przypisywania im znaczeń. Grupa dwóch bitów oddaje nam do dyspozycji cztery różne symbole, które powstają z kombinacji stanów tworzących je bitów: 00 - symbol pierwszy 01 - symbol drugi 10 - symbol trzeci 11 - symbol czwarty Każdemu symbolowi możemy przypisać informację o osobnym zdarzeniu. Grupa dwóch bitów może więc przekazać informację o czterech różnych zdarzeniach. Przykład Załóżmy, iż chcemy zakodować binarnie obrazek pokazany poniżej: Jest on złożony z różnokolorowych punktów, które nazywamy pikselami (z języka ang. picture element - element obrazu, punkt). -00 Od razu zauważamy, że punkty są tylko w czterech kolorach. Układamy tablicę kodową kolorów, w której każdemu kolorowi punktu przyporządkujemy jeden symbol dwubitowy: -01 -10 -11 Powiązaliśmy w ten sposób informację z reprezentującymi ją symbolami. Teraz wystarczy już tylko każdy piksel zastąpić symbolem dwubitowym. W tej postaci obrazek może być przechowywany w pamięci komputera, przesyłany przez sieci teleinformatyczne oraz przetwarzany. Zwróćmy uwagę na małą czytelność dla ludzi informacji zapisanej w systemie binarnym. Szczególnie, jeśli wszystkie bity zapiszemy w jednym ciągu: 0000000000000000000011111111000000111111111100000000111111111100000000111100000000000000100000000101010101010101 System dziesiątkowy (decymalny) Systemy liczbowe System liczbowy - zbiór reguł jednolitego zapisu i nazewnictwa liczb. Do zapisywania liczb używa się skończonego zbioru znaków, zwanych cyframi, które można łączyć w dowolnie długie ciągi, otrzymując nieskończoną liczbę kombinacji. Rozróżnia się systemy liczbowe pozycyjne i niepozycyjne (addytywne). W systemach liczbowych pozycyjnych liczbę przedstawia się jako ciąg cyfr. Wartość jej jest zależna od położenia (pozycji) cyfry w liczbie. a. Do systemów pozycyjnych zaliczamy m.in.: dziesiątkowy, dwójkowy, ósemkowy, szesnastkowy. b. Do addytywnych systemów liczbowych zaliczamy m.in.: rzymski, hieroglificzny, alfabetyczny, gdzie wartość liczby jest sumą wartości jej znaków cyfrowych. Liczba - pojęcie abstrakcyjne, jedno z najczęściej używanych w matematyce. Określenie „liczba" bez żadnego przymiotnika jest nieścisłe, gdyż matematycy nie definiują „liczb", lecz „liczby naturalne", „liczby całkowite", itp. Poszczególne rodzaje liczb są definiowane za pomocą aksjomatów lub konstruowane z bardziej podstawowych pojęć, takich jak zbiór, czy typy liczb prostsze od konstruowanego. Pierwotnie liczby służyły do porównywania wielkości zbiorów przedmiotów (liczby naturalne), później także wielkości ciągłych (miary i wagi), obecnie w matematyce są rozważane jako twory abstrakcyjne, w oderwaniu od ewentualnych fizycznych zastosowań. System pozycyjny - wzór ogólny Ogólnie oznaczając przez cn - cyfrę systemu pozycyjnego i n - pozycję cyfry zaś przez: p - podstawę systemu, wartość reprezentowaną przez symbol liczby zapisujemy jako sumę iloczynów postaci: cn * p n + . . . + c2 * p 2 + c1 * p 1 + c0 * p 0 System dziesiątkowy (decymalny) System dziesiątkowy: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 - to wszystkim znane symbole cyfr arabskiego dziesiątkowego, pozycyjnego systemu liczenia. Każdemu z tych symboli przyporządkowana jest pewna wartość. Z tych prostych symboli tworzymy symbole bardziej złożone wpisując cyfry na tzw. pozycje, w uszeregowaniu od prawej do lewej. I tak najbardziej skrajna prawa pozycja, to pozycja zerowa (pozycja jedności), dalej pozycja pierwsza (pozycja dziesiątek), dalej pozycja druga (pozycja setek), ... itd. Zgodnie z przedstawioną zasadą, każdemu prostemu czy złożonemu symbolowi układu można przyporządkować wartość, zwaną liczbą. Liczba to nie to samo co cyfra. Cyfry to znaki graficzne służące do opisu liczb. Symbol Wartość w systemie Liczba 7 7 *10 0 siedem 56 5 * 10 1 + 6 * 10 0 Pięćdziesiąt sześć 342 Trzysta czterdzieści 3 * 10 2 + 4 * 10 1 +2 * 10 0 dwa Konwersja na dziesiątkowy: (4013) 5 = 4 * 5 3 + 0 * 5 2 + l * 5 1 + 3 * 5 ° = 5 0 0 + 5 + 3 = (508)10 Konwersja z dziesiątkowego System dwójkowy (binarny) System dwójkowy - zrewolucjonizował cały świat techniki, dając podstawę rozwoju wiodącej obecnie dziedzinie wiedzy, jaką jest informatyka. Cyframi tego systemu są: 0 i 1. Symbolizują one dwa stany tzw. 0 - stan niski - (brak działania/brak sygnału) 1- stan wysoki - (działanie układu/sygnał) Podstawą systemu jest 2. Stąd też i nazwa układ dwójkowy. Konwersja liczb Ponieważ jest to również system pozycyjny, to możemy w znany już sposób dokonywać konwersji liczby z systemu dziesiątkowego na dwójkowy, np. ( 87)10 = 87 : 2 = 43 1 43 : 2 = 21 1 21 : 2 = 10 1 10 : 2 = 5 0 5:2 = 2 1 2:2 = 1 0 1:2 = 0 1 = (1010111)2 Konwersja z systemu dwójkowego na dziesiątkowy: (11011101) 2 = 1 * 2 7 + 1 * 2 6 + 0 * 2 5 + 1 * 2 4+ 1 * 2 3 + 1 * 2 2 + 0 * 2 1 + 1 * 2 0 = = 128 + 64 + 16 + 8 + 4 + 1 = (221) 10 System szesnastkowy (heksadecymalny) Nawet niezbyt duża co do wartości liczba z systemu dziesiątkowego zamieniona na postać dwójkową (binarną) jest długim ciągiem jedynek i zer, a ponowne przeliczenie jej na wartość w systemie dziesiątkowym procesem żmudnym i długotrwałym. Między innymi dla uproszczenia zapisu i szybkiego przeliczenia wartości wprowadzono system pozycyjny, którego podstawą jest 24, czyli 16 i nazwano systemem szesnastkowym (heksadecymalnym). Cyframi tego systemu są: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F Zależność między liczbami Cyfry systemu szesnastkowego Liczby systemu dziesiątkowego Liczby systemu dwójkowego 0 0 0000 1 1 0001 2 2 0010 3 3 0011 4 4 0100 5 5 0101 6 6 0110 7 7 0111 8 8 1000 9 9 1001 A 10 1010 B 11 1011 C 12 1100 D 13 1101 E 14 1110 F 15 1111 Konwersje liczb na system binarny Każdej cyfrze systemu szesnastkowego odpowiada cztero-pozycyjna liczba systemu dwójkowego. Zamiana postaci liczby z systemu dwójkowego na liczbę systemu szesnastkowego polega na przypisaniu każdemu kolejnemu cztero-pozycyjnemu pakietowi układów zero-jedynkowych odpowiedniej cyfry układu szesnastkowego, np. (1011|0011|1010)2 = (B3A)16 Jeżeli w zapisie liczby dwójkowej ostatni /pakiet/ (z lewej) ma mniej niż cztery pozycje zero-jedynkowe, to uzupełniamy brakujące pozycje zerami, np. (11|1011|1110)2 = (0011|1011|1110)2 = (3BE)16 Konwersje liczb na system decymalny Przeliczenie liczby z systemu szesnastkowego na wartość liczby w systemie dziesiątkowym odbywa się według znanego wzoru , np. (3BE)16 = 3 * 16 2 + 11 * 16 1 + 14 * 16 0 = 768 + 176 + 14 = (958)10 Dwójkowe liczby stałoprzecinkowe System stałopozycyjny zapisu liczb jest rozszerzeniem zapisu liczb naturalnych w stronę wartości ułamkowych. W systemie dziesiętnym za cyfrą jednostek umieszcza się przecinek, a kolejne wagi pozycji są teraz ujemnymi potęgami podstawy: 253,763 = 2 x 102 + 5 x 101 + 3 x 10° + 7 x 10-1 + 6 x 10-2 + 3 x 10-3 Zasada ta obowiązuje również w innych systemach pozycyjnych. Dla przykładu obliczmy wartość stałopozycyjnej liczby piątkowej: 432,321(5) 432,321(5) = 4 x 52+ 3 x 51 + 2 x 50 + 3 x 5-1 + 2 x 5-2 + 1 x 5-3 432,321(5) = 4 x 25 + 3 x 5 + 2 x 1 + 3 x 1/5 + 2 x 1/25 + 1 x 1/125 432,321(5) = 100 + 15 + 2 + 3/5 + 2/25 + 1/125 432,321(5) = 117 86/125 432,321(5) = 117,688 W dowolnym systemie pozycyjnym o podstawie p wartość liczby stałoprzecinkowej obliczamy wg wzoru: Cn-1,...c0,c-1,c-2...c-m = cn-1pn-1 + ... +c0p0 + c-1p-1 + c-2p-2 + ...+c-mp-m gdzie n - liczba cyfr przed przecinkiem, m - liczba cyfr po przecinku Obliczymy wartość dwójkowej liczby stałoprzecinkowej 1101,1011(2) 1101,1011(2) = 1 x 23 + 1 x 22 + 0 x 21 + 1 x 20 + 1 x 2-1 + 0 x 2-2 + 1 x 2-3 + 1 x 2-4 1101,1011(2) = 1 x 8 + 1 x 4 + 0 x 1 + 1 x 1 + 1 x 1/2 + 0 x 1/4 + 1 x 1/8 + 1 x 1/16 1101,1011(2) = 8 + 4 + 1 + 1/2 + 1/8 + 1/16 1101,1011(2) = 13 + 10/16 1101,1011(2) = 13,625 Operacje arytmetyczne Dodawanie dwójkowe Ostatni wynik należy rozumieć następująco: 1 + 1 daje 0 w bieżącej kolumnie i przeniesienie (ang. carry) jedynki do następnej kolumny. Przeniesienie dodawane jest do cyfry w następnej kolumnie - zupełnie tak samo postępujem y w systemie dziesiętnym, gdy wynik sumowania cyfr przekracza dziewięć. Jeśli liczby binarne są zapisywane ze stałym formatem (np. 8 bitów), to może się zdarzyć, iż wynik dodawania nie zmieści się w dozwolonym zakresie liczb. Sytuacja taka nazywa się nadmiarem (ang. overflow). Wynik dodawania jest liczbą 5 bitową i nie mieści się w 4 bitach. Jeśli ograniczymy go do 4 bitów, to otrzymamy wartość 0. Wystąpił nadmiar. Wynik został obcięty do reszty z dzielenia przez 16. Zapamiętaj: Nadmiar jest przekroczeniem górnej granicy zakresu liczb. Dla liczb naturalnych mamy do czynienia z nadmiarem, gdy pojawi się przeniesienie poza najstarszą pozycję liczby. Dodawanie dwójkowe stałoprzecinkowe W identyczny sposób dodajemy liczby stałoprzecinkowe. Należy tylko pamiętać o ustawieniu przecinków w jednej kolumnie i dopisaniu w razie konieczności zer na początku części całkowitych i na końcu części ułamkowych: Odejmowanie dwójkowe Ostatni zapis należy rozumieć jako: 0 - 1 daje w bieżącej kolumnie 1 i pożyczkę (ang. borrow) do następnej kolumny. Pożyczka jest odejmowana od cyfr w następnej kolumnie Przy odejmowaniu wynik może być liczbą ujemną. Ponieważ omówione systemy zapisu liczb binarnych nie uwzględniają jeszcze liczb ujemnych, to w takim przypadku wystąpi sytuacja zwana niedomiarem (ang. underflow). Liczba -1 leży poza zakresem liczb dla kodu 4 bitowego. Dlatego nie może w tym kodzie być przedstawiona prawidłowo i otrzymujemy wynik równy 15. Wiodące jedynki powstają w tym przypadku w nieskończoność, co zostało zaznaczone trzema kropeczkami na początku wyniku odejmowania. Zapamiętaj: Niedomiar jest przekroczeniem dolnej granicy zakresu liczb. Dla liczb naturalnych mamy do czynienia z niedomiarem, gdy pojawi się pożyczka poza najstarszą pozycję liczby. Mnożenie dwójkowe Mnożenie binarne wykonujemy identycznie jak w systemie dziesiętnym - przemnażamy mnożną przez każdą cyfrę mnożnika zapisując wyniki tego mnożenia odpowiednio przesunięte. Następnie wykonujemy dodawanie zgodnie z opisanym wcześniej schematem: W systemie dwójkowym wynik mnożenia jest równy 1 tylko wtedy, gdy obie mnożone cyfry mają wartość 1. W każdym innym przypadku otrzymujemy wartość 0. Pozwala to znacznie uprościć schemat mnożenia. Mnożną umieszczamy tylko w tych kolumnach, w których w mnożniku występują cyfry 1. Pozostałe kolumny pomijamy: Mnożenie liczb stałopozycyjnych wykonujemy w identyczny sposób, lecz musimy pamiętać, aby przy wyniku oddzielić odpowiednią ilość cyfr ułamkowych przecinkiem - ilość ta jest sumą liczby miejsc po przecinku mnożnej i mnożnika - tak samo jak w systemie dziesiętnym. Dzielenie dwójkowe Dzielenie binarne jest najbardziej skomplikowaną operacją arytmetyczną z dotychczas opisywanych. Wymyślono wiele algorytmów efektywnego dzielenia, ale dla potrzeb tego opracowania wystarczy znany wam algorytm szkolny, który polega na cyklicznym odejmowaniu odpowiednio przesuniętego dzielnika od dzielnej. W systemie dwójkowym jest to szczególnie proste, ponieważ dzielnika nie musimy mnożyć. Zadanie Podzielimy liczbę 1110(2) przez 11(2) (14 : 3). 1. Przesuwamy w lewo dzielnik, aż zrówna się jego najstarszy, niezerowy bit z najstarszym, niezerowym bitem dzielnej. Nad dzielną rysujemy kreseczkę: 2. Jeśli dzielnik da się odjąć od dzielnej bez niedomiaru, to nad kreską w kolumnie najmłodszego bitu dzielnika wpisujemy 1 i wykonujemy odejmowanie: 3. Dzielnik przesuwamy o jeden bit w prawo i próbujemy tego samego z otrzymaną różnicą. Jeśli odejmowanie jest możliwe, to nad kreską w następnej kolumnie dopisujemy 1, odejmujemy dzielnik od różnicy, przesuwamy go o 1 bit w prawo i kontynuujemy. 100 - wynik dzielenia 1 1 1 0 - dzielna --- 11 - dzielnik 0 0 1 0 - dzielna po odejmowaniu przesuniętego dzielnika --- 11 - dzielnika nie można odjąć 0 0 1 0 - dzielna --- 11 - dzielnika nie można odjąć, koniec 0 0 1 0 - reszta z dzielenia Jeśli odejmowanie nie jest możliwe, to dopisujemy nad kreską 0, przesuwamy dzielnik o 1 bit w prawo i kontynuujemy. 4. Operacje te wykonujemy dotąd, aż dzielnik osiągnie swoją pierwotną wartość. Pozostała dzielna jest resztą z dzielenia W naszym przykładzie otrzymaliśmy wynik 100(2) i resztę 10(2). Jest to wynik poprawny, gdyż 3 mieści się w 14 cztery razy i pozostaje reszta 2. Zadanie podzielmy liczbę 110101101(2) przez 111(2) (429 przez 7) Odpowiedź: 110101101(2) : 111(2) = 111101(2) - reszta 10(2) (429 : 7 = 61 - reszta 2). Liczby ujemne kod-znak-moduł Wartość liczb w kodzie Z-M System zapisu liczb ze znakiem znany pod nazwą znak-moduł (zapis Z-M) pochodzi w prostej linii od naszego własnego sposobu zapisu liczb ujemnych. Znak kodowany jest stanem najstarszego bitu: bit znaku = O - liczba dodatnia bit znaku = 1 - liczba ujemna Reszta bitów przechowuje moduł, czyli wartość bezwzględną liczby zakodowaną w naturalnym kodzie binarnym (stosuje się również system stałoprzecinkowy Z-M). Wartość liczby obliczamy wg następującego wzoru: WZ-M = (1 - 2 x bit znaku) x WM bit znaku -najstarszy bit zapisu liczby WM -wartość modułu, czyli pozostałych bitów traktowanych jako liczba w naturalnym kodzie binarnym (lub w kodzie stałoprzecinkowym). Wyrażenie (1 - 2 x bit znaku) przyjmuje wartość 1 dla bitu znaku = 0 oraz -1 dla bitu znaku = 1. Wzór ten można również zapisać w postaci potęgowej W Z-M = (-1)bit znaku x WM Załóżmy, że operujemy 4 bitowymi liczbami w kodzie Z-M. Liczba (0 101)(ZM) ma wartość: (0 101)(zm) = (1 - 2 x 0) x (1 x 22 + 0 x 21 + 1 x 20) (0 101)(zm) = 1 x (1 x 4 + 1 x 1) (0 101)(zm) = 1 x (4 + 1) (0 101)(zm) = 1 x 5 (0 101)(zm) = 5 Natomiast liczba (1 101)(ZM) ma wartość dziesiętną: (1101)(zm) = (1 - 2 x 1) x (1 x 22 + 0 x 21 + 1 x 20) (1101)(zm) = -1 x (1 x 4 + 1 x 1) (1101)(zm) = -1 x (4 + 1) (1101)(zm) = -1 x 5 (1101)(zm) = -5 Czyli jest liczbą przeciwną do poprzedniej. Kod U2 System zapisu liczb ze znakiem opisany w poprzednim rozdziale nie jest zbyt wygodny dla obliczeń maszynowych. Już przy tak prostych operacjach jak dodawanie i odejmowanie musimy stosować dodatkową logikę obsługi znaków, aby otrzymywać poprawne wyniki. Dlatego w obliczeniach komputerowych bardziej popularny jest inny system, zwany systemem uzupełnień do dwóch (w skrócie U2) lub uzupełnień do podstawy (w literaturze angielskiej nosi on nazwę Two's Complement Numbering System). Idea systemu U2 nie jest nowa - wymyślił ją już Blaise Pascal, znany francuski fizyk i matematyk, który skonstruował w 1652 roku prostą maszynę arytmetyczną zdolną dodawać liczby dziesiętne. Aby umożliwić również odejmowanie liczb, Pascal wprowadził tzw. uzupełnienie do podstawy 10. Otrzymujemy je odejmując daną liczbę od podstawy podniesionej do potęgi równej największej ilości cyfr dodawanych liczb. Np. dla liczb z zakresu od 0..99 będziemy odejmować od 100 - 102, dla liczb z zakresu od 0..999 od 1000 - 103 itd. Pascalina - sumator Pascala Chcemy wykonać odejmowanie: 56 - 27. W tym celu obliczamy uzupełnienie do podstawy 10 liczby 27: - 27 = 100 - 27 = 73(U10) Teraz wykonujemy dodawanie liczby 56 oraz uzupełnienia 73(U10): 56 + 73(U10) = 129 Odrzucamy najstarszą jedynkę i mamy wynik 29. Na identycznej zasadzie utworzono system uzupełnień do podstawy U2. W systemie tym waga pozycji najstarszego bitu jest ujemna. Jeśli bit na tej pozycji będzie miał wartość 0, to otrzymamy liczbę dodatnią, której wartość określają pozostałe bity. Gdy bit znaku przyjmie wartość 1, to liczba będzie ujemna. Wartość liczby obliczymy jako sumę wagi pozycji najstarszego bitu (jest ujemna) oraz pozostałej części liczby. Wzór obliczeniowy jest następujący: WU2 = cn-1 x (- p n-1) + cn-2 x p n-2 + ... + c1 x p 1 + c0 x p0 Obliczmy dla przykładu wartość liczb 4 bitowych w kodzie U2: 0101(U2) = 0 x (- 23) + 1 x 22 + 0 x 21 + 1 x 20 0101(U2) = 0 x (- 8) + 1 x 4 + 0 x 2 + 1 x 1 0101(U2) = 0 + 4 + 1 0101(U2) = 5 1101(U2) = 1 x (- 23) + 1 x 22 + 0 x 21 + 1 x 20 1101(U2) = 1 x (- 8) + 1 x 4 + 0 x 2 + 1 x 1 1101(U2) = (- 8) + 4 + 1 1101(U2) = - 8 + 5 1101(U2) = - 3 Zapamiętaj Wartość liczby w kodzie U2 obliczamy bardzo podobnie do wartości liczby w naturalnym kodzie dwójkowym. Musimy tylko pamiętać, że waga najstarszej pozycji (pozycji znakowej) jest ujemna. Dla n bitowej liczby U2 możemy zapisać wzór: WU2 = cn-1 x (- 2n-1) + wartość reszty liczby w kodzie NBC Zakres liczb w kodzie U2 Największą liczbę w kodzie U2 otrzymamy, gdy bit znaku przyjmie wartość 0 (liczba dodatnia), a reszta cyfr będzie składała się z samych jedynek. Reszta cyfr tworzy największą liczbę n-1 bitową w naturalnym kodzie binarnym, wobec tego: Zu2max = 2n-1 - 1 Najmniejszą liczbę w kodzie U2 otrzymamy dla bitu znaku równego 1 (liczba ujemna) oraz pozostałych bitów równych zero. ZU2 = <-2n-1, 2n-1 - 1> Przykład Obliczmy zakres 4 bitowych liczb w kodzie U2: ZU2max = 24-1 - 1 = 23 - 1 = 8 - 1 = 7 ZU2min = -24-1 = -23 = -8 Dla czterech bitów ZU2 = <-8, 7> Obliczanie wartości przeciwnej w kodzie U2 Wartość przeciwna ma tą samą wartość bezwzględną, lecz znak przeciwny. W kodzie U2 obliczamy ją następująco: ZAPAMIĘTAJ Aby znaleźć wartość przeciwną do danej w kodzie U2, wykonaj następujące dwie operacje: • zmień wszystkie bity liczby na przeciwne (możesz wykorzystać do tego celu operację logiczną NOT). • do tak uzyskanej liczby dodaj 1 Przykład Oblicz wartość przeciwną do liczby 0011(U2) = 3: Sprawdzenie 1101(U2) = 1 x (-23) + 1 x 22 + 0 x 21 + 1 x 20 1101(U2) = 1 x (-8) + 1 x 4 + 0 x 2 + 1 x 1 1101(U2) = -8 + 4 + 1 1101(U2) = -3 Znajdowanie reprezentacji liczby w kodzie U2 Mamy wartość dziesiętną W i chcemy zapisać ją w n-bitowym kodzie U2. Najpierw musimy sprawdzić, czy zakres liczb U2 obejmuje wartość W. Jeśli tak, to: • Dla W nieujemnego obliczamy liczbę dwójkową o tej wartości, a następnie dopełniamy ją zerami do formatu n-bitowego. • Dla W ujemnego obliczamy uzupełnienie do podstawy 2 o wartości 2n + W. Wynik kodujemy binarnie i otrzymujemy liczbę ujemną w kodzie U2. Przykład Znaleźć zapis liczby 92 w 8 bitowym kodzie U2. Liczba jest dodatnia, więc znajdujemy jej zapis binarny: 92 = 01011100(U2) Przykład Znaleźć zapis liczby -107 w 8 bitowym kodzie U2: Liczba jest ujemna, więc najpierw obliczamy jej dopełnienie do podstawy: U = 2n + W = 28 - 107 = 256 - 107 = 149 -107 = 10010101(U2) Wyrażamy 149 binarnie 149 : 2 = 74 i reszta c0 = 1 74 : 2 = 37 i reszta c1 = 0 37 : 2 = 18 i reszta c2 = 1 18 : 2 = 9 i reszta c3 = 0 9 : 2 = 4 i reszta c4 = 1 4 : 2 = 2 i reszta c5 = 0 2:2 = 1 i reszta c6 = 0 0 : 2 = 0 i reszta c7 = 1 Arytmetyka liczb w kodzie U2 Dodawanie i odejmowanie Zasady dodawania i odejmowania liczb w kodzie U2 nie różnią się od zasad wykonywania tych działań arytmetycznych w zwykłym systemie binarnym, co jest niewątpliwą zaletą kodu U2. Otrzymaliśmy poprawne wyniki operacji bez sprawdzania znaków przetwarzanych liczb. Jest to bardzo dużą zaletą kodu U2, dzięki której obliczenia są szybkie i sprawne. Zapamiętaj W systemie U2 dodawanie i odejmowanie wykonujemy wg poznanych zasad dla naturalnego kodu dwójkowego. Przeniesienia i pożyczki poza bit znaku ignorujemy. Mnożenie Mnożenie liczb w kodzie U2 różni się nieco od standardowego mnożenia liczb binarnych. Przed wykonaniem tej operacji arytmetycznej musimy rozszerzyć znakowo obie mnożone liczby tak, aby ich długość (liczba bitów) wzrosła dwukrotnie (jeśli są różnej długości, to rozszerzamy znakowo względem dłuższej liczby). Rozszerzenie znakowe polega na powielaniu bitu znaku na wszystkie dodane bity. Np.: 0111(U2) = 0000 0111(U2) - rozszerzyliśmy znakowo liczbę 4 bitową do 8 bitowej 1011(U2) = 1111 1011(U2) - to samo dla liczby ujemnej. Rozszerzenie znakowe nie zmienia wartości liczby w kodzie U2. Po wykonaniu rozszerzenia znakowego liczby mnożymy wg poznanych już zasad. Dla przykładu pomnóżmy (-2) x 3: -2 = 1110(U2) = 1111 1110(U2) 3 = 0011(U2) = 0000 0011(U2) (-2) x 3 11111110 x 00000011 11111110 Wynik mnożenia może być liczbą o długości równej sumie długości mnożonych liczb. Dlatego bity wykraczające w naszym przykładzie poza 8 bitów ignorujemy. Pozostałe 8 bitów określa w kodzie U2 liczbę -6. + 11111110 1011111010 Wynik = -6 Dzielenie Najprostszym rozwiązaniem jest zapamiętanie znaków dzielonych liczb, zamiana ich na liczby dodatnie, dokonanie dzielenia dla liczb naturalnych, a następnie zmiana znaku wyniku, jeśli znaki dzielnej i dzielnika różnią się. Kod BCD System Dziesiętny Kodowany Binarnie System binarny jest wygodny do prowadzenia obliczeń maszynowych. Jednakże istnieje duża liczba zastosowań urządzeń obliczeniowych, gdzie występuje częsta potrzeba konwersji dziesiętno-binarnych - np. kalkulatory, kasy sklepowe, wagi, urządzenia pomiarowe, liczniki itp. Dla takich zadań opracowano kod BCD - Binary Coded Decimal, czyli dziesiętny kodowany binarnie. Stanowi on połączenie zalet dwójkowego kodowania z czytelnością liczb dziesiętnych. Wartość liczb w kodzie BCD W systemie BCD każdą cyfrę dziesiętną liczby kodujemy za pomocą 4 bitów tworzących wartość tej cyfry w systemie dwójkowym. Np. liczbę 2379 zakodujemy następująco: W efekcie otrzymujemy kod BCD tej wartości: 2 3 0010 0011 7 0111 9 1001 2379(10) = 0010001101111001(BCD) Mając liczbę w kodzie BCD rozdzielamy jej bity na grupy 4 bitowe. Każdą grupę traktujemy jak cyfrę dziesiętną. Dlatego wartości uzyskanych cyfr przemnażamy przez kolejne potęgi podstawy systemu dziesiętnego, czyli 10. Wyniki iloczynów sumujemy. 01101000100100110110 (bcd) = 0110 1000 1001 0011 0110 01101000100100110110(bcd) = 6 x 104 + 8 x 103 + 9 x 102 + 3 x 101 + 6 x 100 01101000100100110110(bcd) = 6 x 10000 + 8 x 1000 + 9 x 100 + 3 x 10 + 6 x 1 01101000100100110110(bcd) = 60000 + 8000 + 900 + 30 + 6 01101000100100110110(bcd) = 68936 Ponieważ cyfry dziesiętne kodowane są na 4 bitach, liczby BCD zawsze posiadają długość będącą wielokrotnością liczby 4. Kod BCD nie jest kodem efektywnym. Np. jedno bajtowa liczba BCD może pomieścić tylko dwie cyfry dziesiętne. Wykorzystane zostaje jedynie 100 słów kodowych (dla liczb od 0 do 99), podczas gdy 1 bajt może przyjąć postać 256 różnych słówek kodowych - 156 nie będzie wykorzystanych. To więcej niż połowa. Przy liczbach 2 bajtowych stosunek ten jest jeszcze gorszy - 10000 liczb z 65536 słów kodowych. Zatem łatwość konwersji na system dziesiętny okupiona została efektywnością kodowania informacji i dlatego system BCD stosowany jest tylko tam, gdzie się to naprawdę opłaca (np. przy obliczeniach, gdzie zależy nam na zminimalizowaniu błędów zaokrągleń przy konwersji dwójkowo-dziesiętnej). Cechą kodu BCD jest to, iż w systemie szesnastkowym poszczególne cyfry dziesiętne odpowiadają bezpośrednio cyfrom szesnastkowym 0...9. Dzięki tej własności można w prosty sposób wprowadzać wartości BCD jako liczby szesnastkowe: 1672(16) = 0001011001110010(2) = 0001 0110 0111 0010(BCD) = 1672(10) Zapamiętaj W systemie BCD każda cyfra dziesiętna wartości liczby zajmuje 4 bity. Bity te przedstawiają dwójkową wartość cyfry. Arytmetyka w systemie BCD Ponieważ liczby w kodzie BCD nie są naturalnymi liczbami dwójkowymi, zatem nie można na nich wykonywać normalnych działań arytmetycznych. Po wykonaniu standardowej operacji nad liczbami w kodzie BCD należy sprawdzić i w razie potrzeby skorygować wynik. Dla dodawania i odejmowania korekcja będzie potrzebna wtedy, gdy dana grupa bitów reprezentujących cyfrę dziesiętną ma wartość większą od 9 (binarnie 1001). W takiej sytuacji do grupy tej należy dodać (dla odejmowania odjąć) wartość binarną 0110 (dziesiętnie 6). Sprawdźmy ponownie (kolorem czerwonym zaznaczono korekcję wyniku): 15 + 35 24 -15 0001 0101 0010 0100 + 0011 0101 -0001 0101 0100 1010 0000 1111 -0000 0110 OOOO 1001 Wynik = 9 + 0000 0110 0101 oooo Wynik = 50 Korekcja musi również wystąpić, gdy w trakcie dodawania wystąpiło przeniesienie (przy odejmowaniu pożyczka) do sąsiedniej grupy bitów. 29 + 19 31 -18 0010 1001 0011 0001 + 0001 1001 -0001 1000 0100 0010 0001 1001 + 0000 0110 -0000 0110 0100 1000 0001 0011 Wynik = 48 Wynik = 13 Zapamiętaj W systemie BCD korekcja przy dodawaniu polega na dodaniu (lub odjęciu przy odejmowaniu) do grupy bitów reprezentujących cyfrę dziesiętną liczby 0110 (6). Korekcję wykonujemy, gdy po operacji arytmetycznej: • grupa bitów nie przedstawia cyfry dziesiętnej • nastąpiło przeniesienie (pożyczka) do następnej grupy bitów Kod Gray'a Konstrukcja wyrazów kodu Gray'a Istnieje wiele przykładów sytuacji, gdzie wymaga się, aby kolejne wyrazy kodowe różniły się między sobą wartością tylko jednego bitu. Jedną z nich są układy pomiarowe (np. kąta zgięcia ramienia robota). Załóżmy, że w takim przypadku zastosowano zwykły kod binarny, dla uproszczenia 3 bitowy. Za pomocą tego kodu przedstawiamy kolejne wartości ugięcia ramienia w zakresie od 0 do 70° z dokładnością co 10°: Kod Wychylenie 000 0° 001 10° 010 20o 011 30° 100 40o 101 50° 110 60° 111 70° Kod binarny tworzony jest na podstawie odczytu czujników np. krzywkowych, które przy odpowiednim położeniu ramienia zwierają zestyki przekaźników lub zamykają strumień świetlny dla fotodiody. Cechą charakterystyczną takich rozwiązań jest to, że z uwagi na różne luzy w układzie krzywka - zestyki następuje przełączanie bitów w różnych punktach, przez co nie wszystkie bity zmieniają się równocześnie. Rozważmy przypadek, gdy ramię robota przesuwa się z położenia 30° na 40°. W pierwszym przypadku kod wynosi 011. Teraz na skutek nie jednoczesnych przełączeń bitów mogą właściwie pojawić się wszystkie dostępne słowa kodowe zanim ustali się wartość 100 dla 40°. Np.: 011 - 111 - 100 Pokazaliśmy możliwe przejście ze stanu 011 do 100. Na początku mamy słowo kodowe 011, które informuje o zajęciu przez ramię robota położenia 30°. Komputer sterujący robotem włącza teraz silniki obrotu ramienia i odczytuje stan czujników. Niestety, na skutek luzów pierwszy bit ustalił się na 1, ale pozostałe 2 nie przeszły jeszcze w stan 0. Co może w takim przypadku "pomyśleć" komputer sterujący ramieniem? Pomyśli, że ramię jest w położeniu krańcowym, tzn. 70° i zmieni obroty silnika, aby cofnąć je z powrotem na 40°. Kod zmieni się na 011, a więc znów będziemy w położeniu wyjściowym. Komputer zmieni kierunek obrotów, odczyta kod 111 i zapętli się. Oczywiście w praktyce konstruktor robota na pewno odpowiednio zabezpieczył by się przed taką możliwością. Jednakże problem istnieje, ponieważ dobraliśmy zły kod. Lepszym rozwiązaniem jest kod Gray'a, który ma taką własność, że kolejne wyrazy różnią się między sobą wartością tylko jednego bitu. Teraz poprzednio opisany problem nie wystąpi, ponieważ przejście z kodu 011 dla 30° na 100 dla 40° zmienia stan tylko pierwszego bitu. Z tego powodu kod Gray'a jest lepszy od naturalnego kodu binarnego w układach pomiarowych, gdzie należy zachować ciągłość odczytów. Zapamiętaj Aby otrzymać i-ty wyraz kodu Gray'a wykonujemy następujące operacje: 1. Zapisujemy numer wyrazu kodu Gray'a w naturalnym kodzie dwójkowym na zadanej liczbie bitów. 2. Pod spodem wypisujemy ten sam numer przesunięty w prawo o 1 bit. Najmniej znaczący bit odrzucamy. Na początku dopisujemy bit o wartości 0. 3. Nad odpowiadającymi sobie bitami wykonujemy operację logiczną XOR. Wynik jest wyrazem w kodzie Gray'a. Liczby zmiennoprzecinkowe Zapis zmiennoprzecinkowy W obliczeniach inżynierskich, matematycznych czy naukowych operuje się wielkościami zarówno bardzo dużymi, jak i bardzo małymi. Zapis takich liczb w systemie binarnym byłby mało efektywny z uwagi na wymaganą ilość bitów. Dzisiaj zapewne można by się z tym pogodzić, ale większość systemów liczbowych dla maszyn cyfrowych opracowano w czasach, gdy pamięć stanowiła poważny procent kosztu całej maszyny i programiści dbali o jej efektywne wykorzystywanie. Z kolei liczby o dużej ilości bitów wymagają więcej czasu na przetworzenie lub sprzętu o większej mocy obliczeniowej. Wobec tego szukano sposobu przedstawiania liczb o dużym zakresie przy pomocy niewielkiej liczby bitów. Rozwiązaniem okazał się zapis zmiennoprzecinkowy. Na pewno spotkaliście już dziesiętny zapis zmiennoprzecinkowy. Chętnie stosują go fizycy dla wielkości bardzo dużych (lub bardzo małych). Na przykład moglibyśmy zapisać, że rok świetlny to 9454254955488000 [m]. Liczbę taką źle się czyta. Jeśli nie jest nam potrzebna wielka dokładność, to możemy zapisać: rok świetlny = 9,45 x 1015 [m] Dużą liczbę zapisaliśmy przy pomocy trzech mniejszych liczb: Mantysy - 9,45 Podstawy - 10 Wykładnika 15 Ponieważ podstawa jest dla danego systemu stała i znana, więc nie musimy jej zapamiętywać wraz z liczbą. Wystarczy informacja o mantysie oraz wykładniku. Niektóre kalkulatory naukowe w ten właśnie sposób prezentują duże liczby: 9,45 15 Sposób ten możemy prosto uogólnić na dowolny, pozycyjny system liczenia. Wzór obliczania wartości liczby zmiennoprzecinkowej jest zawsze ten sam: WFP = m x pw m - mantysa zapisana w systemie o podstawie p p - podstawa danego systemu pozycyjnego W - wykładnik zapisany w systemie o podstawie p. Obliczmy dla przykładu wartość liczby zmiennoprzecinkowej zapisanej w systemie czwórkowym: (3,21 x 1012)(4). Przy obliczaniu tego typu wartości musimy pamiętać, że wszystkie trzy elementy są zapisane w systemie o podstawie p (równej 4). m = 3,21(4) m = 3 x 40 + 2 x 4-1 + 1 x 4-2 m = 3 x 1 + 2 x 1/4 + 1 x 1/16 m = 3 + 2/4 + 1/16 m = 39/16 p = 10(4) p = 1 x 41 + 0 x 40 p=1x4+0x1 p=4 w = 12(4) w = 1 x 41 + 2 x 40 w=1x4+2x1 w=4+2 w=6 (3,21 x 1012)(4) = 39/16 x 46 = 14592 (10) Zapamiętaj Aby obliczyć wartość liczby zmiennoprzecinkowej zapisanej w dowolnym systemie pozycyjnym o podstawie p, oblicz dziesiętną wartość mantysy m oraz wykładnika w podstaw wyniki do wzoru: WFP = m x pw Uwaga: Mantysa jest liczbą stałoprzecinkową ze znakiem, która posiada ustaloną liczbę cyfr całkowitych oraz ułamkowych. Wykładnik jest zawsze liczbą całkowitą. Niejednoznaczność zapisu zmiennoprzecinkowego Pierwszą, charakterystyczną cechą liczb zmiennoprzecinkowych jest niejednoznaczność zapisu wartości liczby. 9,45 x 1015 = 94,5 x 1014 = 0,945 x 1016 Wszystkie trzy zapisy przedstawiają tą samą wartość. Wynika stąd, iż w zapisie zmiennoprzecinkowym liczby można przedstawiać w różnych kombinacjach mantys i wykładników. Stąd nazwa - zmiennoprzecinkowe (ang. floating point number). UKŁADY KOMBINACYJNE Układami kombinacyjnymi nazywamy te elementy techniki cyfrowej, dla których dana kombinacja stanów wejściowych (argumentów funkcji) określa w sposób jednoznaczny kombinację sygnałów wyjściowych. Należą do nich: • bramki • kodery i dekodery • multipleksery i demultipleksery Podstawowe bramki spełniają wszystkie podstawowe funkcje algebry Boole'a oraz dodatkowe, ułatwiające syntezę układów. Należą do nich: BRAMKA NOT (NIE) Tabela prawdy BRAMKA AND (I) Tabela prawdy W obwodzie tym tylko przy zwarciu obu kluczy A i B (stan A=1 i B=1 na "wejściu") świeci się żarówka oznaczająca stan F=1 "na wyjściu" Tablice stanów prawdy nie są ograniczone tylko do dwóch zmiennych, tych zmiennych może być więcej. Rozważmy pewien układ cyfrowy o trzech wejściach A,B,C i wyjściu F. Tablica (stanów) prawdy dla tego układu ma postać. Nr wiersza 0 A B C 0 0 0 F 0 1 0 0 1 1 2 0 1 0 1 3 0 1 1 1 4 1 0 0 0 5 1 0 1 1 6 1 1 0 1 7 1 1 1 1 Każdej zmiennej wejściowej A,B,C i wyjściowej F jest przyporządkowana w tablicy stanów osobna kolumna, a każdemu stanowi układu osobny wiersz. Liczba wierszy zależy od liczby zmiennych wejściowych. Zgodnie z kombinatoryką przy n- dwustanowych zmiennych wejściowych tablica zawiera wierszy; w naszym przypadku wierszy. Tablica stanów (prawdy) służy również do stwierdzenia czy dane wyrażenie jest tautologią - prawem logicznym, tzn. czy jest prawdziwe dla dowolnych wartości (0,1) zmiennych występujących w tym wyrażeniu. Przykład - umieszczonego w tabeli prawa rozdzielczości iloczynu względem sumy, czyli: A*(B+C)=A*B+A*C A 0 0 0 0 1 1 1 1 B 0 0 1 1 0 0 1 1 C 0 1 0 1 0 1 0 1 B+C 0 1 1 1 0 1 1 1 BRAMKA OR (LUB) Tabela prawdy A*(B+C) 0 0 0 0 0 1 1 1 A*B A*C 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 A*B+A*C 0 0 0 0 0 1 1 1 BRAMKA NAND (NIE-I) Tabela prawdy BRAMKA NOR (NIE-LUB) Tabela prawdy BRAMKA XOR (ALBO) Tabela prawdy Za pomocą odpowiednich połączeń bramek można zrealizować każdą funkcję np.: na schematach negację argumentu można oznaczać # UKŁADY KODUJĄCE Kodery Kodery służą do przedstawienia informacji z tylko jednego aktywnego wejścia na postać binarną. Ponieważ istnieje fizyczna możliwość jednoczesnej aktywacji więcej niż jednego wejścia informacyjnego musi istnieć możliwość "uznania" tylko jednego. Tak powstał enkoder priorytetowy, uznający zawsze najstarsze w hierarchii wejście (ignoruje akcje na pozostałych). Znajduje on zastosowanie np. do wprowadzania informacji z prostej klawiatury i tłumaczenie jej na kod zrozumiały dla układu cyfrowego. Koder - UCY 74148 El 0 1 X 0 1 0 X 0 X 0 X 0 X 0 X 0 X 0 X 1 X 0 0 2 X 3 X 4 5 X X 1 1 1 1 1 X X X X X X X X X X XKoder X X X 0 - UCY 74148 - tabela kodowania X X X 0 1 X X 0 1 1 X 0 1 1 1 6 X 1 X 7 X A B C GS EO 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 1 1 1 0 1 1 0 1 1 1 1 0 0 0 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 0 1 X- oznacza wartość nieistotną - tzn. dla wybranego wejścia np. 5 (aktywne 0), niezależnie od stanów na wejściach młodszych i tak zostanie zakodowana 5. Należy zauważyć, że kod wybranego wejścia został przedstawiony w postaci zanegowanego naturalnego kodu dwójkowego. Dekodery Dekoder zamienia kod binarny na jego reprezentację w postaci wybranego tylko jednego wyjścia (aktywne 0). W zależności od ilości wyjść (n) nazywa się dekoderem 1 z N. Dekoder - UCY 7442 AO A1 A2 A3 0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 1 1 1 1 1 1 1 1 0 1 0 0 1 1 0 1 1 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 0 0 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 0 0 0 1 1 1 1 1 1 1 1 1 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 Tabela dekodowania Multipleksery i demultipleksery Multiplekser (MPX) ma zadanie, w zależności od kodu wejścia (kod binarny) połączyć ten numer wejścia ze wspólnym wyjściem. Demultiplekser (DMPX) działa na odwrót. Multipleksery i demultipleksery właściwie należy rozpatrywać łącznie. Oprócz funkcji specjalnych, umożliwiających syntezę układów kombinacyjnych, właściwym ich zastosowaniem jest stworzenie np. toru transmisji danych udostępnianego naprzemiennie informacji na różnych wejściach i kierowanie jej do odpowiednich wyjść. Wymaga to jednak pełnej synchronizacji kodów na wejściach A, B, C. Można jednak przekierować informację na dowolne wyjście demultipleksera. MPX A BC DMPX ABC Multiplekser i demultiplekser z zastosowaniem rzeczywistych układów scalonych UKŁADY SEKWENCYJNE Układem sekwencyjnym nazywamy układ cyfrowy, w którym stan wyjść zależy od stanu wejść oraz od poprzednich stanów układu. Składa się z bramek i przerzutników. Przerzutniki Przerzutnik - układ cyfrowy umożliwiający przechowywanie najmniejszej porcji informacji - jednego bitu. Zmienia swój stan bądź to przez wymuszenie stanu na wejściu (asynchroniczne) lub zaistnienie sygnału zegarowego (synchroniczne). • Asynchroniczne - (RS); • Synchroniczne (RS, JK, T, D flip-flop, D latch). Należy zauważyć, że przerzutnik RS może być asynchroniczny (nie posiada wejścia zegarowego) lub synchroniczny (posiada wejście zegarowe), lecz zawsze posiada tzw. stan zabroniony (kombinacja, która zaprzecza działaniu przerzutnika). Pozostałe przerzutniki pozbawione są tej wady, gdyż są przerzutnikami dwutaktowymi (tzw. master-slave MS). Wszystkie przerzutniki powinny posiadać charakterystyczne wejścia i wyjścia (gwiazdką zaznaczono nie wymagane - w zależności od typu): • wejścia informacyjne synchroniczne (RS, JK, T, D) , • wejścia asynchroniczne zerujące (R) i ustawiające (S) *, • wejście zegarowe synchronizujące (C) *, • wyjście proste (Q), • wyjście zanegowane (NOT(Q)). Przerzutnik - JK Przerzutnik - T (powstaje z połączenia wejść J+K) Przerzutnik - JK Przerzutnik -D latch Przerzutnik - D flip-flop Przerzutnik - D latch Przerzutnik - RS asynchroniczny schemat wykonanego z bramek NOR asynchronicznego przerzutnika RS schemat wykonanego z bramek NAND asynchronicznego przerzutnika RS Rejestry Rejestrem nazywamy układ cyfrowy przeznaczony do krótkoterminowego przechowywania ilości informacji lub do zamiany postaci informacji z równoległej na szeregową albo odwrotnie. Rejestry to układy zbudowane z przerzutników D i z tego względu (zasada działania przerzutnika) służą do przechowywania danych. Znajdują zastosowania w konstrukcjach pamięci oraz nadajnikach - odbiornikach transmisji szeregowej. Rejestry typy • Rejestry z wejściem i wyjściem równoległym - PIPO (ang. parallel input, parallel output). - rejestry zatrzaskowe (ang. latch) /buforowe/ • Rejestry z wejściem i wyjściem szeregowym - SISO (ang. serial input, serial output) - rejestry przesuwające • Rejestry z wejściem szeregowym i wyjściem równoległym - SIPO (ang. serial input, parallel output) • Rejestry z wejściem równoległym i wyjściem szeregowym - PISO (ang. parallel input, serial output) Wejściem cyfrowym szeregowym nazywamy takie wejście, które umożliwia wprowadzanie informacji do układu bit po bicie. Do wprowadzenia słowa n-bitowego potrzeba n taktów zegara. Informacja jest wpisywana szeregowo do rejestru (bit po bicie) i szeregowo wyprowadzana. Rozróżniamy dwa typy rejestrów szeregowych: • FIFO - pierwszy bit "wchodzi", pierwszy "wychodzi", • FILO - pierwszy bit "wchodzi", ostatni "wychodzi". Wejściem cyfrowym równoległym nazywamy takie wejście, które umożliwia wprowadzenie do układu cyfrowego wszystkich bitów słowa w jednym takcie zegarowym. Rejestry z wejściem i wyjściem cyfrowym równoległym Rejestr - równoległo - szeregowy Informacja jest wpisywana równolegle a wyprowadzana szeregowo Liczniki Liczniki są to układy sekwencyjne zbudowane z przerzutników, najczęściej JK lub T. Ich zadaniem jest zliczanie impulsów zegarowych i przedstawianie stanu na wyjściach. Można dokonać podziału liczników pod wieloma względami: Ze względu na s wyróżnialnych stanów (pod względem sposobu powtarzania cyklu): • modulo s (dzielniki liczby impulsów zegarowych - częstotliwości - przez s), • do s, Pod względem sposobu oddziaływania impulsów zliczanych na stan przerzutników licznika: • o stałej długości cyklu, • o programowanej długości cyklu. Pod względem kierunku zliczania: • jednokierunkowe liczące w przód, • jednokierunkowe liczące wstecz, • dwukierunkowe (rewersyjne). Pod względem sposobu oddziaływania impulsów zliczanych na stan przerzutników licznika: • asynchroniczne, • synchroniczne, • asynchroniczno - synchroniczne. Najprostszą formą licznika jest przerzutnik T z podpiętym na stałe wejściem T do logicznej "jedynki". Taki przerzutnik nazywa się "dwójką liczącą". Porównując tabelę prawdy dochodzimy do wniosku, że po każdym impulsie zegarowym przerzutnik zmieni stan na przeciwny. W oparciu o niego można zbudować asynchroniczny licznik liczący np. do 8. Poniżej przedstawiono na wykresie czasowym kolejne stany licznika. Analizując je można stwierdzić że układają się w naturalny kod dwójkowy. Można również zauważyć, że każdy moduł licznika dzieli częstotliwość zegarową przez dwa. Ilość możliwych stanów tak zbudowanego licznika wyraża się wzorem: Istnieje możliwość wprowadzania danych początkowych (programowanie) licznika oraz zmiana kierunku zliczania Sposoby liczenia przez liczniki cyfrowe Rodzaje liczników LICZNIK Z PRZENIESIENIEM SZEREGOWYM (ang. Ripple Carry) LICZNIK Z PRZENIESIENIEM RÓWNOLEGŁYM (ang. LookAhead) UKŁADY ARYTMETYCZNE Sumator SUMATOR realizuje operację dodawania, możliwe jest łączenie ich kaskadowo (sumowanie liczb wielobitowych). Dodajna Ai 0 0 0 0 1 1 1 1 Dodajnik Bi 0 0 1 1 0 0 1 1 Ci-1 0 1 0 1 0 1 0 1 Suma Si 0 1 1 0 1 0 0 1 Przeniesienie Ci 0 0 0 1 0 1 1 1 Przeniesienie Sumator - tabela działania Subtraktor SUBTRAKTOR realizuje operację odejmowania, również możliwe jest łączenie ich kaskadowo. Odjemna Ai 0 0 0 0 1 1 1 1 Odjemnik Bi 0 0 1 1 0 0 1 1 Pożyczka Vi-1 0 1 0 1 0 1 0 1 Różnica Di 0 1 1 0 1 0 0 1 Pożyczka Vi 0 1 1 1 0 0 0 1 Subtraktor - tabela działania Multiplikator MULTIPLIKATOR realizuje operację mnożenia, łączy się je kaskadowo. Jest to dość skomplikowany układ, więc rysunek zostanie pominięty. Komparator KOMPARATOR realizuje o perację porównania, łączy się je kaskadowo relacje wejścia wyjścia A3,B3 A2,B2 A1,B1 A0,B0 A>B A<B A=B A>B A<B A=B > X X X X X X 1 0 0 < X X X X X X 0 1 0 = > X X X X X 1 0 0 = < X X X X X 0 1 0 - = > X X X X 1 0 0 = = < X X X X 0 1 0 = = = > X X X 1 0 0 = = = < X X X 0 1 0 = = = = 1 0 0 1 0 0 - - = = 0 1 0 0 1 0 = = = = 0 0 1 0 0 1 Komparator znak X w tabeli oznacza stan nieistotny ALU Uniwersalna Jednostka Arytmetyczno - Logiczna - realizuje wszystkie wcześniejsze operacje plus operacje logiczne. ALU jest podstawowym elementem ("sercem") każdego mikroprocesora i od jego konstrukcji, skomplikowania, szybkości zależy w znacznej mierze wydajność każdego procesora, a przez to i całego komputera. ALU - uproszczona zasada działania W zależności od stanu wejść sterujących S0 - S3 układ wykonuje różne funkcje (dodawanie , odejmowanie, mnożenie itp.) na liczbach An i Bn, podając wynik na wyjściach Fn. Wejście M przełącza rodzaj funkcji - logiczne / arytmetyczne. Wejścia / wyjścia C0 i C4 wraz z A=B, P i G sygnalizują relacje pomiędzy liczbami An i Bn oraz umożliwiają przeniesienie danych do następnych ALU, gdyż możliwe jest również łączenie tych układów kaskadowo.