Wstęp
Konstruuje się układy scalone cyfrowe różnych typów. Standardowe układy logiczne można podzielić na dwie główne grupy: układy bipolarne i układy CMOS. Standardowe układy TTL (54/75), oparte na tranzystorach bipolarnych, dały początek całej rodzinie układów TTL (Transistor - Transistor Logic). Obecnie stosuje się bardziej nowoczesne wersje. Czas propagacji sygnału przez jedną bramkę wynosi ok. 10 ns, a pobór mocy 10 mW. Cała rodzina układów logicznych CMOS, wzięła nazwę od komplementarnych tranzystorów MOS (NMOS, PMOS), z których zbudowany jest stopień wyjściowy. W stanie statycznym pobór mocy jest bardzo mały, i wynosi ok. 10nW na bramkę. Układy CMOS mają dużo szersze marginesy zakłóceń. Można je dodatkowo rozszerzyć przez podniesienie wartości napięcia zasilającego. Możliwość ta sprawiła, że układy CMOS przejęły rolę układów bipolarnych, zaliczanych do klasy układów o wysokiej odporności na zakłócenia. Inna z technologii, to ECL (Emitter Coupled Logic), są to układy oparte na wzmacniaczach różnicowych zbudowanych na tranzystorach bipolarnych, bardzo szybka technologia (zdarza się, że układy ECL mogą pracować z częstotliwością zegara rzędu wielu GHz), wykorzystywane m.in. w sprzęcie wojskowym.
Działanie układów jest oparte na systemie binarnym (dwójkowym), czyli takim, w którym liczenie opiera się na dwójce, dwa stany logiczne, tzn. 1 lub 0. Do 1 i 0 są przyporządkowane określone poziomy napięć. Każdą liczbę w tym systemie można przedstawić w następujący sposób:
f · 24 + g · 23 + h · 22 + i · 21 + j · 20
Bramki logiczne
Podstawowymi układami cyfrowymi są bramki. Bramka posiada jedno wyjście, i jest najprostszym układem logicznym wykonującym podstawowe operacje matematyczne, czyli iloczyn, suma, negacja itd. Wyróżniamy następujące rodzaje bramek:
Skrót Pełna nazwa Polska nazwa
AND,I AND iloczyn
OR, LUB OR suma
NOT, NIE NOT negacja
NAND, NIE I Not - AND negacja iloczynu
NOR, NIE SUMA Not - OR negacja sumy
EX-OR Exclusive - OR suma modulo 2
EX-NOR Exclusive - Not - OR
Rys. 1: Na powyższym rysunku są pokazane i opisane rodzaje bramek. Negacje tworzymy przez domalowanie kółeczka na wyjściu bramki tak, jak to zrobiono w bramkach typu NOT, NAND, NOR i EX-NOR.
Bramka AND
Bramka ta jest układem o dwu lub większej liczbie wejść. Realizuje ona funkcję iloczynu logicznego zmiennych wejściowych. Jeśli na wszystkich wejściach jest 1, to na wyjściu jest 1. W spoczynku na wyjściu jest 0.
Tablica prawdy:
a b |
ab |
0 0 0 1 1 0 1 1 |
0 0 0 1 |
Bramka NAND
Bramka NAND działa tak samo jak bramka AND, tyle że sygnał wyjściowy jest jeszcze negowany, czyli realizuje funkcję negacji iloczynu. Bramka ta jest funkcjonalnie pełna (SFP), bowiem stosując ją można zrealizować zarówno operacje iloczynu logicznego (AND), jak i negację (NOT).
Rys. 2: Realizacja negacji przy użyciu bramki NAND
Rys. 3: Realizacja iloczynu logicznego przy użyciu bramek NAND
Tablica prawdy:
a b |
|
0 0 0 1 1 0 1 1 |
1 1 1 0 |
Bramka NOT
Bramka NOT posiada jedno wejście i jedno wyjście. Realizuje ona funkcję negacji zmiennej wejściowej, czyli zmienia sygnał wejściowy na przeciwny.
Tablica prawdy:
a |
ā |
0 1 |
1 0 |
Bramka OR
Bramka ta jest układem o dwu lub większej liczbie wejść. Bramka OR realizuje funkcję sumy logicznej zmiennych wejściowych. Gdy na przynajmniej jednym wyjściu bramki jest podana 1, to na wyjściu jest 1. W spoczynku na wyjściu jest 0.
Tablica prawdy:
a b |
a+b |
0 0 0 1 1 0 1 1 |
0 1 1 1 |
Bramka NOR
Bramka NOR działa tak samo jak bramka OR, tyle że sygnał wyjściowy jest jeszcze negowany, czyli realizuje funkcję negacji sumy. Bramka ta jest funkcjonalnie pełna.
Rys. 4: Realizacja negacji przy użyciu bramki NOR
Rys. 5: Realizacja sumy logicznej przy użyciu bramek NOR
Rys. 6: Realizacja iloczynu logicznego przy użyciu bramek NOR.
Tablica prawdy:
a b |
|
0 0 0 1 1 0 1 1 |
1 0 0 0 |
Bramka EX-OR
Bramka EX-OR (ang. Exclusive OR - Lub z wyłączeniem) nie stanowi SFP (systemu funkcjonalnie pełnego), ale ma ona jednak duże znaczenie praktyczne. Umożliwia ona bowiem, w dość szerokiej klasie układów, bardzo oszczędną (liczba elementów i połączeń) realizację układu. Dotyczy to zwłaszcza realizacji: operacji arytmetycznych, konwersji kodów, korekcji błędów i innych.
Funktor EX-OR realizuje funkcję:
f(a,b) = a
+ āb = a
b
Rys. 7: Powyżej znajduje się schemat logiczny bramki Ex-OR.
Tablica prawdy:
a b |
a |
0 0 0 1 1 0 1 1 |
0 1 1 0 |
Bramka Ex-NOR
Bramka ta działa tak samo jak bramka Ex-OR, z tą różnicą, że sygnał wyjściowy jest jeszcze negowany. Funktor ten realizuje funkcję:
f(a,b) = ab + ā
= a
b
Rys. 8: Powyżej znajduje się schemat logiczny bramki Ex-NOR.
Tablica prawdy:
a b |
a |
0 0 0 1 1 0 1 1 |
1 0 0 1 |
Half adder
Układ ten, przedstawiony na rysunkach poniżej, służy do rozpoznawania ilości 1 na wejściu, (czyli operacje dodawania: 0 + 0 = 0; 1 + 1 = 10 itd.), i podaje ich ilość na wyjściu (niebezpośrednio). Wynik ten nie jest od razu pokazywany, aby to znaleźć należy do wyjść podpiąć dekoder kodu BCD na kod wyświetlacza 7-segmentowego. Jeżeli na wejściach będzie 0 0, to na wyświetlaczu będzie 0, natomiast, gdy na wejściach będzie 0 1 lub 1 0, to na wyświetlaczu będzie 1. Z kolei, gdy na wejściach będzie 1 1, to na wyświetlaczu będzie 2 (2 w kodzie binarnym to10).
Tablica prawdy:
a b |
C0 S |
0 0 0 1 1 0 1 1 |
0 0 0 1 0 1 1 0 |
Rys. 9: schemat logiczny układu Half adder.
Rys. 10: schemat logiczny układu Half adder, z wykorzystaniem bramki Ex-OR.
Rys. 11: Symbol układu Half adder.
Full adder
Układ ten działa tak jak układ Half adder, z czym że może pobrać nie dwie, a trzy zmienne wejściowe. Jeżeli do wyjść podepniemy dekoder kodu BCD na kod wyświetlacza 7-segmentowego, i gdy na wszystkich trzech wejściach zostanie podane 1 (1+1+1=11), na wyświetlaczu będzie 3 (w kodzie binarnym 11 to 3). W obu układach, na wyjściach podana jest liczba binarna, a dzięki dekoderowi kodu BCD na kod wyświetlacza 7-segmentowego, możemy znaleźć jej odpowiednik dziesiętny.
Tablica prawdy:
Cn Xn Yn |
Cn+1 S |
0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 |
0 0 0 1 0 1 1 0 0 1 1 0 1 0 1 1 |
Rys. 12: schemat logiczny układu Full adder.
Rys. 13: schemat logiczny układu Full adder, z wykorzystaniem bramki Ex-OR.
Rys. 14: Układ Full adder zrealizowany na układach Half adder.
Rys. 15: Symbol układu Full adder.
Przerzutniki
Przerzutniki stosuje się przy budowie różnego rodzaju pamięci, liczników, rejestrów i dzielników.
Rys. 16: Przerzutnik RS.
Przerzutnik można zbudować na bramkach NAND lub NOR. Jeżeli na wejście SET zostanie podany sygnał sterujący, na wyjściu Q będzie 1, natomiast, jeżeli na wejściu RESET podany będzie sygnał sterujący, na wyjściu Q będzie 0. Dla przerzutnika zbudowanego na bramkach typu NAND, sygnałem sterującym jest 0, natomiast dla NOR jest 1. Jeśli na wyjściu Q jest 1, znaczy to, że przerzutnik jest ustawiony, w przeciwnym wypadku, czyli gdy na wyjściu jest 0, przerzutnik jest zresetowany. Jeśli na wejściach są narysowane kółeczka (czyli jeżeli sygnał wejściowy jest negowany), to przerzutnik jest sterowany 0. Wyjścia są komplementarne, tzn., że ich stany logiczne są przeciwne. Przerzutnik jest przerzutnikiem asynchronicznym, czyli nie posiada zegara taktującego.
Rys. 17: Przerzutnik D
Rys. 18: Przerzutnik D wyzwalany poziomem - schemat logiczny.
Rys. 19: Przerzutnik D wyzwalany zboczem narastającym - schemat logiczny.
Powyżej znajdują się dwa rodzaje przerzutnika D, istnieje też przerzutnik. D wyzwalany zboczem opadającym. Gdy na wejście zegarowe jest podany odpowiedni sygnał (jeden z trzech) przerzutnik sprawdza, co jest podane na wejściu D i przenosi ten stan na Q. Przerzutnik posiada też wejścia asynchroniczne - SET, RESET. Łącząc na stałe wejście D z NIE Q otrzymujemy przerzutnik T.
Rys. 20: Przerzutnik JK - Master Slave
Rys. 21: Przerzutnik JK - Master Slave - schemat logiczny
Przerzutnik JK- Master Slave zachowuje się w zależności od kombinacji stanów wejściowych, na J i K. Przerzutnik jest wyzwalany dwuzboczowo, tzn., gdy jest zbocze narastające układ przepisuje dane wejściowe do wewnętrznego przerzutnika Master a przy opadającym z przerzutnika Master do przerzutnika Slave. Przerzutnik zachowuje się w następujący sposób:
0 0 - stan na wyjścia nie ulega zmianie
1 0 - stan na Q jest ustawiany na 1
0 1 - stan na Q jest ustawiany na 0
1 1 - stan na wyjściu zmienia się na przeciwny
Realizacja układów kombinacyjnych przy użyciu bramek
Aby szybko zaprojektować układ należy na początku nauczyć się kodu Gray'a. Kod Gray'a - kod binarny (dwójkowy), w którym dwa kolejne ciągi różnią się tylko na jednej pozycji.
Kod dla 16 znaków:
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
Grube, poziome kreski oznaczają lustra. Na początku wpisujemy pod sobą 0,1. Potem przystawiamy lustro i przepisujemy lustrzane odbicie. Przed lustrem na 2 pozycji dopisujemy 0 za lustrem 1. Lustra stawia się po linijkach będących potęgą liczby 2. Myślę, że jest to zrozumiałe. Jeśli kod Gray'a jest opanowany można już zacząć minimalizować. Robi się to w tablicach Carnaugha (czytaj Karnafa). Tak wygląda dla 4 zmiennych wejściowych:
|
X3 X4 |
X3 X4 |
X3 X4 |
X3 X4 |
X1 X2 |
0 0 |
0 1 |
1 1 |
1 0 |
0 0 |
|
|
|
|
0 1 |
|
|
|
|
1 1 |
|
|
|
|
1 0 |
|
|
|
|
W jednej tablicy projektuje się układ dla jednej zmiennej wyjściowej. X1- bit najbardziej znaczący, X4 - bit najmniej znaczący. W puste prostokąty wpisuje się stany wyjściowe przy określonej kombinacji zmiennych wejściowych. Jeśli dla jakiejś kombinacji sygnał wyjściowy nie jest określony, to wpisujemy kreskę. Po wpisaniu wszystkich wartości zmiennej wyjściowej należy znaleźć w tablicy grupy 1 i kresek - jedno, dwu, cztero, szesnasto, itd. elementowych. Jedynki i kreski mają należeć do jednej grupy. 1 mogą ze sobą sąsiadować jedynie w pionie i w poziomie. Uwaga brzegi tablicy sąsiadują ze sobą. Tak więc, jeśli po obu brzegach są jedynki na jednym poziomie należy je połączyć. Trzeba znaleźć wszystkie grupy gdyż układ nie będzie działał prawidłowo. Jeśli są jakieś grupy, w których elementy całkowicie pokrywają się z innymi grupami, to pomijamy taką grupę. Jak już są zakreślone wszystkie grupy, to przystępujemy do napisania wzoru funkcji przełączającej, który będzie opisywał działanie funkcji. Robi się to w następujący sposób: patrzysz na pierwszą zakreśloną grupę i jeśli jakaś zmienna wejściowa w całym obrębie zakreślonej grupy ma wartość 1, to do wzoru wchodzi jako zmienna np.: X1, jeśli ma wartość 0, to wchodzi jako negacja tej zmiennej, np.: Nie-X1, jeśli zmienia swoje wartości na 0 i 1 to nie wchodzi do wzoru. Zmienne poszczególnej grupy mnożymy, a następnie dodajemy kolejne iloczyny z następnych zakreślonych grup. Wzór funkcji może wyglądać np. tak:
Y = X1 · X3 ·
+
Z wzoru wynika, że w tablicy były dwie grupy:
W pierwszej grupie X1, X3 miały wartość 1, X4 - 0 - dlatego zanegowane, X2 - i 1 i 0 - dlatego nie ma
W drugiej grupie X2 - 0 - dlatego zanegowane.
Przykładowe zadanie dotyczące minimalizacji:
Zaprojektuj układ, na którego wejście przychodzą zmienne wejściowe 4 bitowe, czyli od 0 do 15 w systemie dziesiętnym. Układ ma sygnalizować na wyjściu 1 następujące liczby: 0, 3, 4, 8, 11, 12, 14, 15.
Na początku rysujemy tablicę i wypełniamy zmienne wejściowe w kodzie Gray'a.
Następnie wypełniamy wnętrze tabelki:
|
X3 X4 |
X3 X4 |
X3 X4 |
X3 X4 |
X1 X2 |
0 0 |
0 1 |
1 1 |
1 0 |
0 0 |
1 |
0 |
1 |
0 |
0 1 |
1 |
0 |
0 |
0 |
1 1 |
1 |
0 |
1 |
1 |
1 0 |
1 |
0 |
1 |
0 |
Potem łączymy jedynki w grupy:
Zostały znalezione 4 grupy, z czego dwie: zielona i pomarańczowa pokrywają się z innymi. Nie bierze się ich pod uwagę.
Teraz przystępujemy do pisania wzoru funkcji przełączającej. W grupie pierwszej zaznaczonej na czerwono mamy 4 elementy, X1 i X2 mają różne wartości, więc nie wchodzą do wzoru, X3 i X4 mają wartość 0, więc wchodzą do wzoru jako negacja X3 i negacja X4. Teraz wzór wygląda następująco: Y =
·
+ ... Teraz druga grupa zakreślona na niebiesko. X1 zmienia swoje wartości, X2 = 0, czyli do wzoru wchodzi jako negacja X2, X3 i X4 = 1 więc wchodzą do wzoru jako X3 i X4. Teraz wzór ma postać: Y =
·
+
· X3 · X4. Trzecia grupa zakreślona na pomarańczowo. X4 nie wchodzi, X1, X2, X3 = 1, więc wchodzą do wzoru jako X1, X2, X3. Oto końcowy wzór funkcji:
Y =
·
+
· X3 · X4 + X1 · X2 · X3
Teraz tylko trzeba zrealizować to na bramkach:
Rys. 22: Realizacja układu na bramkach
Powyższy układ można zrobić z jednego rodzaju bramek, tzn. NAND, NOR. Prawa de' Morgana definiują jak to zrobić:
X1 · X2 = X1 + X2
X1 + X2 = X1 · X2
Rys. 23: Realizacja układu na bramkach NOR
Rys. 24: Realizacja układu na bramkach NAND
Funkcje przełączające można także realizować na multiplekserach. Są dwa sposoby realizacji. Pierwszy - mniej oszczędny - polega na tym, iż na wejścia adresowe podajemy zmienne wejściowe, a odpowiednie wejścia danych multipleksera łączymy z 1 bądź 0. Jak już wspomniałem jest to sposób mniej oszczędny, gdyż multiplekser musi być 2n bitowy, gdzie n, to liczba bitów. Czyli do realizacji poprzednio omówionego przykładu trzeba użyć multipleksera 16 bitowego. Wygląda to tak:
Rys. 25: Multiplekser 16-bitowy
Multiplekser łączy jedno ze swoich wejść z wyjściem przy wybraniu odpowiedniego adresu. Natomiast druga metoda jest bardziej oszczędna, gdyż potrzeba do niej multipleksera o 2(n-1) wejściach. W konsekwencji wejść adresowych jest mniej o jeden. Polega to na tym, że na wejścia adresowe podajemy najbardziej znaczące bity a na wejścia danych najmniej znaczący bit lub ewentualnie 1 i 0. Przy projektowaniu postępowanie jest następujące: na początku należy wypisać wszystkie kombinacje zmiennych wejściowych i obok nich wartość wyjścia. Zmienne trzech najstarszych bitów są takie same dla dwóch kolejnych najmłodszych bitów - zawsze będzie to 0 i 1. Jeśli przy danej kombinacji (w naszym przypadku 3 najbardziej znaczące bity) na wyjściu ma być 1 (dla X4=0 i X4=1), to wejście multipleksera podłączamy do 1, jeśli natomiast na wyjściu ma być 0 (dla X4=0 i X4=1), to wejście multipleksera podłączamy do 0, jeśli wartości na wyjściu są przeciwne - 0, 1 - to na wejście multipleksera podłączamy X4, a jeśli 1, 0 to negację X4. Wygląda to tak:
|
X1 |
X2 |
X3 |
X4 |
Wy |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
2 |
0 |
0 |
1 |
0 |
0 |
3 |
0 |
0 |
1 |
1 |
1 |
4 |
0 |
1 |
0 |
0 |
1 |
5 |
0 |
1 |
0 |
1 |
0 |
6 |
0 |
1 |
1 |
0 |
0 |
7 |
0 |
1 |
1 |
1 |
0 |
8 |
1 |
0 |
0 |
0 |
1 |
9 |
1 |
0 |
0 |
1 |
0 |
10 |
1 |
0 |
1 |
0 |
0 |
11 |
1 |
0 |
1 |
1 |
1 |
12 |
1 |
1 |
0 |
0 |
1 |
13 |
1 |
1 |
0 |
1 |
0 |
14 |
1 |
1 |
1 |
0 |
1 |
15 |
1 |
1 |
1 |
1 |
1 |
Dla adresu 000 ( 0, 1) na wyjściu ma być 1, 0 - wartości te są negacją X4, więc na wejście 0 podłączamy negację X4.
Dla adresu 001 ( 2, 3) na wyjściu ma być 0, 1 - wartości te są takie same jak X4, więc na wejście 1 podłączamy X4.
Dla adresu 010 ( 4, 5) na wyjściu ma być 1, 0 - wartości te są negacją X4, więc na wejście 2 podłączamy negację X4.
Dla adresu 011 ( 6, 7) na wyjściu ma być 0, 0 - na wejście 3 podłączamy 0.
Dla adresu 100 ( 8, 9) na wyjściu ma być 1, 0 - wartości te są negacją X4, więc na wejście 4 podłączamy negację X4.
Dla adresu 101 ( 10, 11) na wyjściu ma być 0, 1 - wartości te są takie same jak X4, więc na wejście 5 podłączamy X4.
Dla adresu 110 ( 12, 13) na wyjściu ma być 1, 0 - wartości te są negacją X4, więc na wejście 6 podłączamy negację X4.
Dla adresu 111 ( 14, 15) na wyjściu ma być 1, 1 - na wejściu 7 podłączamy 1.
Rys. 26: Wygląd układu