LABORATORIUM - ELEKTRONIKA
TECHNIKA CYFROWA: Wykorzystanie układów scalonych: kodery, dekodery, transkodery; liczniki scalone
1.
Cel ćwiczenia
Celem ćwiczenia jest pokazanie podstawowych rozwiązań scalonych liczników oraz koderów/dekoderów TTL, zasady
ich działania i realizowanych przez nie funkcji, a także ich konfiguracji do działania w określony sposób.
2.
Wstęp teoretyczny
2.1.
Kodery, dekodery, transkodery
Przesyłanie, przetwarzanie i obróbka informacji w systemach cyfrowych jest wykonywana w oparciu o reprezentację
odpowiednich zmiennych w postaci kodów liczbowych. Wybór kodu do zastosowania w danej aplikacji zależy od potrzeb,
szczególnie chodzi o ułatwienie wykonywania operacji na zmiennych w tym układzie oraz zapewnienie ich prawidłowości
przy występowaniu zakłóceń i uszkodzeń w układzie. Przy wyborze kodu umożliwiającego osiągnięcie minimum kosztów
układu realizującego daną operację (np. arytmetyczną) należy również uwzględnić problemy konwersji tego kodu na
inny/inne stosowane w tym systemie. Do tego celu stosuje się właśnie układy koderów, dekoderów i transkoderów które to
układy mają za zadanie przeliczyć dany kod binarny na inny. Innym typowym zastosowaniem tego typu układów jest
przetworzenie informacji w danym kodzie na kod który jest „czytelny z zewnętrz”. Typowym układem tego typu jest używany
w ćwiczeniu układ 7447, który ma za zadanie przeliczać kod BCD na kod wyświetlacza siedmiosegmentowego. Innym
znanym układem scalonym podobnego zastosowania jest układ 7442 przeliczający kod BCD na kod 1 z 10.
2.2.
Liczniki
Licznik scalony jak sama nazwa wskazuje jest układem scalonym służącym do… liczenia. Ilość bitów wyjścia danego
układu definiuje ”do ilu” w danym układzie można liczyć. Najczęściej stosowane są liczniki 4-bitowe, co oznacza, że można
na nich liczyć od 0000 do 1111 (binarnie), czyli od 0 do 15 (dziesiętnie). Spotyka się też liczniki scalone dekadowe, czyli
takie które zliczają od 0000 do 1001, więc od 0 do 9. W ćwiczeniu zajmiemy się jednak licznikiem scalonym 74191 liczącym
w pełnym zakresie 4-bitowym. W programie MultiSIM wygląda on tak jak na rysunku poniżej:
Dobrze, zajmijmy się zatem działaniem tego układu. Widzimy licznik. Ma on 14 widocznych pinów. W MultiSIMie jest
przyjęte że piny „po lewej” to wejścia, piny „po prawej” to wyjścia, więc ten układ ma jak widać 8 wejść i 6 wyjść. Należy
pamiętać, że gdybyśmy używali tego układu w rzeczywistości to ma on jeszcze dwa dodatkowe piny, do których należałoby
podłączyć zasilanie układu scalonego. No ale patrzymy na ten układ i… Jak go używać? No właśnie.
Należy zrobić to co się robi zawsze gdy chcemy zidentyfikować lub użyć jakiegokolwiek układu scalonego. Czyli
szukamy jego noty katalogowej, np. na
www.datasheetcatalog.com
. Znaleziona. Przykładową notę tego układu załączono do
instrukcji. Co w niej można znaleźć?
Na pewno informację, że pin CLK to wejście liczące tego układu. Tu podamy zerojedynkowy sygnał który będzie
zliczany. To podstawa. Podobnie jak fakt, że piny Q
D
, Q
C
, Q
B
i Q
A
to wyjścia licznika. To tu będą się pojawiały kolejno
zliczane liczby. Warto zapamiętać że zasadą jest nazewnictwo takie że Q
A
jest bitem najmniej znaczącym. Aby użyć tego
układu musimy jeszcze zadbać o piny ~CTEN, ~LOAD i ~U/D. Pozostałe możemy na razie zaniedbać. Po kolei:
Pin ~U/D w nocie katalogowej jest opisany jako „up/down input”. Sprawa jest banalna. Tym pinem decydujemy jak
ma liczyć licznik tzn. w górę czy w dół. Falka przy opisie oznacza negację, czyli że aby liczyć w górę (up), na ten pin
należy podłączyć zero, w dół (down) – jedynkę;
Pin ~LOAD jest opisany jako „asynchronous parallel load input”. Jest to zatem wejście decydujące o zerowaniu
licznika, czy też mówiąc ogólniej o narzuceniu licznikowi pewnego stanu (który, jak się przekonamy później –
niekoniecznie musi oznaczać zero). Ma on falkę, co oznacza, że aby wyzerować licznik należy podać tu zero,
natomiast żeby licznik „normalnie” zliczał, powinna być tu podana jedynka.
Pin ~CTEN jest opisany jako „count enable input”. Jest to zatem wejście które „pozwala” liczyć. Też ma falkę, czyli
żeby licznik mógł liczyć, należy tu podać zero.
Wiemy już zatem że licznik skonfigurowany jak na rysunku poniżej będzie licznikiem który będzie zliczał impulsy
podawane na wejście CLK w górę, w zakresie od 0 do 15 i swój aktualny stan pokazywał na wyjściach Q
D
, Q
C
, Q
B
i Q
A
.
A co jeżeli nie chcemy liczyć do 15, a np. do 9? Wtedy właśnie wykorzystamy wejście ~LOAD. Jak już wiemy, podanie
na ten pin logicznego zera wyzeruje układ. A skąd wziąć to zero? Powinno się ono nam pojawić „samo”, automatycznie, w
momencie kiedy licznik doliczy do 10. Do 10, nie do 9, ponieważ licznik nie powinien być zerowany w momencie gdy doliczy
do 9, ale w momencie gdy „przekroczy” 9. Czyli pozwalamy mu zliczyć 9, a gdy chce przeskoczyć na 10, wykrywamy to i go
zerujemy.
Zatem wykrywamy dziesiętną 10 czyli binarnie 1010. 1010 które pojawia się na pinach Q
D
, Q
C
, Q
B
i Q
A
. Wiemy że Q
A
jest bitem najmniej znaczącym, czyli wykrywamy następujący stan Q
D
Q
C
Q
B
Q
A
=1010. Jak to zrobić?
Pomyślmy logicznie, dosłownie i w przenośni. Wykrywamy jeden konkretny stan – 1010. Zerujemy układ dokładnie w
momencie gdy Q
D
=1
i Q
C
=0
i Q
B
= 1
i Q
A
=0. Kluczem jest spójnik „i”. Skoro go tam wstawiłem to chcę tam wykonać operację
logiczną I czyli AND. Zatem wstawię do układu czterowejściową bramkę AND która wykryje ten stan.
No, prawie, zapomnieliśmy o jednym. Bramka AND daje na swoim wyjściu jedynkę gdy na jej wejściach są jedynki. A
my mamy na pinie zerującym LOAD „falkę”, czyli zerowanie nie następuje w wyniku podania tam jedynki, lecz zera. Zatem
musimy jeszcze odwrócić (zanegować) wyjście tej bramki. Czyli albo negujemy jej wyjście bramką NOT albo zamiast bramki
AND wstawiamy bramkę NAND (NAND = NOT AND). To już wszystko, układ liczący od 0 do 9 wygląda tak:
Na wejścia bramki NAND podaliśmy bezpośrednio wyjścia licznika Q
D
i Q
B
, bo na tych wyjściach zgodnie z tym co
opisano wyżej wykrywamy jedynki, natomiast wyjścia Q
C
i Q
A
podaliśmy przez bramki NOT, bo tu wykrywamy zera.
Dobrze, nauczyliśmy się zerować licznik w dowolnym momencie. Co jeszcze można z tym licznikiem zrobić? Wiemy jak
skończyć liczenie w dowolnym momencie. A jak zacząć w dowolnym? Jeśli np. chcemy liczyć nie od 0, a od 5? Do tego
służą piny D, C, B i A. Jeżeli chcemy liczyć od 5 to na te piny muszę podać binarne 5 czyli DCBA=0101. Układ wygląda tak:
Piny D i B są podłączone do masy, czyli do logicznego zera, natomiast piny C i A podłączone są do V
CC
= 5 [V], czyli do
logicznej jedynki. Układ liczy w zakresie 5-9.
To już właściwie wszystko, wiemy jak użyć licznika scalonego 74191 do liczenia w dowolnym zakresie, w górę lub w
dół. Warto jednak jeszcze wspomnieć o pinach MAX/MIN i ~RCO. Pin MAX/MIN przechodzi w stan wysoki w momencie gdy
licznik jest w stanie 1111, czyli doliczył do końca. Pin ~RCO („ripple clock output”) działa odwrotnie, czyli gdy licznik doliczy
do końca przechodzi w stan niski (logiczne zero), cały pozostały czas jest w stanie wysokim. Pin ~RCO jest używany gdy
chcemy liczyć dalej niż do 15. Wtedy podłączamy go do wejścia CLK następnego licznika i zamiast liczyć na 4 bitach,
liczymy na 8, zatem zamiast liczyć maksymalnie do 15 możemy liczyć do 255. Układ dwóch liczników skonfigurowanych do
liczenia w zakresie 0-255 pokazano na rysunku poniżej:
Oczywiście cały czas obowiązują te same zasady co poprzednio. Czyli taki układ jak powyżej możemy spokojnie
skonfigurować do liczenia w zakresie np. od 34 do 134. Różnica jest tylko taka, że zerujemy oba liczniki jednocześnie i
wykrywamy stan na wyjściach obu jednocześnie.
Wszystko jasne?
Dla treningu przeanalizujmy układ z rysunku poniżej:
OK. Mamy układ. Licznik jest jeden.
Widzimy że jest w nim zerowanie, bo na wejście ~LOAD jest podane wyjście bramki NAND.
Widzimy też że układ nie liczy od 0 bo mamy skonfigurowane wejścia DCBA. No to od tego zacznijmy. Na wejścia
DCBA podano stan 1000, czyli dziesiętnie 8. Od tej liczby zacznie liczyć ten układ.
Idziemy dalej. Patrzymy na pin ~U/D, jest na niego podana logiczna jedynka. Aha, zatem licznik liczy w dół.
Zostało nam sprawdzić „do ilu” liczy ten układ, czyli jaką liczbę wykrywa bramka NAND. Patrzymy na bramkę NAND –
na jej wejścia podano bezpośrednio wyjścia Q
D
i Q
C
, czyli tu wykrywamy jedynki. Natomiast wyjścia Q
B
i Q
A
podano przez
bramkę NOT zatem tu wykrywamy 0. Dobra, składamy z tego słowo i wychodzi nam: Q
D
Q
C
Q
B
Q
A
=1100 czyli dziesiętnie 12.
No to liczymy.
Start.
Zaczyna się od 8.
Liczymy w dół, zatem dalej, po 8: 7, 6, 5, 4, 3, 2, 1, 0…
Co po zerze? Licznik liczy w „kółko”, zatem po 0 jest: 15, 14, 13…
Co po 13? Po 13 powinno być 12, ale 12, jak wcześniej sprawdziliśmy, jest wykrywana bramką NAND i zeruje układ.
Zatem po 13 jest 8 (bo jak wiemy od 8 układ zaczyna).
Podsumujmy zatem, licznik w tym układzie liczy: 8, 7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 8, 7, 6… i tak w kółko…
Znów zapytam… Wszystko jasne? Teraz już na pewno :)
Skoro tak, to zastanów się w jakim zakresie liczą liczniki skonfigurowane jak na rysunku poniżej:
Jeśli z analizy układu wyszło że od 24 do 100 - gratulacje, umiesz konfigurować i analizować działanie liczników scalonych,
przynajmniej kawałek kolokwium nie powinien być dla Ciebie straszny :)
3.
Przebieg ćwiczenia
W ćwiczeniu nie będziemy się zajmować licznikiem ‘191 lecz licznikiem ‘193. Jest to także licznik scalony liczący w
pełnym zakresie 4-bitowym, konfiguruje się go w sposób bardzo podobny. Spójrzmy:
Piny D, C, B i A oraz Q
D
, Q
C
, Q
B
i Q
A
mają dokładnie takie same funkcje jak w liczniku ‘191, czyli te pierwsze
decydują gdzie zacząć liczyć, te drugie pokazują aktualny stan licznika. Inaczej decyduje się o kierunku zliczania, w liczniku
‘193 po prostu podajemy sygnał na odpowiednie wejście UP lub DOWN, drugie pozostawiając wolnym. Wejście CLR (czyli
clear) służy do zerowania licznika (nie ma ono „falki” zatem zerowanie następuje poprzez podanie tam jedynki), natomiast
wejście ~LOAD również resetuje licznik przy czym zaczyna on wtedy liczyć nie od zera (jak przy zerowaniu przez CLR) ale
od liczby podanej na wejścia DCBA.
3.1.
Zacznijmy w końcu liczyć. Bierzemy licznik ‘193 i podłączamy mu zasilanie (+5[V] i masę).
3.2.
Co będziemy zliczać? Zera i jedynki z generatora. Powiedzmy że chcemy liczyć w górę zatem na wejście UP
licznika podłączamy wyjście TTL output generatora częstotliwości. Mamy zatem taki prosty układ (na CLR podane
jest zero, bowiem nie podanie sygnału to tak jak podanie jedynki i układ permanentnie by się zerował):
3.3.
Niby wszystko gra, no ale skoro chcemy zobaczyć jak układ liczy to musimy gdzieś to wyświetlić. Użyjmy zatem
wyświetlacza siedmiosegmentowego:
Wyświetlacz siedmiosegmentowy jest układem w którym za zaświecenie każdego segmentu odpowiada jedno
wejście. Do sterowania takim wyświetlaczem służy układ scalony ’47, którego jedynym zadaniem jest „przetłumaczyć” kod
binarny 8421 na kod tego wyświetlacza (więcej o tego typu układach w innym ćwiczeniu). Skoro tak, to użyjmy go by
„przetłumaczyć” wyjścia licznika na wejścia wyświetlacza. Nasz układ wygląda teraz tak:
3.4.
Montujemy i można włączać. Zasilanie i generator. Na generatorze oczywiście należy ustawić częstotliwość taką
„że widać jak liczy”, czyli najlepiej kilka Hz.
3.5.
OK, liczy. Można zobaczyć że układ tak zmontowany zlicza impulsy sygnału z generatora w kółko, w zakresie od 0
do 15. Warto sprawdzić jak zachowuje się układ gdy pin CLR odłączymy od zera, albo gdy podamy zero na pin
~LOAD.
3.6.
Przerysować do protokołu sposób wyświetlania poszczególnych liczb - w zakresie od zera do 15. Widać w tym
momencie jak działa układ ’47.
3.7.
Następnie należy zaprojektować i zrealizować na tym liczniku układy zliczające w zadanych przez prowadzącego
zakresach… Powodzenia.
Sposób konfiguracji licznika scalonego do liczenia w zadanym zakresie opisano we wstępie do ćwiczenia.
Potrzebne do tego celu bramki logiczne NAND i NOT są w zestawie kostek ćwiczeniowych (7404 i 7420).
Zaprezentować prowadzącemu poprawność zliczania zadanych układów.
4.
Opracowanie wyników
4.1.
Zaprojektować na dwóch licznikach ‘191 układ zliczający w dół w zakresie od B do A, gdzie: A – dzień miesiąca w
którym wykonano ćwiczenie, B = 255 - A.
4.2.
Na podstawie przerysowanego sposobu wyświetlania liczb z użyciem dekodera ’47 wypełnić tabelę:
wyjścia
wejścia
dziesiętnie
a
b
c
d
e
f
g
D
C
B
A
0
0
0
0
0
1
0
0
0
1
2
0
0
1
0
3
0
0
1
1
4
0
1
0
0
5
0
1
0
1
6
0
1
1
0
7
0
1
1
1
8
1
0
0
0
9
1
0
0
1
10
1
0
1
0
11
1
0
1
1
12
1
1
0
0
13
1
1
0
1
14
1
1
1
0
15
1
1
1
1
Sprawdzić prawidłowość działania tego układu (na podstawie porównania z notą katalogową (do pobrania z [7]) –
NIE załączać noty do sprawozdania!).
4.3.
Zaprojektować układ czterobitowego konwertera naturalnego kodu dwójkowego (BCD) na kod wyświetlacza
siedmiosegmentowego (czyli układ realizujący układ według powyższej tabeli), lecz z poprawionym wyświetlaniem
liczb 6 i 9, wykorzystując wyłącznie bramki NAND.
4.4.
Zaprojektować układ trzybitowego konwertera naturalnego kodu dwójkowego (BCD) na kod dwójkowy refleksyjny
(Graya) z wykorzystaniem wyłącznie bramek NOR.
4.5.
Zaprojektować układ czterobitowego konwertera kodu 6421 na naturalny kod dwójkowy (BCD, czyli 8421) z
wykorzystaniem dowolnych bramek logicznych.
4.6.
Mile widziane dodatkowe wnioski i przemyślenia.
5.
Co trzeba wiedzieć na temat liczników?
Jak skonfigurować licznik scalony do liczenia w dowolnym zakresie w górę lub w dół. Czyli trzeba umieć
rozwiązać zadanie typu:
Dany jest licznik ‘191. Skonfiguruj go tak, by liczył w dół w zakresie od 11 do 4:
Jak i ile liczników należy ze sobą połączyć by zwiększyć zakres zliczania. Czyli zadanie jak powyżej w wersji
z więcej niż jednym licznikiem. Np.:
Zbuduj na licznikach 74191 układ zliczający od 10 do 110.
Oczywiście zamiast licznika 74191 w zadaniu może być licznik 74193.
6.
Co trzeba wiedzieć na temat koderów/dekoderów/transkoderów?
Jak stworzyć tabelę i następnie na jej podstawie zbudować dowolny układ konwertujący między sobą zadane
kody binarne (np. BCD, Graya, 1 z 10, 6421, 5421...).
7.
Literatura
[1] Filipkowski A., „Układy elektroniczne analogowe i cyfrowe”, WN-T, Warszawa 1978
[2] Głocki W., Grabowski L., „Pracownia podstaw techniki cyfrowej”, WSiP, Warszawa 1998
[3] Górecki P., „Układy cyfrowe, pierwsze kroki”, Wydawnictwo BTC, Warszawa 2004
[4] Kalisz J., „Cyfrowe układy scalone w technice systemowej”, WMON, Warszawa 1997
[5] Pieńkos J., Turczyński J., „Układy scalone TTL w systemach cyfrowych”, WKiŁ, Warszawa 1986
[6] Sasal W., „Układy scalone serii UCA64/UCY74, parametry i zastosowania”, WKiŁ, Warszawa 1985
[7] www.datasheetcatalog.com
Opracowanie ćwiczenia: Seweryn Lipiński