JEDNOSTKA ARYTMETYCZNO-LOGICZNA JAL
WSTĘP
W ćwiczeniu Układy arytmetyczne, operacje arytmetyczne w kodzie zm, zu1, zu2, sumator omówiono podstawowe elementy arytmetyczne układów cyfrowych oraz proste przykłady ich zastosowań. Dyskusję ograniczono do rozwiązań stosowanych w małej i średniej skali integracji (SSI, MSI). W elementach scalonych o dużej (LSI) i bardzo dużej (VLSI) skali integracji zawarte są wielofunkcyjne bloki cyfrowe, jednak ich części arytmetyczne mają bardzo zbliżoną do omówionych układów konstrukcję. W ćwiczeniu 12 zostaną przedstawione przykłady układów umożliwiające wykonanie operacji arytmetycznych (mnożenie, dzielenie) oraz logicznych. Układy te można zbudować na podstawie omówionych poprzednio elementów i rejestrów przesuwających.
PROGRAM ĆWICZENIA:
Zbudować czterobitową jednostkę arytmetyczno-logiczną według wzoru z Rys. 3-2 Sprawdzić jej działanie na kilku wybranych przykładach.
Sprawdzić zasady wykonywania operacji arytmetycznych w JAL4181.
Zbudować układ dodająco-odejmujący, opisać zasady jego sterowania.
Zaprojektować i sprawdzić działanie układu mnożącego (sterowanego ręcznie), którego schemat blokowy przedstawia Rys. 3-5.
Przystosować układ mnożący z Rys. 3-5. do operacji dzielenia dwójkowego. Opisać działanie układu.
ZAWARTOŚĆ ĆWICZENIA:
Jednostka arytmetyczno logiczna
Operacje arytmetyczne i logiczne są wykonywane na dwóch (czasem na jednym) operandach. jeden z operandów znajduje się w rejestrze akumulującym wyniki operacji ( w akumulatorze), a drugi operand jest pobierany z pamięci, na przykład z pamięci operacyjnej komputera. Działania arytmetyczne i logiczne są realizowane w postaci szeregu kroków, zwanych operacjami elementarnymi.
Omówiony w ćwiczeniu Układy arytmetyczne, operacje arytmetyczne w kodzie zm, zu1, zu2, sumator czterobitowy sumator 483 wykonuje również operacje logiczne. Sumator realizuje zależności:
Si = Ai (+) Bi (+) Ci, Ci+1 = AiBi + AiCi + BiCi.
Zadając Ci=0, otrzymamy:
Si = Ai (+) Bi, Ci+1 = AiBi.
Dla Ci=1 otrzymujemy:
Si = Ai (+) Bi (+) 1 = ~( Ai (+) Bi),
Ci+1 = AiBi + Ai + Bi = Ai + Bi.
Zadając Bi=1 oraz Ci=0, otrzymamy Si = ~Ai. Dla C0=1 i Bi=0 wartość operanda A zostaje zwiększona o 1.
Rys. 3-1 Schemat ideowy dwubitowego sumatora iteracyjnego
Układ przedstawiony na Rys. 3-1 jest fragmentem sumatora kaskadowego 483. Przeniesienie Ci+1 nie jest bezpośrednio dostępne. Wartość tej zmiennej można jednak zaobserwować na wyjściu Si+1, zadając Ai+1 = Bi+1 = 0. Wykorzystując zmienne Ai+1 oraz Bi+1 jako sygnały programujące, można wynik operacji realizowanych z udziałem i-tej komórki odczytać na wyjściach Si oraz Si+1.
Rys. 3-2 Dwubitowy programowany blok arytmetyczno-logiczny: a) schemat ideowy, b) oznaczenie schematowe
Pokazany na Rys. 3-2a układ przedstawia dwubitowy programowany blok arytmetyczno-logiczny (jednostkę arytmetyczno-logiczną) zbudowany na podstawie czterobitowego sumatora 483. Zmienne M1, M2, M3 i M4 służą do programowania rodzaju pracy sumatora. Zbiór operacji elementarnych tego układu zestawiono wTab. 3-1.
M1 |
M2 |
M3 |
M4 |
Operacja |
0 |
0 |
0 |
0 |
iloczyn logiczny Yi = AiBi |
0 |
0 |
0 |
1 |
Yi = Ai (+) Bi |
C0 |
0 |
1 |
1 |
suma arytmetyczna A, B i C0 |
C0 |
1 |
0 |
1 |
|
1 |
1 |
1 |
1 |
Yi = ~(Ai (+) Bi) |
Tab. 3-1 Operacje elementarne bloku arytmetyczno-logicznego zbudowanego na podstawie sumatora (483)Typowym elementem scalonym wykonującym operacje arytmetyczno-logiczne jest JAL 4181
Może on wykonywać operacje arytmetyczne: dodawanie i odejmowanie w zapisie "znak- uzupełnienie do 1" i logiczne: AND, OR, E-OR, ~A i inne. Ogółem jest to szesnaście operacji arytmetycznych i szesnaście logicznych (nie wszystkie są wykorzystywane). Oznaczenia schematowe JAL 4181 przedstawiono na Rys. 3-1. Ważniejsze operacje tego elementu zestawiono w Tab. 3-2.
Rys. 3-3 Oznaczenia elementu MSI-JAL 74181
A, B - czterobitowe zmienne wejściowe - operandy, S - zmienne programujące, M - wybór grupy operacji (arytmetyczne, logiczne) Cn, Cn+4 - przeniesienia; G, P - zmienne przeniesień równoległych, F - wyjścia, wynik operacji.
S3 |
S2 |
S1 |
S0 |
M = 1 Operacje logiczne |
M = 0 Operacje arytmetyczne |
0 |
0 |
0 |
0 |
F = ~A |
|
0 |
0 |
0 |
1 |
F = ~(A (+) B) |
|
0 |
1 |
0 |
0 |
F = A * B |
|
0 |
1 |
0 |
1 |
F = ~B |
|
0 |
1 |
1 |
0 |
F = A (+) B |
F = A - B - 1 |
1 |
0 |
0 |
1 |
F = ~(A (+) B) |
F = A + B |
1 |
0 |
1 |
0 |
F = B |
|
1 |
0 |
1 |
1 |
F = A * B |
|
1 |
1 |
1 |
0 |
F = A + B |
|
1 |
1 |
1 |
1 |
F = A |
|
Tab. 3-2 Wybrane operacje JAL74181 (logika pozytywna)
Operacje arytmetyczne JAL
Działanie uniwersalnego systemu cyfrowego (np. maszyny cyfrowej) polega na realizacji zadanych operacji arytmetycznych i logicznych na wielobitowych operandach. operacje te są wykonywane w formie ciągu operacji elementarnych bloku arytmetyczno-logicznego składającego się z JAL i rejestru akumulującego (akumulatora). Znane są liczne algorytmy realizacji operacji arytmetycznych na różnych operandach. Były one częściowo analizowane w ćwiczeniu: Układy arytmetyczne, operacje arytmetyczne w kodzie zm, zu1, zu2, sumator.
W obecnym ćwiczeniu zostaną omówione algorytmy dodawania/odejmowania, mnożenia i dzielenia w zapisie "znak - uzupełnienie do 1" (dla operandów wielobitowych). Pojawiające się przeniesienia na najstarszej pozycji oznacza dodanie wartości 1 do wyniku operacji. Przedstawiona poniżej dyskusja może posłużyć do zaprojektowania tzw. jednostki sterującej (JS), która w sposób automatyczny steruje procesem realizacji zadanej operacji.
Istotną informacją dla jednostki sterującej jest wartość znaku ZN zarówno dla operanda, jak i wyniku operacji. Gdy znak jest ujemny, moduł należy uzupełnić do 1.
Rys. 3-4 Schemat blokowy układu dodająco-odejmującego: A - akumulator, E - sumator, T - dopełnienie do 1, ZN - znak, P - przerzutnik, n - numeracja (liczba) bitów, PkPj - zmienne programujące
W układzie przedstawionym na Rys. 3-4 kolejne operandy pojawiają się na wejściu B i są dodawane do zawartości rejestru A. W pierwszym kroku należy wyzerować akumulator, po czym wprowadzamy do niego pierwszy operand, dodając do zawartości akumulatora wartość B (B+0 = B). Dla prostego dodawania najpierw wprowadzamy pierwszy składnik do A, następnie do zawartości A dodajemy drugi składnik (A+B) i wynik operacji zostaje przechowany (zapamiętany) w akumulatorze. Gdy drugi operand ma znak ujemny, zawartość akumulatora mus być przesłana do dodatkowego rejestru pomocniczego. Dla mnożenia czy dzielenia operacja ta jest wielokrotnie powtarzana po odpowiednim przesunięciu zawartości akumulatora. Charakterystyczną cechą rozwiązania jest fakt, że bit znaku jest dodawany poza zasadniczym elementem arytmetycznym (E ZN), ponieważ nie bierze udziału w operacji dopełnienia. Dopełnienie dotyczy tylko modułu operanda czy wyniku operacji. Zmienne Pk służą do programowania rodzaju operacji JAL (dla układu z Rys. 3-2 są to M1, M2, M3, M4, dla JAL 4181 są to zmienne S), zmienne Pj określają sposób pracy rejestru (szeregowo, równolegle) oraz fazę impulsu taktującego. Akumulator ma taka samą liczbę bitów, jak jednostka arytmetyczno-logiczna. Znak wyniku operacji jest przechowywany w dodatkowym przerzutniku PZN.
Mnożenie dwójkowe
Operacja mnożenia dwójkowego odbywa się przez wielokrotne dodawanie przesuniętych iloczynów częściowych modułów operandów. Zasada mnożenia dwójkowego została zilustrowana poniższym przykładem:
10 x 13 = 130 = (1000 0010) = 128+2 = 130.
Realizacja operacji:
|
1010 |
|
mnożna |
x |
1101 |
|
mnożnik |
|
|
|
|
|
1010 |
|
dodać |
0 |
000 |
|
|
10 |
10 |
|
|
101 |
0 |
|
|
|
|
|
|
1000 |
0010 |
|
130 |
Praktyczna realizacja tej operacji wygląda nieco inaczej:`
1010 |
|
przesunięcie
przesunięcie
przesunięcie
przesunięcie =128+2=130 |
1010 |
0 |
|
0101 0010 + 1010 |
0 10
|
|
1101 |
10 010
|
|
10000 1000 |
010 0010 |
|
Mnożenie to odbywa się przez wielokrotne dodawanie mnożnej lub wartości 0 na wszystkich bitach. Sumy częściowe (można również mówić o iloczynach częściowych) są przesuwane w kierunku bitów młodszych. Wychodzące poza położenie mnożnej bity sum częściowych (oddzielone linią pionową) nie biorą udziału w dodawaniu, położenie mnożnej pozostaje bez zmian. Rozszerzając układ z Rys. 3-4. o dodatkowy rejestru przesuwający RP, otrzymujemy układ mnożący, jak na Rys. 3-5.
.
Rys. 3-5 Schemat blokowy układu dodająco-odejmującego i mnożącego:
RP - rejestr pomocniczy (przesuwający), Pm - zmienne programujące, M - mnożnik, (B)x(RP) - wynik mnożenia.
Do rejestru RP wprowadzamy mnożnik, którego najmłodszy bit RP0 jest kontrolowany przez jednostkę sterującą. Operand B reprezentuje mnożną, której wartość i położenie pozostaje bez zmian przez cały czas trwania operacji. Kolejne sumy częściowe są wprowadzone do akumulatora A. Każde przesunięcie zawartości A powoduje przesunięcie na pozycję RP0 wartości kolejnych starszych bitów mnożenia. Wartość RP0= 1 oznacza wykonanie dodawania B i zawartości akumulatora oraz zapamiętanie wyniku tej operacji (kolejnej sumy częściowej) w akumulatorze i przesunięcie tej wartości w kierunku bitów młodszych. RP0 = 0 oznacza tylko przesunięcie zawartości akumulatora. liczba kroków tej operacji jest równa liczbie bitów rejestru RP (która jest równa liczbie bitów A i RP). Wynik odczytuje się w rejestrze RP, gdzie najniższą wagę ma pozycja RP0.
Dzielenie dwójkowe
Operacja dzielenia dwójkowego polega na wielokrotnym odejmowaniu dzielnika od różnic (ilorazów) częściowych. Zasadę dzielenia dwójkowego zilustrowano jednym z algorytmów, w którym operacja odbywa się w dwóch etapach: dzielenie części całkowitej (wynik jest liczbą całkowitą - C), dzielenie reszty (wynik jest ułamkiem - R). W czasie operacji dzielenia cały czas jest kontrolowana wartość bitu znaku ZN, na podstawie której jednostka sterująca określa wartości odpowiednich zmiennych programujących.
Sposób wykonywania kolejnych kroków operacji dzielenia ilustruje poniższy przykład: 10 : 3 = 0,00...1010 : 0,00...0011 = C + R = 1 + 1 + 1 + R
+ |
1,11...1100 |
|
(1) |
0,00...0110 |
|
|
→1 |
|
|
0,00...0111 |
pierwsza różnica częściowa ZN=0, C=1 + ... |
+ |
1,11...1100 |
|
(1) |
0,00...0011 |
|
|
→1 |
|
|
0,00...0100 |
druga różnica częściowa ZN=0, C=1 + 1 + ... |
+ |
1,11...1100 |
|
(1) |
0,00...0000 |
|
|
→1 |
|
|
0,00...0001 |
trzecia różnica częściowa ZN=0, C=1 + 1 + 1 + ... |
+ |
1,11...1100 |
|
"-" > |
1,11...1101 |
- wartość ujemna oznacza rozpoczęcie dzielenia reszty R |
ZN = 1, R = 0, ..., C = 1 + 1 + 1 + R
Dzielenie reszty:
|
|
1,1 1 . . . 1 1 0 1 |
|
|
+ |
0,0 0 . . . 0 0 1 1 |
|
|
(1) |
0,0 0 . . . 0 0 0 0 |
|
|
|
→1 |
|
przesunięcie |
|
0,0 0 . . . 0 0 0 1 |
|
|
|
0,0 0 . . . 0 0 0 1 0 |
|
|
+ |
1,1 1 . . . 1 1 0 0 |
|
|
|
1,1 1 . . . 1 1 0 0 |
pierwsza różnica częściowa dla reszty ZN=1, Rk=0, R=0,0... |
|
+ |
0,0 0 . . . 0 0 1 1 |
|
|
(1) |
0,0 0 . . . 0 0 0 1 |
|
|
|
→1 |
|
przesunięcie |
|
0,0 0 . . . 0 0 1 0 |
|
|
|
0,0 0 . . . 0 0 1 0 0 |
|
|
+ |
1,1 1 . . . 1 1 0 0 |
|
|
(1) |
0,0 0 . . . 0 0 0 0 |
|
|
|
→1 |
|
przesunięcie |
|
0,0 0 . . . 0 0 0 1 |
druga różnica częściowa, ZN=0, Rk=1, R=0,01... |
|
|
0,0 0 . . . 0 0 0 1 0 |
|
|
+ |
1,1 1 . . . 1 1 0 0 |
|
|
|
1,1 1 . . . 1 1 1 0 |
trzecia różnica częściowa, ZN=1, Rk=0, R=0,010... |
|
+ |
0,0 0 . . . 0 0 1 1 |
|
|
(1) |
0,0 0 . . . 0 0 0 1 |
|
|
|
→1 |
|
przesunięcie |
|
0,0 0 . . . 0 0 1 0 |
|
|
|
0,0 0 . . . 0 0 1 0 0 |
|
|
+ |
1,1 1 . . . 1 1 0 0 |
|
|
(1) |
0,0 0 . . . 0 0 0 0 |
|
|
|
→1 |
|
|
|
0,0 0 . . . 0 0 0 1 |
czwarta różnica częściowa, ZN=0, Rk=1, R=0,0101... |
Różnica częściowa pierwsza i trzecia oraz druga i czwarta są sobie równe. Różnica R jest więc ułamkiem okresowym. Wartości bitów po przecinku (Rk) można zapisać dziesiętnie. Podczas gdy wagi bitów liczb całkowitych są większe (lub równe) od jedności - 20, 21, 22, ... , 2n-1, wagi bitów liczb mniejszych od jedności są również mniejsze od jedności - 2-1, 2-2, ... , 2-(n-1). Tak więc wynik (iloraz I) operacji można zapisać:
I = C + R = 3 + 1/4 + 1/16 + 1/64 + ... + Rk.
Opisaną operację dzielenia dwójkowego można wykonać za pomocą układu przedstawionego na Rys. 3-4 lub Rys. 3-5, gdzie rejestr A musi również umożliwiać przesuwanie swojej zawartości w lewo (w kierunku bitów starszych).
LITERATURA
[1] K. Badźmirowski, J. Pieńkos, W Piestrzyński: Cyfrowe układy MOS LSI> Warszawa WKiŁ 1979.
[2] W. Binkowski, H. Krzyż, J. Piecha: Elektronika analogowa i cyfrowa w zadaniach. Katowice Wydawnictwo Uniwersytetu śląskiego 1981.
[3] D. Eadie: Nowoczesne maszyny i systemy cyfrowe. Warszawa WNT 1975.
[4] P. Misiurewicz, M. Grzybek: Półprzewodnikowe układy logiczne TTL. Warszawa WNT 1979.
[5] J. Kalisz: Cyfrowe układy scalone w technice systemowej. Warszawa MON 1977.
[6] J. Siwiński: Układy przełączające w automatyce. Warszawa WNT 1980.
[7] F. Wagner: Projektowanie urządzeń cyfrowych. Warszawa WNT 1978.
Instrukcja do ćwiczenia 8 3