Podręcznik
Strona: | SEZAM - System Edukacyjnych Zasobów Akademickich i Multimedialnych |
Kurs: | Układy logiczne |
Książka: | Podręcznik |
Wydrukowane przez użytkownika: | Gość |
Data: | piątek, 22 listopada 2024, 15:42 |
Spis treści
- 1. Algebra Boole’a
- 2. Układy kombinacyjne
- 2.1. Funkcje boolowskie
- 2.2. Działania w algebrze Boole’a, typowe bramki podstawowe, symbole bramek
- 2.3. Postacie kanoniczne funkcji boolowskiej n-zmiennych
- 2.4. Układy funkcjonalnie pełne
- 2.5. Zadawanie funkcji boolowskiej
- 2.6. Realizacja funkcji boolowskich
- 2.7. Opóźnienia bramek, hazardy
- 2.8. Minimalizacja wyrażeń boolowskich
- 2.9. Uwagi końcowe
- 3. Automaty skończone
- 4. Układy sekwencyjne
- 5. Rejestry, liczniki, dzielniki częstotliwości
- 6. Multipleksery, demultipleksery, translatory kodów, komparatory
- 7. Układy arytmetyczne
- 8. Pamięci ROM i RAM
- 9. Układy sterujące
1. Algebra Boole’a
W rozdziale 1 poznaliśmy kody czyli sposoby reprezentacji różnych obiektów (fizycznych, realnych i abstrakcyjnych) w komputerze za pomocą słów (na ogół binarnych). Teraz zajmiemy się układami logicznymi, specjalnymi urządzeniami (z reguły elektronicznymi) do przetwarzania tych słów.
Układy logiczne dzielimy na dwie kategorie:
- układy kombinacyjne (inaczej układy logiczne bez pamięci) oraz
- układy sekwencyjne (inaczej układy logiczne z pamięcią)
W tym rozdziale zajmiemy się układami kombinacyjnymi. W rozdziale następnym zajmiemy się układami sekwencyjnymi. Podstawę matematyczną dla układów kombinacyjnych stanowi algebra Boole'a.
1.1. Algebra Boole’a, definicja
Algebra Boole’a (ang. Boolean algebra) to szczególnego typu algebra ogólna. Dokładniej jest to 6-tka uporządkowana , gdzie jest niepustym zbiorem, a działania i wyróżnione elementy (działania zero argumentowe) spełniają cały szereg warunków tzw. aksjomatów algebry Boole’a. Działanie dwuargumentowe nazywamy sumą, działanie dwuargumentowe nazywamy iloczynem a działanie jednoargumentowe uzupełnieniem. Wyróżnione elementy są takie, że 0 jest zerem (dla działania sumy) jest to tzw. zero algebry Boole'a a 1 jedynką dla działania mnożenia jest to tzw. jedynka algebry Boole'a.
Zanim precyzyjnie zdefiniujemy algebrę Boole'a omówimy nieco prostszą od algebry Boole'a algebrę tzw. kratę (ang. lattice).
Krata to algebra . Działanie dwuargumentowe nazywamy sumą, działanie dwuargumentowe nazywamy iloczynem. Algebra jest kratą wtedy i tylko wtedy, z definicji, gdy spełnione są następujące aksjomaty (w sumie mamy 8 aksjomatów):
(1) | (przemienność sumy i iloczynu) | |
(2) | (łączność sumy i iloczynu) | |
(3) | (idempotentność) | |
(4) | (prawa pochłaniania) |
Zauważmy, że jeśli konsekwentnie zamienimy w powyższych aksjomatach sumę na iloczyn oraz iloczyn na sumę to otrzymamy dokładnie taki sam zestaw aksjomatów.
Krata dystrybutywna (ang. distributive lattice) to krata, w której spełnione są jeszcze dodatkowo dwa aksjomaty: rozdzielczość mnożenia względem dodawania i rozdzielczość dodawania względem mnożenia.
(5) | (rozdzielczość mnożenia względem dodawania) | |
(rozdzielczość dodawania względem mnożenia) |
Algebrę nazywamy algebrą Boole’a jeśli jest kratą dystrybutywną, element 0 jest zerem dla działania dodawania a element 1 jedynką dla działania mnożenia czyli spełnione są równości (6) a ponadto działanie uzupełnienia spełnia równości (7).
(6) | (istnienie zera), (istnienie jedności) |
(7) |
Zapisując wyrażenia algebry Boole’a będziemy zakładać, że działanie uzupełnienia ma największy priorytet a potem w kolejności mnożenie i dodawanie. Tak więc mamy np.
Niech będzie dowolnym niepustym podzbiorem zbioru liczb rzeczywistych. Zdefiniujmy działania i wzorami
Algebra jest kratąZ definicji algebry Boole’a nie wynika, że musi być . Jeśli to algebra Boole’a ma tylko jeden element. Nazywamy taką algebrę Boole’a zdegenerowaną algebrą Boole’a. Algebrę Boole’a, która ma tylko 2 elementy, nazywamy algebą Boole’a dwuelementową.
1.2. Podstawowe własności algebr Boole’a
Fakt: Każda skończona algebra Boole’a ma elementów, tzn. istnieje takie , że
W każdej algebrze Boole’a oprócz wymienionych wyżej 14 aksjomatów prawdziwe są równości
Ostatnie dwie równości noszą nazwę praw de Morgana
Homomorfizm i izomorfizm algebr Boole’a nie różnią się od tych pojęć dla przypadku dowolnej algebry abstrakcyjnej. Homomorfizm dwóch algebr Boole’a i to odwzorowanie zachowujące działania algebry Boole’a tzn. takie, że dla każdego mamy
Izomorfizm to homomorfizm różnowartościowy i „na”.
1.3. Dwuelementowa algebra Boole’a
Jeśli algebra Boole’a ma dokładnie 2 elementy (a ściślej zbiór ma dokładnie 2 elementy), to nazywamy ją dwuelementową algebrą Boole’a.
- nazywamy sumą logiczną (lub dysjunkcją)
- nazywamy mnożeniem logicznym (lub koniunkcją)
- nazywamy negacją
Suma logiczna (dysjunkcja) , iloczyn logiczny (koniunkcja) i negacja są zdefiniowane tabelkami:
Łatwo można sprawdzić, że tak zdefiniowana algebra jest algebrą Boole’a, tzn. spełnione są w niej wszystkie aksjomaty algebry Boole’a. Oczywiście jest to 2-elementowa algebra Boole’a. Mówiąc 2-elementowa algebra Boole’a, mamy z reguły na myśli ten konkretny przykład. Oczywiście wszystkie podane dotychczas ogólne własności algebry Boole’a pozostają prawdziwe jeśli pamiętamy o odpowiedniości
Fakt: Istnieje jedna tylko z dokładnością do izomorfizmu elementowa algebra Boole’a. W szczególności istnieje tylko jedna (z dokładnością do izomorfizmu) 2-elementowa algebra Boole’a.
1.4. Lista podstawowych własności dla 2-elementowej algebry Boole’a
Równości (1)-(7) to aksjomaty algebry Boole’a. Wzory (10) i (11) są prawami de Morgana dla 2-elementowej algebry Boole'a.
2. Układy kombinacyjne
Układy kombinacyjne
2.1. Funkcje boolowskie
Funkcję boolowską nazywamy również funkcją logiczną lub funkcją przełączającą. Funkcja boolowska jest też definiowana nieco ogólniej jako funkcja postaci , gdzie jest niepustym podzbiorem zbioru wszystkich słów binarnych binarnych długości .
Jeśli mówimy „funkcja boolowska argumentowa” nie precyzując to przyjmujemy, że . Jeśli to funkcję boolowską nazywamy zupełną. Jeśli jest właściwym podzbiorem zbioru , to funkcję boolowską nazywamy niezupełną. Jeśli , to funkcję boolowską nazywamy wektorową.
Na ogół mówiąc funkcja boolowska będziemy mieć na myśli funkcję .
Zauważmy, że nawet dla małych liczba wszystkich funkcji boolowskich jest duża. Jest to bowiem liczba wariancji z powtórzeniami zbioru elementowego ze zbioru 2-elementowego, czyli . Dla mamy 16 funkcji ale dla już (to więcej niż 100 milionów).
Rys.1. Układ kombinacyjny o wejściach i jednym wyjściu (układ jednowyjściowy) realizujący funkcję boolowską
Rys. 2. Układ kombinacyjny o wejściach i wyjściach (układ wielowyjściowy) realizujący funkcję boolowską
2.2. Działania w algebrze Boole’a, typowe bramki podstawowe, symbole bramek
W 2 elementowej algebrze Boole’a definiujemy kilka dodatkowych użytecznych w praktyce działań. Zaczniemy od sumy modulo 2 (suma modulo 2 jest szczególnym przypadkiem sumy modulo wprowadzanej w zbiorze ). Sumę modulo 2 oznaczamy symbolem i definiujemy za pomocą tabelki.
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Rys. 3. Tabelka definiująca sumę modulo 2
Podstawowe własności sumy modulo 2 są następujące
Przypomnijmy (por. rozdz.1), że zbiór wraz z działaniami dodawania modulo i mnożenia modulo jest pierścieniem przemiennym z jednością a jeśli , (gdzie pjest liczbą pierwszą) to jest ciałem. Zatem w szczególności z dodawania działaniami modulo 2 i mnożenia modulo 2 jest ciałem.
Łatwo sprawdzić, że 2 argumentowa suma modulo 2 zdefiniowana tabelką z Rys. 2.3 i suma modulo 2 zdefiniowana jako szczególny przypadek sumy modulo (dla ) to to samo działanie. Z kolei iloczyn modulo 2 zdefiniowany jako szczególny przypadek sumy modulo (dla ) to mnożenie logiczne. Zatem trójka uporządkowana jest ciałem. Zatem wprowadzenie w algebrze Boole’a sumy modulo 2 jako działania 2 argumentowego pozwala spojrzeć na zbiór jak na ciało.
Z algebry liniowej wiadomo (jest to prosty do sprawdzenia fakt), że jeśli jest ciałem, to iloczyn kartezjański jest przestrzenią liniową nad ciałem . Zatem również jest przestrzenią liniową nad . Można więc słowa binarne o długości (czyli elementy przestrzeni ) nazywać wektorami.
Podobnie jeśli mamy ustalone dowolne ciało to można rozważać pierścień wielomianów nad ciałem . Tak też można zrobić w przypadku wprowadzając wielomiany nad ciałem .
a)
Bramka NOT realizuje funkcję
b)
Bramka AND czyli bramka iloczynu (dwuwejściowego) realizuje funkcję . Stosowane są również bramki wielowejściowe.
c)
Dwuwejściowa bramka OR czyli bramka sumy (dwuwejściowej) realizuje funkcję . Stosowane są również bramki wielowejściowe.
d)
Dwuwejściowa bramka EXOR czyli bramka sumy modulo dwa (dwuwejściowa) realizuje funkcję . Stosowane są również bramki wielowejściowe EXOR. Bardzo pożyteczna jest w praktyce tożsamość
Rys. 4. Symbole typowych bramek a) bramka NOT, b) bramka AND, c) bramka OR d) bramka EXOR
Teoretycznie rzecz biorąc możemy używać bramek OR, AND, NOR, NAND i EXOR o dowolnej liczbie wejść. Jednak w praktyce liczba wejść pojedynczej bramki rzadko większa jest od 4 ponieważ zbyt duża liczba wejść pogarsza parametry elektryczne układu, a przede wszystkim powiększa czas propagacji bramki.
W praktyce nie można też łączyć wyjścia bramki z dowolną ilością wejść współpracujących bramek. Parametr mówiący tym ile wejść można dołączyć do jednego wyjścia nosi nazwę obciążalności bramki lub wzmocnienia logicznego.
2.3. Postacie kanoniczne funkcji boolowskiej n-zmiennych
Wyrażenie boolowskie (lub forma boolowska) to formalnie poprawnie zbudowany opis funkcji boolowskiej f zawierający wprowadzone w algebrze Boole’a działania i nawiasy opisujące kolejność wykonywanych działań na wprowadzonych zmiennych (argumentach funkcji ). Najczęściej w tworzonych zapisach bierzemy dodatkowo pod uwagę następujący priorytet wykonywanych działań: negacja ma największy priorytet, potem mnożenie a potem dodawanie.
Iloczyn pełny zmiennych (inaczej minterm) to iloczyn zawierający różnych zmiennych zanegowanych lub nie. Minterm dla zmiennych (lub dla argumentów) jest funkcją przyjmująca wartość 1 tylko dla jednego układu argumentów .
Iloczyn niepełny zmiennych to iloczyn zawierający różnych zmiennych zanegowanych lub nie.
Suma pełna zmiennych (inaczej maksterm) to suma zawierająca różnych zmiennych zanegowanych lub nie. Maksterm dla zmiennych (lub dla argumentów) jest funkcją przyjmującą wartość 0 tylko dla jednego układu argumentów .
Suma niepełna zmiennych to iloczyn zawierający różnych zmiennych zanegowanych lub nie.
Postać normalna sumacyjna (inaczej postać normalna dysjunkcyjna) funkcji boolowskiej zmiennych to opis funkcji w postaci sumy iloczynów pełnych lub niepełnych.
Postać normalna iloczynowa (inaczej postać normalna koniunkcyjna) funkcji boolowskiej zmiennych to opis funkcji w postaci iloczynu sum pełnych lub niepełnych.
Implikant. Funkcja boolowska implikuje inną funkcję boolowską jeśli dla każdego układu takiego, że mamy . Funkcję nazywamy implikantem funkcji .
Implikant prosty funkcji boolowskiej zmiennych zapisanej w postaci normalnej sumacyjnej to iloczyn różnych zmiennych (ewentualnie zanegowanych), będący implikantem funkcji posiadający tę własność, że po usunięciu jakiejkolwiek zmiennej z tego iloczynu, tak powstała funkcja przestaje być implikantem funkcji .
Dla każdej funkcji boolowskiej spełniona jest oczywista (proste sprawdzenie) ale pożyteczna równość:
Jest to tzw. wzór na rozłożenie sumacyjne funkcji boolowskiej.
Podobnie uzyskujemy wzór
Jest to tzw. wzór na rozłożenie iloczynowe funkcji boolowskiej.
Stosując wielokrotnie ( krotnie) wzór na rozłożenie sumacyjne funkcji boolowskiej otrzymujemy następujące twierdzenie o postaci kanonicznej sumacyjnej (lub dysjunkcyjnej).
Twierdzenie (o postaci kanonicznej sumacyjnej):
Każdą funkcję boolowską można przedstawić jednoznacznie w postaci sumy implikantów prostych
(*) |
gdzie a jest bitowym zapisem NKB liczby . jest (-argumentowym) mintermem o numerze , tzn. funkcją postaci , gdzie negacje lub ich brak odpowiada liczbie w taki sposób: umieszczamy ciąg bitów nad zmiennymi i tam gdzie nad zmienną stoi 0, wpisujemy negację, a tam gdzie stoi 1, nie wpisujemy negacji.
Równość (*) to tzw. kanoniczna postać sumacyjna (dysjunkcyjna) funkcji boolowskiej .
Podobnie jak wprowadzamy kanoniczną postać sumacyjną można wprowadzić kanoniczną postać iloczynowi (koniunkcyjną) i wykazać twierdzenie o postaci kanonicznej iloczynowej.
2.4. Układy funkcjonalnie pełne
Układy funkcjonalnie pełne (lub jak czasem mówimy systemy funkcjonalnie pełne) to takie zbiory działań, (zestawy bramek) z których możemy zbudować metodą superpozycji (łączenia bramek) dowolną funkcję boolowską.
{negacja, suma logiczna} czyli {NOT, OR}
{negacja, iloczyn logiczny} czyli {NOT, AND}
{NAND 2 wejściowy}
{NOR 2 wejściowy}
Dowody, że powyższe zbiory są układami funkcjonalnie pełnymi sprowadzają się do przedstawienia za pomocą poszczególnych działań z danego zbioru działań:
sumy, iloczynu i negacji.
Korzystamy w tym celu z prawa podwójnego przeczenia i praw de Morgana. Z kolei funkcjonalna pełność zbioru działań {negacja, suma logiczna, iloczyn logiczny} wynika z twierdzenia o postaci kanonicznej sumacyjnej funkcji boolowskiej.
Można wykazać, że żadne inne działanie dwuargumentowe poza NAND i NOR nie wystarcza do zdefiniowania wszystkich działań jedno i dwuargumentowych. Inaczej mówiąc {NAND 2-wejściowy} i {NOR 2-wejściowy} to jedyne układy funkcjonalnie pełne złożone z jednego działania 2 argumentowego.
2.5. Zadawanie funkcji boolowskiej
Tabelka prawdy. Najprostszym pojęciowo opisem funkcji boolowskiej jest tabelka prawdy czyli bezpośrednie podanie wartości funkcji dla wszystkich możliwych układów argumentów. Dla większej liczby argumentów jest to jednak metoda kłopotliwa. Wyobraźmy sobie bowiem tabelkę dla funkcji boolowskiej 16 czy 32 argumentowej.
Rozważmy funkcję boolowską zadaną wyrażeniem boolowskim
Tabelka prawdy jest dla tej funkcji następująca
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
Rys. 5. Tabelka prawdy opisująca pewną funkcję boolowską
Wyrażenie boolowskie. Wygodnie jest funkcję boolowską zadawać wyrażeniem boolowskim czyli forma boolowską.
Tablica Karnaugha. Kolejną stosowaną w praktyce metodą jest tablica Karnaugh. Jest to w gruncie rzeczy odmiana tabelki prawdy.
Tablica Karnaugha to często stosowany sposób opisu, zadawania funkcji boolowskiej z reguły niewielkiej liczby zmiennych 2,3,4,5. Tablice Karnaugh można również wykorzystywać do minimalizacji funkcji boolowskich (niewielkiej liczby zmiennych). Na przykład dla funkcji boolowskiej 4 zmiennych konstruujemy tablicę Karnaugh następująco:
Wypisujemy wartości argumentów w pierwszej kolumnie, tak by stanowiły 2 bitowy kod Gray’a. Podobnie wypisujemy wartości argumentów w pierwszym wierszu, tak by stanowiły 2 bitowy kod Gray’a
2.6. Realizacja funkcji boolowskich
Układy kombinacyjne można budować w różny sposób np.:
• bezpośrednio łącząc bramki. Z bramek NAND, NOR i OR możemy zbudować układ pokazany na Rys. 7.
• wykorzystując bloki funkcjonalne takie jak np. multipleksery, kodery, dekodery, układy PLA i układy PLD
• wykorzystując pamięci stałe ROM, PROM, EPROM
W naturalny sposób do realizacji funkcji boolowskiej można wykorzystać pamięć ROM. Nie jest to metoda oszczędna, ale umożliwia na ogół łatwą realizację i modyfikację funkcji boolowskiej np. w przypadku zastosowania pamięci typu flash.
Rys. 7. Przykład układu kombinacyjnego realizującego pewną funkcję boolowską
2.7. Opóźnienia bramek, hazardy
Bramki rzeczywiste są układami elektronicznymi, realnymi układami fizycznymi wnoszącymi zawsze pewne opóźnienie. Typowe wartości czasu opóźnienia bramek to czasy rzędu 10ns (dla układów TTL średniej skali integracji) do 10 ps (bramki wewnątrz układu scalonego VLSI). Bramkę można więc traktować jako układ opóźniający. Prowadzić to może do powstania stanów nieustalonych układzie kombinacyjnym i do powstania fałszywych sygnałów logicznych. Zjawiska tego typu występujące w układach logicznych nazywamy hazardami. Przykład układu w którym występuje zjawisko hazardu pokazany jest na Rys. 8.
Rys. 8. Przykład układu kombinacyjnego w którym występuje zjawisko hazardu
2.8. Minimalizacja wyrażeń boolowskich
Minimalizacja wyrażeń boolowskich to,proces przekształcania wyrażeń boolowskich w celu otrzymania możliwie najprostszej postaci wyrażenia. Dokładniej minimalizacja wyrażenia boolowskiego to minimalizacja długości wyrażenia boolowskiego zapisującego daną funkcję boolowską. Odpowiada to minimalnej ilości dwuwejściowych bramek AND i OR realizującej daną funkcję boolowską.
Do znanych i praktycznie stosowanych metod minimalizacji dla małej liczby zmiennych należą:
• metoda tablic Karnaugh
• metoda Quine’a – McCluskey’a
Dla dużej liczby zmiennych stosuje się najczęściej program komputerowy do minimalizacji wyrażeń boolowskich o nazwie ESPRESSO. Ściśle rzecz biorąc jest kilka programów ESSPRESSO m.in. program ESPRESSO II i ESPRESSO-MV .
2.9. Uwagi końcowe
Powyższy rozdział traktuje jedynie o podstawach układów kombinacyjnych, więc można odnieść wrażenie, że cały aparat matematyczny z którego korzysta teoria układów kombinacyjnych to jedynie algebra Boole'a, a głównym problemem jest minimalizacja funkcji boolowskiej. Tak jednak nie jest. W bardziej zaawansowanej teorii układów kombinacyjnych korzysta się z bardzo rozbudowanego aparatu matematycznego, m.in. teorii grafów np. korzysta się z twierdzeń o kolorowaniu grafów.
Bardzo ważnymi problemami nie poruszonymi w tym rozdziale są problemy diagnostyki i testowalności układów kombinacyjnych.
3. Automaty skończone
Automaty skończone
3.1. Zegar
Zegar systemu cyfrowego (ang. clock) to układ elektroniczny generujący napięciowy przebieg zegarowy (sygnał zegarowy). Sygnał zegarowy czasem jest również dla uproszczenia nazywany zegarem.
Sygnał zegarowy to prostokątny przebieg okresowy o kształcie pokazanym na Rys.1. Chwile kiedy pojawia się narastające zbocze wyznaczają dyskretne chwile czasu, w których może zachodzić zmiana stanu układu cyfrowego. Możemy powiedzieć, że system cyfrowy działa krok za krokiem w dyskretnych chwilach w takt zegara.
Podobnie chwile kiedy pojawia się zbocze opadające sygnału zegarowego można przyjąć za dyskretne chwile czasu, w których może zachodzić zmiana stanu układu cyfrowego. Trzecim sposobem jest przyjęcie że dyskretne chwile mogą być wyznaczone zarówno przez zbocza narastające jak i opadające.
W abstrakcyjnym opisie systemu cyfrowego wygodnie jest te chwile utożsamiać z liczbami naturalnymi lub całkowitymi. Na ogół w systemie cyfrowym jest jeden zegar i jest to bardzo wygodne. Czasami jednak konieczne jest zastosowanie kilku zegarów w systemie.
Zasadniczymi parametrami charakteryzującymi prostokątny przebieg zegarowy są częstotliwość oraz wypełnienie . Wypełnienie (ang. duty cycle) okresowego przebiegu prostokątnego to stosunek , gdzie jest okresem przebiegu a czas jest czasem trwania „pojedynczego impulsu” por. Rys.1. Typowy przebieg zegarowy ma wypełnienie ½ , ale nie jest to reguła.
Istotna jest w systemach cyfrowych stałość częstotliwości generowanego przebiegu zegarowego. Dlatego też najczęściej jako generatory przebiegu zegarowego wykorzystuje się tzw. generatory kwarcowe wykazujące wyjątkowo dobrą stałość częstotliwości. W sytuacjach specjalnych gdy musimy mieć zegar zsynchronizowany z jedynie słusznym zegarem wszechświatowym (np. w tzw. stemplowaniu czasem dokumentów) to stosuje się synchronizację generatorów kwarcowych z sygnałami czasu systemu GPS.
Częstotliwość zegara może być bardzo różna. Od dołu praktycznie nie mamy żadnych ograniczeń choć istotna jest stromość zboczy przebiegu prostokątnego. Jeśli chodzi o wartości maksymalne to we współczesnych systemach mikroprocesorowych (np. w Pentium 4) częstotliwość zegara przekracza już 3 GHz a w systemach stosujących technologie specjalne 10 GHz.
Z reguły moc wydzielana w układzie cyfrowym jest wprost proporcjonalna do częstotliwości zegara (zależność ta jest w przybliżeniu liniowa). Dzieje się tak dlatego, że bramki logiczne pobierają prąd z układu zasilania głównie w chwilach przełączeń czyli na narastających i opadających zboczach sygnału zegarowego (dotyczy to zarówno bramek TTL jak i NMOS i CMOS).
Z kolei tzw. moc obliczeniowa systemu cyfrowego (jeśli to pojęcie ma sens dla konkretnego systemu cyfrowego) jest na ogół proporcjonalna do częstotliwości zegara.
Ponieważ jednak moc wydzielająca się w układzie rośnie wraz z częstotliwością, to stosowanie wysokich częstotliwości zegara prowadzi do konieczności stosowania specjalnych układów chłodzących (radiatory, wiatraczki a czasem nawet chłodzenie wodne podobne do samochodowego). Układy pracujące z wysokimi częstotliwościami zegara muszą być bardzo starannie zaprojektowane od strony cieplnej każdy bowiem układ ma swoją graniczną temperaturę pracy, której przekroczenie grozi nieodwracalnym zniszczeniem układu.
Ogólnie rzecz biorą systemy cyfrowe dzielimy na synchroniczne tzn. działające w takt zegara i asynchroniczne, w których chwile zmiany stanu układu są wyznaczone przez zmiany stanu wejść. Wszystkie duże systemy cyfrowe takie jak np. mikroprocesory są systemami cyfrowymi synchronicznymi. Sygnał zegarowy albo generowany jest wewnątrz systemu albo doprowadzany jest z zewnątrz.
Rys. 1. Przebieg prostokątny będący sygnałem zegarowym systemu cyfrowego
3.2. Automaty skończone
Automaty skończone są abstrakcyjnymi modelami rzeczywistych systemów cyfrowych.
Automat skończony lub dokładniej deterministyczny automat skończony (DAS) to piątka uporządkowana , gdzie - jest zbiorem stanów, - alfabetem wejściowym, - funkcją przejść automatu, - tzw. stanem początkowym a – zbiorem stanów końcowych.
Stan automatu umożliwia pamiętanie historii wejścia tzn. stan w chwili bieżącej. Ogólnie rzecz biorąc zależy od słowa podanego na wejście w chwilach poprzednich.
Mówimy, że automat skończony akceptuje słowo pojawiające się na wejściu automatu, jeśli ciąg przejść ze stanu do stanu odpowiadający literom słowa wejściowego prowadzi od stanu początkowego do jakiegoś stanu akceptowalnego tzn takiego że .
Automat skończony wyobrażamy sobie jako układ o skończonej liczbie stanów, z jednym wejściem, który znajduje się w pewnym stanie i czyta ciąg symboli z alfabetu , czyli czyta słowo nad alfabetem podane na wejście. Układ działa w dyskretnych chwilach, które dla uproszczenia utożsamiamy z liczbami naturalnymi. W każdej chwili automat może odczytać tylko jedną literę słowa czyta ją i zmienia stan ze stanu zgodnie z funkcją przejścia na po czym automat staje i czeka na następną chwilę. W kolejnych chwilach pojawiają się więc na wejściu litery i następują zmiany stanu. Jeśli tzn. dotarliśmy do stanu akceptującego to uważamy, że automat zaakceptował słowo wejściowe dotychczas podane na wejście automatu.
Jeśli mamy funkcję przejścia to w naturalny sposób można ją rozszerzyć do funkcji definiując następująco:
Język akceptowany przez automat skończony to z definicji zbiór . Język nazywamy językiem regularnym, jeśli jest akceptowany przez jakiś automat skończony
Niedeterministyczny automat skończony to piątka uporządkowana , gdzie jest zbiorem stanów automatu, alfabetem wejściowym, - tzw. stanem początkowym, - zbiorem stanów końcowych a - funkcją przejść automatu niedeterministycznego. Przypominamy, że symbolem oznaczamy zbiór wszystkich podzbiorów zbioru .
Zbiór jest zbiorem wszystkich stanów do których możliwe jest przejście ze stanu pod wpływem litery podanej na wejście automatu.
Zauważmy, że zdefiniowane wyżej automaty są automatami bez wyjścia. Ponieważ w praktyce najczęściej mamy do czynienia z systemami cyfrowymi z wyjściem, dlatego też wprowadza się definicje automatów skończonych z wyjściem.
Automat skończony z wyjściem to szóstka uporządkowana , gdzie są alfabetami, i są funkcjami oraz . to alfabet wejściowy, alfabet wyjściowy a jest tzw. zbiorem stanów. Funkcja nosi nazwę funkcji przejść, funkcja nazywa się funkcją wyjść, a jest tzw. stanem początkowym. Tak zdefiniowany automat nazywa się automatem Moore’a.
Jeśli funkcja jest funkcją bezpośrednio zależną od wejścia tzn. , to taką szóstkę uporządkowaną nazywamy automatem Mealy'ego.
Automat skończony z wyjściem wyobrażamy sobie jako układ o skończonej liczbie stanów, z jednym wejściem i jednym wyjściem, który znajduje się w pewnym stanie i czyta ciąg symboli z alfabetu czyli czyta słowo nad alfabetem podane na wejście. Układ działa w dyskretnych chwilach, które dla uproszczenia utożsamiamy z liczbami naturalnymi 1,2,3..... W każdej chwili automat może odczytać tylko jedną literę słowa czyta ją i zmienia stan ze stanu zgodnie z funkcją przejścia na i wyprowadza na wyjście literę w przypadku automatu Moore’a lub w przypadku automatu Mealy’ego po czym automat staje i czeka na następną chwilę. W kolejnych chwilach pojawiają się więc na wejściu litery , na wyjściu litery i następują zmiany stanu. Automaty Moore’a i Mealy’ego są więc urządzeniami do przetwarzania słów.
Układ sekwencyjny to układ elektroniczny realizujący automat skończony.
Rys. 2. Przetwarzanie słów przez automat skończony bez wyjścia
Rys. 3. Przetwarzanie słów przez automat skończony z wyjściem
Rys. 4. Schemat blokowy układu automat skończony z wyjściem a) automat Moore’a, b) automat Mealy’ego
Rys. 5. Struktura uniwersalna automatu Moore’a z kodowaniem binarnym symboli wejściowych, wyjściowych i stanów; rejestr stanu jest rejestrem r bitowym
Rys. 6. Struktura uniwersalna automatu Mealy’ego z kodowaniem binarnym symboli wejściowych, wyjściowych i stanów
Opis automatu grafem. Z każdym automatem skończonym wiążemy diagram przejść lub dokładniej graf automatu. Jest to graf skierowany w którym wierzchołki grafu odpowiadają stanom automatu Jeśli w automacie istnieje przejście ze stanu do stanu przy wejściu to diagram zawiera gałąź prowadzącą ze stanu do stanu i opatrzoną etykietą .
Rys.7. Opis automatu grafem. Z każdym automatem skończonym wiążemy diagram przejść czyli graf skierowany opisujący działanie automatu
4. Układy sekwencyjne
Układy sekwencyjne
4.1. Przerzutniki
Koncepcja by budować „duże” automaty z „małych” jest naturalna i praktyczna. I tak się właśnie robi definiując i konstruując elementarne cegiełki tzw. automaty elementarne. Takimi właśnie automatami są przerzutniki, które definiujemy poniżej. Przerzutnik jest układem elektronicznym (bardzo rzadko stosuje się inne rozwiązania), który może przebywać w jednym z dwóch stabilnych stanów dowolnie długo. Mówimy, że układ jest bistabilny. Ponieważ za pomocą sygnałów zewnętrznych (wejść przerzutnika) możemy zmieniać stan układu, układ przerzutnika bistabilnego jest elementarnym układem pamięciowym zdolnym do zapamiętania jednego bitu, zera albo jedynki. Oddziaływanie za pomocą sygnałów zewnętrznych na układ przerzutnika bistabilnego zmierzające do zmiany jego stanu nazywamy wyzwalaniem przerzutnika.
Przerzutniki dzielimy na synchroniczne i asynchroniczne. Przerzutniki synchroniczne mają specjalne wejście zegarowe (zwykłe oznaczane symbolem CLK) i mogą zmieniać stan tylko na narastającym lub opadającym zboczu sygnału zegarowego doprowadzonego do wejścia CLC. Przerzutniki asynchroniczne reagują na zmiany na wejściach natychmiast tzn. nie czekając na przyjście zbocza impulsu zegarowego. Często jednak ten sam układ elektroniczny przerzutnika jest jednocześnie układem synchronicznym i asynchronicznym.
Przerzutnik typu D jest przerzutnikiem synchronicznym opisanym tabelką.
Przerzutnik typu D najczęściej wyzwalany jest zboczem narastającym impulsu zegarowego. Mówimy, że „działa od przedniego zbocza”. Oznaczenie D pochodzi od słowa angielskiego delay czyli opóźnienie. D jest tzw. wejściem informacyjnym. Na wejście CLK podawany jest przebieg zegarowy. Przerzutnik typu D jest bardzo ważnym typem przerzutnika służy do konstrukcji m.in. rejestrów i liczników.
Rys.1. Przerzutnik typu D, synchronizowany narastającym zboczem (strzałka kończąca doprowadzenie sygnału zegarowego nie jest zaczerniona ani nie ma kółeczka); wejścia Set i Reset są asynchronicznymi wejściami ustawiającymi; sygnałem aktywnym jest poziom niski L czyli 0
Przerzutnik J-K jest dwuwejściowym przerzutnikiem synchronicznym opisanym tabelką.
Wejście J jest tzw. wejściem ustawiającym lub zapalającym wejście K jest tzw. wejściem zerującym lub gaszącym. Jednoczesne podanie 1 na wejścia J i K powoduje zmianę stanu przerzutnika na przeciwny. Przerzutnik J-K nieco częściej stosowany jest jako przerzutnik synchronizowany opadającym zboczem (ang negative edge triggered flip-flop) niż jako przerzutnik synchronizowany narastającym zboczem (ang positive edge triggered flip-flop).
Przykładem układu przerzutnika J-K synchronizowanego przednim zboczem (czyli narastającym zboczem) jest układ SN74108 serii SN74, a przykładem układu synchronizowanego opadającym zboczem jest układ SN74107.
Rys.2. Przerzutnik typu J-K, synchronizowany opadającym zboczem (strzałka kończąca doprowadzenie sygnału zegarowego nie jest zaczerniona ale ma kółeczko); wejście jest asynchronicznymi wejściem zerującym; sygnałem aktywnym jest poziom niski L czyli 0
W technice cyfrowej stosowane są również bardzo podobne do przerzutników synchronicznych J-K przerzutniki synchroniczne R-S (R od ang. reset (wyzeruj), S od ang. set (ustaw 1)). Różnica w ich definicji polega jedynie na tym, że w przerzutniku R-S stan jest zabroniony. Nie można jednocześnie usiłować zapalić i zgasić przerzutnika.
Przerzutnik typu T jest jednowejściowym przerzutnikiem synchronicznym opisanym tabelką.
Widać, że jedynka podana na wejście T zmienia stan przerzutnika na przeciwny. Przerzutnik typu T uzyskamy łatwo z przerzutnika J-K łącząc wejścia J i K razem.
Przerzutniki asynchroniczne to przerzutniki bistabilne nie mające wejścia zegarowego i ich stan zależy bezpośrednio od wartości wejść. Podstawowa koncepcja układu przerzutnika bistabilnego asynchronicznego to układ złożony z dwóch inweterów połączonych pętlą dodatniego sprzężenia zwrotnego.
Rys. 3. Podstawowa koncepcja układu przerzutnika bistabilnego; dwa inwetery połączone pętlą sprzężenia zwrotnego. Rysunki a) i b) ilustrują 2 stany stabilne układu
Przerzutnik r-s (czasami mówimy asynchroniczny przerzutnik R-S) to układ przerzutnika bistabilnego z dwoma wejściami asynchronicznymi R (reset, zerowanie, gaszenie) i S (set, ustawianie 1, zapalanie).
Rys.4. Przerzutnik bistabilny asynchroniczny R-S
Dwójka licząca lub przerzutnik typu t to przerzutnik bistabilny z jednym wejściem oznaczanym symbolem t, który zmienia stan w momencie pojawienia się opadającego zbocza prostokątnego impulsu podanego na wejście t.
Dwójkę liczącą łatwo można zrealizować za pomocą przerzutnika synchronicznego.
Rys. 5. Realizacja dwójki liczącej (przerzutnika typu t) za pomocą przerzutnika typu D
Rys. 6. Realizacja dwójki liczącej (przerzutnika typu t) za pomocą przerzutnika J-K
5. Rejestry, liczniki, dzielniki częstotliwości
Bloki funkcjonalne systemów cyfrowych nazywa się też układami funkcjonalnymi. Są to układy logiczne realizujące pewne potrzebne w praktyce funkcje. Z punktu widzenia projektanta systemu cyfrowego bloki funkcjonalne to elementarne „cegiełki”, z których w naturalny sposób można konstruować bardzo nawet złożone systemy.
5.1. Rejestry
Rejestry (ang. registers) pełnią rolę bardzo szybkiej pamięci dla słowa binarnego. Rejestr to układ elektroniczny (zbudowany z reguły z n przerzutników bistabilnych) przeznaczony do pamiętania 1-go słowa binarnego o ustalonej długości n. Taki rejestr nazywamy rejestrem n-bitowym Długość pamiętanego słowa to długość rejestru. Na ogół rejestr ma typową długość 8, 16, 32, 64, 128 bitów.
Najczęściej rejestr nazywamy w jakiś sposób np. mówimy: rejestr akumulatora, rejestr stanu, rejestr indeksowy, rejestr bazowy, rejestr uniwersalny, rejestr R12 itd.
Rejestry dzielimy na 4 zasadnicze rodzaje:
- rejestry równoległo – równoległe.
- rejestry szeregowo – szeregowe
- rejestry równoległo – szeregowe
- rejestry szeregowo – równoległe
Rys. 1. Typowe oznaczenie rejestru równoległo-równoległego - rysunek a) i sygnał WR wpisujący słowo binarne do rejestru - rysunek b)
Rejestr równoległo-równoległy (ang. parallel-in parallel out register) to taki, na którego wejście podajemy równolegle n bitowe słowo. Wpis słowa do rejestru następuje po podaniu na wejście wpisujące prostokątnego sygnału „zapisz” oznaczonego na Rys.1 symbolem WR. Wpisanie informacji do rejestru następuje na narastającym (albo opadającym) zboczu sygnału WR. Na wyjściu układu pojawia się zapisane słowo por Rys. 1. Realizacja rejestru równoległo-równoległego za pomocą przerzutników typu D pokazana jest na Rys. 2.
Rys.2. Realizacja 4 bitowego rejestru równoległo-równoległego za pomocą przerzutników typu D; na narastającym zboczu prostokątnego sygnału WR słowo binarne a0a1a2a3 podawane na wejście układu wpisywane jest do rejestru
Rejestr szeregowo-szeregowy (rejestr przesuwny, ang. serial in - serial out register lub shift register) (por. Rys. 3) ma 1 wejście szeregowe (1-bitowe) i jedno wyjście szeregowe (1-bitowe). W takt sygnału WR (sygnał wpisz) wpisujemy 1 bit z wejścia szeregowego. Rejestr szeregowo – szeregowy jest swego rodzaju układem opóźniającym. Realizacja rejestru szeregowo -szeregowego za pomocą przerzutników typu D pokazana jest na Rys. 4.
Rys. 3. Typowe oznaczenie rejestru szeregowo-szeregowego - rysunek a) i sygnał WR wpisujący pojedynczy bit do rejestru - rysunek b)
Rys. 4. Realizacja 4 bitowego rejestru szeregowo -szeregowego za pomocą przerzutników typu D
Rejestr szeregowo-równoległy (ang. serial in – parallel out register) to taki rejestr, do którego słowo binarne wpisujemy bit po bicie odczyt natomiast jest równoległy. Schemat rejestru szeregowo-równoległego pokazany jest na Rys. 5. Realizacja rejestru szeregowo-równoległego za pomocą przerzutników typu D pokazana jest na Rys. 6.
Rys. 5. Typowe oznaczenie rejestru szeregowo – równoległego - rysunek a) i sygnał WR wpisujący pojedynczy bit do rejestru - rysunek b)
Rejestr równoległo-szeregowy (ang. parallel in - serial out register). Słowo binarne do rejestru wpisujemy równolegle sygnałem WR, odczyt natomiast jest szeregowy bit po bicie. Do przesunięcia zawartości rejestru o jeden bit tak by był widoczny na wyjściu kolejny bit służy sygnał Shift (przesuń). Schemat rejestru równoległo-szeregowego pokazany jest na Rys. 7.
Rys. 6. Realizacja 4 bitowego rejestru szeregowo–równoległego za pomocą przerzutników typu D
Rys. 7. Typowe oznaczenie rejestru równoległo-szeregowego - rysunek a) i sygnał WR wpisujący pojedynczy bit do rejestru - rysunek b)
5.2. Liczniki
Licznik (ang counter lub binary counter) to układ elektroniczny przeznaczony do zliczania impulsów. Licznik ma wejście szeregowe na które podajemy impulsy (na ogół prostokątne) i wyjście równoległe na którym mamy słowo reprezentujące liczbę impulsów zliczonych (w ustalonym kodzie na ogół kodzie NKB). Licznik z reguły ma dodatkowe wejście ustawiające licznik w stanie początkowym tzw. wejście zerujące oznaczane najczęściej symbolem R (od ang. reset).
Liczniki dzielimy na synchroniczne i asynchroniczne. Jeśli przerzutniki wchodzące w skład licznika zmieniają stan dokładnie w momencie przyjścia opadającego zbocza zliczanego impulsu prostokątnego to taki licznik nazywamy synchronicznym. W sytuacji gdy zmiana stanu licznika wymuszana jest zmianą stanu innych przerzutników a więc z reguły odbywa się z pewnym opóźnieniem (por. opóźnienie bramek) to licznik nazywamy asynchronicznym.
Ważny jest kod numeryczny w jakim liczy licznik. Najczęściej jest to kod NKB, ale można budować liczniki liczące w innych kodach np. kodzie BCD czy kodzie Gray’a.
Rys.8. Licznik, impulsy prostokątne pojawiające się na wejściu układu nie muszą być okresowe choć często na wejście licznika podajemy przebieg zegarowy
Licznik modulo m (gdzie ) to licznik przechodzący po wyzerowaniu przez stany 0,1,2,..., m-1,0, 1,2,...itd czyli podający na wyjściu liczbę impulsów wejściowych modulo m. Każdy typowy licznik jest licznikiem modulo pewna liczba m.
Najczęściej w praktyce wykorzystujemy liczniki modulo 2n czyli dla m=2n i jeśli mówimy licznik binarny to mamy na ogół na myśli taki właśnie licznik
Rys.9. Graf wyjaśniający zmiany stanu licznika modulo m; pojawienie się opadającego zbocza impulsu wejściowego (zbocze opadające oznaczone jest na rysunku symbolem 1/0) powoduje przejście licznika do następnego stanu (czyli zliczenie impulsu)
Liczniki programowane to liczniki w których liczba m jest podawana (w kodzie NKB) na specjalne wejście programujące.
Warto zauważyć, że każdy licznik jest jednocześnie dzielnikiem częstotliwości, który częstotliwość okresowego prostokątnego sygnału podawanego na wejście zamienia na przebieg prostokątny o mniejszej częstotliwości z reguły .
Rys. 10. Licznik programowany, na wejście programujące podawana jest liczba ,
Rys. 11. Impulsy prostokątne podawane są na wejście licznika; impulsy są rejestrowane po przyjściu opadającego zbocza impulsu
Rys. 12. Licznik jako dzielnik częstotliwości
Rys. 13. Licznik asynchroniczny modulo z budowany z dwójek liczących (przerzutników typu t)
Ogólnie rzecz biorąc liczniki dzielimy na
- liczniki jednokierunkowe
- liczniki dwukierunkowe czyli rewersyjne
Z kolei liczniki jednokierunkowe dzielimy na
- liczące w przód (kolejny impuls zwiększa zawartość licznika)
- liczące wstecz (kolejny impuls zmniejsza zawartość licznika)
Licznik rewersyjny to licznik ze specjalnym wejściem 1-bitowym określającym kierunek zliczania.
Istotnym parametrem licznika jest maksymalna dopuszczalna częstotliwość impulsów zliczanych. Dopuszczalna tzn. taka przy której licznik działa jeszcze poprawnie.
6. Multipleksery, demultipleksery, translatory kodów, komparatory
Multipleksery, demultipleksery, translatory kodów, komparatory
6.1. Multipleksery i demultipleksery
Multiplekser jest układem kombinacyjnym. Układ multipleksera ma 1 wejście adresowe (k-bitowe), 1 wyjście informacyjne (n-bitowe) i pewną liczbę (oznaczmy ją przez m) n-bitowych wejść informacyjnych.
Najczęściej liczba wejść informacyjnych jest potęgą 2 i przy k-bitowym wejściu adresowym liczba wejść informacyjnych jest równa m=2k. Każe wejście ma sobie przypisany adres od 0 do m-1. Słowo binarne z wybranego adresem wejścia jest przekazywane na wyjście. Nie wybrane adresem wejścia nie mają wpływu na stan wyjścia. Wejście jest wybrane słowem binarnym (adresem) podanym w kodzie NKB na wejście adresowe.
Multiplekser jest więc rodzajem „zwrotnicy kolejowej” dla „podróżujących” słów binarnych.
Oznaczenie multipleksera pokazane jest na Rys. 1. Multipleksery są bardzo użytecznymi układami. Można z nich w naturalny , łatwy sposób budować układy kombinacyjne.
Rys. 1. Oznaczenie multipleksera
Układ demultipleksera ma 1 wejście adresowe (k-bitowe), 1 wejście informacyjne (n-bitowe) i pewną liczbę n-bitowych wyjść. Najczęściej liczba wyjść jest potęgą 2 analogicznie jak w przypadku multiplekserów jest równa m=2k. Słowo binarne z wejścia jest przekazywane na wybrane wyjście (wybrane adresem podanym na wejście adresowe). Na pozostałe wyjścia wyprowadzane są same zera. Demultiplekser jest więc podobnie jak multiplekser rodzajem „zwrotnicy kolejowej” dla „podróżujących” słów binarnych. Oznaczenie demultipleksera pokazane jest na Rys. 2.
Multipleksery i demultipleksery są często nazywane układami komutacyjnymi.
Rys. 2.Oznaczenie demultipleksera
Rys. 3. Multiplekser z 2 wejściami informacyjnymi 1-bitowymi i jednym wejściem adresowym
6.2. Translatory kodów
Translatory kodów to układy kombinacyjne tłumaczące słowa kodowe jednego kodu na słowa innego kodu. Różnych translatorów kodów jest dużo ponieważ wiele jest różnych kodów. Do bardziej znanych należą koder, dekoder, translator kodu Gray’a na kod NKB, translator kodu NKB na kod Graya, kodery priorytetowe, translatory kodu „1 z 10” na kod BCD 8421 itd.
Rys. 4. Translator kodów
Koder i dekoder to najważniejsze w praktyce translatory kodów. Koder zamienia słowa kodu „1 z 2n” na n bitowy kod NKB koder odwrotnie zamienia słowa n bitowego kodu NKB na kod 1 „z 2n”.
Rys. 5. Realizacja dekodera za pomocą demultipleksera
6.3. Komparatory
Komparatory dzielimy na równoległe i szeregowe. Komparatory równoległe to układy kombinacyjne porównujące dwa słowa binarne i w kodzie NKB.
Na wejście układu podajemy więc 2 słowa i i zależnie od wyniku porównania na jednym z 3 wyjść 1-bitowych pojawia się jedynka
Jeśli a = b to na wyjściu oznaczonym symbolem ”=” mamy ”1” (a na pozostałych ”0”).
Jeśli a > b (w kodzie NKB) to na wyjściu oznaczonym symbolem ”>” mamy ”1” (a na pozostałych ”0”).
Jeśli a < b (w kodzie NKB) to na wyjściu oznaczonym symbolem ”<” mamy ”1” (a na pozostałych ”0”).
Komparator szeregowy to układ sekwencyjny porównujący bit po bicie odpowiadające sobie bity słów i od strony bardziej znaczących bitów. Bity i są wprowadzane na wejście układu w takt zegara. Wynik porównania pojedynczych bitów musi być zapamiętany stąd konieczność zastosowania układu sekwencyjnego. Wynik wsteczny porównania uzyskujemy po n taktach zegara.
Rys. 6. Komparator równoległy porównuje dwa słowa binarne i traktując je jak słowa kodowe kodu NKB
Warto zauważyć, że najprostszym komparatorem z jednym wyjściem ”=” (komparatorem porównującym tylko 2 bity) jest zanegowana suma modulo 2.
7. Układy arytmetyczne
Układy arytmetyczne to układy (kombinacyjne lub sekwencyjne) realizujące dodawanie odejmowanie i mnożenie i dzielenie. Zaczniemy od układów sumatorów.
7.1. Sumatory
Zaczniemy omawianie sumatorów od półsumatora, układu, który dodaje 2 bity bez uwzględnienia przeniesienia z poprzedniej pozycji.
Układ dodający 2 bity powinien mieć 2 wyjścia: wyjście sumy i wyjście przeniesienia . Łatwo zauważyć, że układ półsumatora opisują 2 funkcje boolowskie oraz , gdzie jest sumą a przeniesieniem. Układ realizujący półsumator pokazany jest na rys. 20.
Rys 1. Układ realizujący półsumator (bit sumy), (bit przeniesienia)
Sumator jednobitowy pełny to układ kombinacyjny dodający 2 bity z uwzględnieniem przeniesień. Sumator jednobitowy pełny ma 3 wejścia (, - bity sumowane oraz przeniesienie z poprzedniej pozycji) oraz 2 wyjścia: wyjście sumy i wyjście przeniesienia na następną pozycję . Łatwo zauważyć, że układ sumatora opisują 2 funkcje boolowskie
gdzie jest sumą, przeniesieniem na pozycję a przeniesieniem. na pozycję . Układ realizujący sumator jednobitowy pełny pokazany jest na rys 2. Jeśli czas opóźnienia bramki oznaczymy przez to czas po którym uzyskujemy w tym układzie poprawny bit sumy to . Poprawny bit przeniesienia uzyskujemy po czasie .
Rys. 2. Układ realizujący jednobitowy sumator pełny
Sumator równoległy jest układem kombinacyjnym o strukturze pokazanej na rys. 3. Dodajemy 2 liczby i w zapisie NKB (o stałej długości słowa kodowego). Liczby dodawane i reprezentowane są słowami binarnymi
Suma reprezentowana jest słowem . Współpracujące ze sobą sumatory pełne realizują na kolejnych pozycjach słowa dodawanie (z uwzględnieniem przeniesień) a więc oraz . Warto zauważyć, że słowo wyniku sumowania (odczytywane w bitowym w kodzie NKB) jest równe liczbie wtedy i tylko wtedy gdy . Jeśli to mówimy, że wystąpił nadmiar przy dodawaniu w kodzie NKB. W typowych mikroprocesorach pojawienie się jest zapamiętywane, powoduje ustawienie przerzutnika znacznika przeniesienia CF (ang. carry flag) na 1. Oczywiście słowo bitowe zawsze reprezentuje poprawnie w kodzie NKB ( bitowym) liczbę .
Rys. 3. Sumator równoległy zbudowany z jednobitowych sumatorów pełnych
Ogólnie rzecz biorąc w systemach cyfrowych słowa binarne możemy przetwarzać równolegle (tak jest szybciej) lub szeregowo czyli bit po bicie (tak jest oszczędniej tzn. mniejsza ilość 2
bramek jest potrzebna do realizacji układu).
Sumator szeregowy jest typowym układem z szeregowym przetwarzaniem informacji. Schemat układu pokazany jest na rys. 4. Układ dodaje szeregowo dwa słowa binarne i bit po bicie od strony najmniej znaczących bitów tzn. w pierwszym takcie zegara podajemy na wejścia sumatora bity i w drugim i itd. Dodawanie trwa więc taktów zegara.
Rys. 4. Sumator szeregowy
Układ sumatora równoległego o strukturze pokazanej na Rys. 3. sumuje 2 liczby w czasie , gdzie jest czasem opóźnienia bramki. Stosując układ przewidywania przeniesień (ang. look ahead) możemy znacznie przyśpieszyć działanie układu sumatora równoległego. Żeby opisać działanie układu przewidywania przeniesień wprowadzamy dla każdej i-tej pozycji 3 pomocnicze funkcje (określające stan pozycji) zdefiniowane następująco
- wtedy i tylko wtedy gdy pozycja jest w stanie propagacji
- wtedy i tylko wtedy gdy pozycja jest w stanie generacji
- wtedy i tylko wtedy gdy pozycja jest w stanie generacji 0
Zauważmy, że
Zatem gdybyśmy dysponowali bramkami o odpowiedniej ilości wejść, można by obliczyć każde przeniesienie w czasie . Układ sumatora wykorzystujący układ przewidywania przeniesień jest więc potencjalnie znacznie szybszy od zwykłego układu sumatora równoległego. Układ sumatora z przewidywaniem przeniesień pokazany jest na Rys.5.
Rys. 5. Sumator równoległy z układem przewidywania przeniesień
8. Pamięci ROM i RAM
Pamięci ROM i RAM
8.1. Pamięci ROM
Ogólnie rzecz biorąc pamięci dzielimy na ulotne (ang volatile memory) i nieulotne (ang. nonvolatile memory). Pamięci ulotne to takie, w których przechowywana informacja znika po wyłączeniu zasilania (tracimy ją bezpowrotnie) a nieulotne to takie, które nie tracą zapisanej informacji po wyłączeniu zasilania.
Wyobrażamy sobie pamięć jako zestaw rejestrów bitowych (por. rys 25), które nazywamy komórkami (ang locations). Każda komórka ma przyporządkowany adres jednoznacznie ją identyfikujący. Możemy więc powiedzieć, że pamięć to zestaw zaadresowanych rejestrów. Podstawowymi parametrem pamięci jest jej pojemność wyrażana na ogół liczbą pamiętanych bajtów oraz długość pamiętanego w pamięci słowa. Każda pamięć ma specjalne wejście tzw. wejście adresowe na które podawany jest adres wybranej komórki. Pamięci dzielimy na 2 zasadnicze grupy: pamięci ROM (tylko do odczytu) i pamięci RAM (do odczytu i zapisu).
Rys.1. Pamięć jako zestaw rejestrów (tzw. komórek) zaadresowanych liczbami całkowitymi ze zbioru ; z reguły dla pewnego , czyli liczba komórek pamięci jest na ogół potęgą 2
Pamięć ROM (ang. Read Only Memory) to inaczej tzw. pamięć stała (por. Rys. 2.). Jest to pamięć, z której możemy tylko odczytywać informacje podając na wejście adresowe pamięci ROM liczbę ze zbioru czyli adres. Adres podawany jest z reguły w kodzie NKB (naturalny kod binarny). Nie tracimy danych po wyłączeniu zasilania pamięci ROM. Pamięć ROM zaliczana jest więc do kategorii pamięci nieulotnych (ang. nonvolatile memory). Wyjście danych jest na ogół wyjściem trójstanowym. Typowa pamięć stała ma 2 wejścia sterujące (output enable) i (chip enable). Stan wysokiej impedancji wyjścia uzyskujemy dla . Sygnał wyłącza układ ROM. Jeśli i , to na wyjściu mamy słowo n-bitowe napisane w pamięci pod adresem a.
Żeby pamięć ROM była użyteczna, musi być w pewien sposób jak mówimy zaprogramowana, tzn. do jej komórek muszą być wpisane słowa, które chcemy pamiętać. Współczesne pamięci ROM mogą być albo programowane maską w fabryce albo mogą być też w łatwy sposób programowane przez użytkownika. (są to tzw. pamięci PROM od ang. Programmable ROM).
Istnieje wiele typów pamięci PROM m.in. pamięci EPROM (Electrically Programmable ROM), EEPROM (Electrically Erasable ROM) oraz pamięci typu flash. Pamięci flash stanowią odmianę pamięci EEPROM czyli pamięci kasowalnych elektrycznie. Pamięci flash dają się jednak kasować (w całości lub dużych blokach) bardzo szybko (w około 1ms).
Najczęściej stosowanymi obecnie pamięciami ROM są właśnie pamięci typu flash. Np. część systemu operacyjnego komputera nazywana BIOS (Basic Input Output System) jest zapisywana z reguły w pamięci typu flash.
Z punktu widzenia teorii układów logicznych pamięć ROM jest uniwersalnym układem kombinacyjnym. Dlatego też wygodnie jest małe pamięci ROM realizować jako tzw. układy PLA (ang Programmable Logic Array) (por. następny podrozdział). Jednocześnie za pomocą pamięci ROM można łatwo zrealizować dowolny układ kombinacyjny lub automat skończony. Istota rzeczy polega tu oczywiście na zapamiętaniu funkcji boolowskiej lub funkcji przejść i wyjść opisującej automat.
Do współczesnych pamięci PROM można z reguły dane zapisywać wielokrotnie, ale zapis nowych danych trwa relatywnie długo w porównaniu z czasem odczytu lub wymaga użycia specjalnych urządzeń programujących tzw. programatorów (por. pamięci PROM, EPROM, EEPROM).
Wszystkie pamięci ROM są pamięciami półprzewodnikowymi choć oczywiście można skonstruować pamięć w której słowa binarne będziemy pamiętać za pomocą odpowiednio włączonych przełączników mechanicznych.
Rys. 2. Pamięć stała czyli pamięć ROM
8.2. Pamięci RAM
Pamięć RAM (ang. Random Access Memory) to inaczej pamięć o dostępie swobodnym. Jest to uporządkowany zestaw rejestrów (komórek), z których każdy jest jednoznacznie identyfikowany przez liczbę z czyli adres. Różnica pomiędzy pamięciami ROM i RAM polega na tym, że do komórek pamięci RAM możemy zapisywać słowa binarne i odczytywać z nich zapisane słowa, natomiast pamięć ROM służy zasadniczo tylko do odczytu.
Pamięć RAM (por. Rys. 3) ma wejście adresowe, wejście danych wyjście danych i dwa wejścia sterujące: wejście wyboru układu (Chip Enable) (czasami oznaczane jako od ang. chip select) i wejście mówiące o tym czy dane zapisujemy czy odczytujemy. Adres podawany jest z reguły jako słowo binarne kodzie NKB (naturalny kod binarny). Najczęściej adresy są kolejnymi liczbami całkowitymi od 0 do , gdzie k jest długością słowa adresowego. Wszystkie adresy pamięci nazywamy przestrzenią adresową.
Rejestry składające się na pamięć nazywamy komórkami (pamięci). Liczbę komórek pamięci nazywamy pojemnością pamięci. Typowe pojemności pamięci RAM we współczesnym systemie mikrokomputerowym to 128 MB do 1 GB, ale można spotkać stacje robocze z pamięcią RAM np. 4GB. Z kolei w bardzo prostych mikroprocesorach jednoukładowych stosowane są pamięci RAM np. o pojemności 256 B (por. mikroprocesory rodziny Intel MCS-51). Warto w tym miejscu przypomnieć, że przy określaniu pojemności pamięci B oznacza bajt, b oznacza bit, k (kilo) oznacza 1024, M (mega) oznacza 220, G (giga) oznacza 230.
Pamięci RAM są z reguły półprzewodnikowymi pamięciami ulotnymi pełniącymi w systemie cyfrowym funkcję tzw. pamięci operacyjnej lub pamięci głównej. Z punktu widzenia teorii układów logicznych pamięć RAM jest układem sekwencyjnym.
Rys. 3. Pamięć o dostępie swobodnym czyli pamięć RAM
Pamięci RAM dzielimy na pamięci statyczne (pamięci SRAM) i pamięci dynamiczne (pamięci DRAM). SRAM (Static Random Access Memory) to tzw. statyczna pamięć RAM. Elementem pamiętającym takiej pamięci jest przerzutnik bistabilny z reguły zrealizowany w technice CMOS. Pamięć SRAM jest więc ulotna (ang. volatile memory). Po wyłączeniu i ponownym włączeniu napięcia zasilającego przerzutnik stanowiący komórkę elementarną może się ustawić w dowolnym z dwu możliwych stanów. W pamięci SRAM nie ma konieczności odświeżania komórek elementarnych jak w pamięciach DRAM, o których za chwilę. Pamięci SRAM mają mniejszy czas dostępu (są szybsze) niż pamięci DRAM ale komórka elementarna zajmuje więcej miejsca na chipie stąd mniejsze pojemności tych pamięci. Pamięci SRAM stosowane są w systemach komputerowych jako szybkie pamięci podręczne czyli pamięci typu cache poziomu pierwszego (pamięci cache L1) i poziomu drugiego (pamięci cache L2).
DRAM (ang. Dynamic Random Access Memory) to tzw. dynamiczna pamięć RAM. Pamięci tego typu są zbudowane z tranzystorów MOS. Elementem pamiętającym 1-bitowej komórki elementarnej pamięci DRAM jest kondensator a ściśle rzecz biorąc pojemność wejściowa tranzystora MOS o wartości 30-50 fF (femtofarady). Zasada pamiętania 0 i 1 jest więc taka sama jak w przypadku układów próbkująco-pamiętających (układów S/H) i tak jak w przypadku układów S/H z powodu nieuniknionych prądów upływu następuje szybkie rozładowywanie się kondensatora. Pociąga to za sobą konieczność okresowego doładowywania komórek pamiętających stan wysoki H co nazywamy odświeżaniem pamięci DRAM. W typowej pamięci DRAM odświeżanie odbywa się co około kilkanaście ms. Z reguły nie odświeżamy od razu całej pamięci DRAM ale pewien jej fragment potem następny itd. Czas dostępu do pamięci DRAM jest rzędu 50 ns. Typowa organizacja kostek pamięci DRAM to np 64M x 4 (czterobitowe słowa wyjściowe), 128M x 2 (dwubitowe słowa wyjściowe), 256Mx1 (jednobitowe słowa wyjściowe).
Pamięci DRAM dzielą się na synchroniczne i asynchroniczne. Obecnie prawie wyłącznie stosuje się pamięci synchroniczne tzw. SDRAM (Synchronous DRAM) pracujące w takt zegara systemu i umożliwiające wykonanie kolejnych czynności przez pamięć zakładkowo (pipelining) co pozwala znacznie skrócić cykl odczytu. Dane przesyłane są w seriach tzw. "burst". Pamięci synchroniczne wykorzystujące narastające i opadające zbocze zegara noszą nazwę DDR SDRAM (Double Data Rate SDRAM). Typowe pamięci DDR SDRAM pracują z magistralami taktowanymi zegarem 133 MHz.
Podstawowe parametry pamięci RAM to czas dostępu do pamięci (access time), czas cyklu (ang cycle time) i pojemność pamięci RAM.
Pamięci (kostki pamięci czyli chipy) SDRAM umieszcza się najczęściej na małych płytkach drukowanych tzw. modułach DIMM (ang. Dual In line Memory Module).
Pamięci specjalne to pamięci FIFO, LIFO i pamięci CAM.
Pamięć FIFO (ang. First in - First out) to inaczej kolejka.
Pamięć LIFO (ang. Last in - First out) to inaczej stos.
Pamięć CAM (ang. Content Addressable Memory) to inaczej pamięć asocjacyjna lub pamięć skojarzeniowa. Pamięci specjalne zostaną omówione szerzej w rozdziale o architekturze systemów komputerowych.
9. Układy sterujące
Ogólny model systemu cyfrowego jako współpracujących ze sobą 2 części, części wykonawczej, przetwarzającej informację (a dokładniej słowa binarne) i części sterującej przekazującej do części wykonawczej sygnały sterujące. Sygnały sterujące mogą być uzależnione od stanu części wykonawczej (stanu układu).
Rys.1. Schemat blokowy typowego systemu cyfrowego
9.1. Mikroprogramowanie
Rys.2. Układ sterowania mikroprogramowanego
Mikroprogramowane układy sterowania są prostą regularną metodą projektowania układów sterujących systemów cyfrowych. Na Rys.2. pokazany jest schemat mikroprogramowanego układu sterującego. Z punktu widzenia teorii układów logicznych jest to automat skończony. Układ pracuje synchronicznie w takt zegara. Do rejestru adresu mikroinstrukcji wczytywany jest w każdym takcie zegara adres pod którym w pamięci ROM (pamięci mikroprogramów) umieszczone są sygnały sterujące. Sygnały sterujące pojawiają się więc wyjściu układu w takt zegara. Sygnały warunków , za pomocą tzw. sekwensera mogą modyfikować sposób w jaki wykonuje się mikroprogram. Sygnały sterujące sterują przepływem danych w części wykonawczej systemu.
9.2. Maszyny liniowe
Rejestr liczący to układ pokazany na Rys.3.
Rys.3. Rejestr liczący
Rejestr liniowy nazywamy też rejestrem LFSR ( ang. Linear Feedback Shift Register). Jest to rejestr liczący z funkcją boolowską zadaną wzorem
gdzie jest ustalonym słowem binarnym definiującym rejestr liniowy. Funkcja zdefiniowana wzorem (*) jest przekształceniem liniowym stąd nazwa rejestru. Rejestr liniowy jest szczególnym przypadkiem tzw. maszyny liniowej lub automatu liniowego (Linear Sequential Machine). Każdy rejestr liniowy jest scharakteryzowany przez swój tzw. wielomian charakterystyczny
Jest to wielomian o współczynnikach w ciele . Jeśli wielomian charakterystyczny jest nierozkładalny, to rejestr liniowy wychodzący z dowolnego stanu różnego od samych zer przechodzi przez stanów.
Rejestry liniowe stosowane są między innymi jako generatory liczb pseudolosowych.
9.3. Klawiatura
Klawisz to przełącznik, klucz włączany na czas przyciśnięcia. Zestaw takich przełączników wyposażony w układy umożliwiające jednoznaczne przypisanie wciśniętemu klawiszowi pewnego słowa binarnego kodującego klawisz nazywamy klawiaturą. Najprostszym rozwiązaniem układu klawiatury jest zastosowanie przełączników dołączonych bezpośrednio do wejść kodera tzn. translatora kodu „1 z n” na kod NKB.
Dla dużych klawiatur stosuje się najczęściej rozwiązanie polegające na tzw. skenowaniu (tzn. przeszukiwaniu) układu kluczy metodą macierzową. Klawisze umieszczone są tak jak współrzędne w macierzy. Przeglądając przełączniki klawiatury i poszukując klawisza włączonego wybieramy numer wiersza i numer kolumny i sprawdzamy, czy klawisz jest przyciśnięty. Jeśli tak, to ponieważ para uporządkowana (numer wiersza, numer kolumny) jest słowem kodującym klawisz, wyprowadzamy ją na wyjście sygnalizując jednocześnie przyciśnięcie klawisza.
9.4. Układy PLD
Systemy cyfrowe możemy realizować w różny sposób. Możemy np. skonstruować jeden specjalizowany układ scalony realizujących cały system. Takie rozwiązanie nazywamy układem ASIC od Application Specific Integrated Circuit. Jest to rozwiązanie na ogół najlepsze ale dosyć kosztowne przy małych seriach produkcyjnych. Innym rozwiązaniem jest zastosowanie układów PLD zaliczanych do tzw. układów scalonych semi custom. PLD to skrót od Programmable Logic Design. Układy PLD nazywamy również układami logiki programowalnej.
W praktyce mamy cały szereg rodzin układów PLD o bardzo różnych możliwościach. Na ogół dzieli się układy PLD na 3 kategorie.
- układy SPLD (Simple Programmable Logic Device) czyli proste układy programowalne
- układy CPLD (Complex Programmable Logic Devices) czyli złożone układy programowalne
- FPGA (Field Programmable Gate Array) czyli programowalne matryce bramkowe
Cechą charakterystyczną wszystkich układów programowalnych są programowalne połączenia elektryczne wewnątrz struktury krzemowej. Część układów PLD to układy, które można w łatwy sposób wielokrotnie reprogramować.