Podręcznik
2. Dekompozycja funkcjonalna metodą rachunku podziałów
2.1. Dekompozycja funkcjonalna – model podstawowy
W tym punkcie zajmiemy się analitycznym opisem dekompozycji funkcji boolowskich. Do tego celu posłużymy się omówionym w rozdz. 1 rachunkiem podziałów. W szczególności wyprowadzimy warunki dekompozycji dla funkcji boolowskich opisanych podziałami P1, P2,..., Pn, Pf określonymi na zbiorze K ponumerowanych wektorów tablicy prawdy funkcji f.
Na początek zajmiemy się poszukiwaniem realizacji f = h(U,g(V,W)), gdzie:
a ponadto
Sens powyższych ustaleń wynika z faktu, że dla danego U zbiór V może być wyznaczony bezpośrednio z reprezentacji argumentowej RAf ograniczonej do par p, q: {p,q}
BLOK(PU), gdzie 
Oznaczając tak zdefiniowaną reprezentację przez RAg, łatwo stwierdzić, że V jest rozwiązaniem równania RAg = 1. Ponadto przez PV, PW będziemy oznaczać podziały na K określone zbiorami V i W, tzn.:
W szczególności f = h(U, g (V)) wtedy i tylko wtedy, gdy istnieje Pg ³ PV, dla którego PU · Pg
Pf (jest to tzw. dekompozycja rozłączna [3.15].
Uzasadnienie jest natychmiastowe, jeżeli zauważymy, że dwublokowy podział Pg ³ PV,W jednoznacznie reprezentuje funkcję g, natomiast PU · Pg funkcję h. Otóż każdy blok H podziału PV,W jest wzajemnie jednoznaczną reprezentacją wektora o składowych
, gdyż skoro H
PV · PW, to dla każdego Pa spośród
blok H należy do ustalonego bloku podziału Pa. Zapisując ten fakt w formie przyporządkowania:
H ® wektor o składowych binarnych c
{0,1}
i uwzględniając, że blokom tym są w podziale Pg przyporządkowane:
uzyskujemy naturalną reprezentację g: B t-r+p ® {0,1}. Z kolei, skoro PU · Pg
Pf, to
i tym samym 
Natomiast wartości h wynikają (analogicznie jak poprzednio) z przynależności bloków PU · Pg do bloków podziału Pf.
Jak wynika z twierdzenia 3.2 najistotniejsze w obliczeniu dekompozycji funkcji boolowskiej jest obliczenie podziału PG. Algorytm obliczania PG można sprowadzić do algorytmu obliczania MKZ. Oznaczmy bloki podziału PV: PV =(B1,…,Bi,…,Bj,…,BN) i przyjmijmy przez poddział gij rozumieć podział uzyskany z PV przez sklejenie Bi oraz Bj w jeden blok i pozostawienie pozostałych bloków bez zmiany, tzn.: gij =(B1,…,BiBj,…,BN).
Dwa bloki Bi i Bj podziału PV są zgodne, jeśli podział gij spełnia warunek twierdzenia o dekompozycji: PU · gij £ PF. W przeciwnym przypadku Bi oraz Bj są niezgodne.
W ten sposób obliczanie ΠG można sprowadzić do algorytmu obliczania MKZ. Wystarczy w tym celu dla obliczonych par zgodnych Bi, Bj (albo sprzecznych) obliczyć rodzinę maksymalnych zbiorów zgodnych bloków B, a następnie stosując algorytm wyznaczania minimalnego pokrycia skojarzyć zbiory bloków minimalnego pokrycia z blokami podziału ΠG.
Sposób postępowania wyjaśnimy na przykładzie funkcji podanej w tablicy 3.5.
Tablica 3.5
|
|
x1 |
x2 |
x3 |
x4 |
x5 |
f |
|
1 |
0 |
0 |
0 |
0 |
0 |
0 |
|
2 |
0 |
1 |
0 |
1 |
1 |
0 |
|
3 |
0 |
0 |
1 |
0 |
1 |
0 |
|
4 |
0 |
1 |
1 |
1 |
1 |
0 |
|
5 |
0 |
0 |
1 |
1 |
0 |
0 |
|
6 |
0 |
1 |
0 |
0 |
1 |
1 |
|
7 |
0 |
0 |
1 |
0 |
0 |
1 |
|
8 |
0 |
1 |
1 |
1 |
0 |
1 |
|
9 |
1 |
0 |
1 |
0 |
1 |
1 |
|
10 |
1 |
1 |
0 |
0 |
1 |
1 |
|
11 |
1 |
0 |
0 |
0 |
1 |
1 |
Zakładając dekompozycję dla zbiorów: U = {<i>x</i><sub>1</sub>,x<sub>2</sub>}, V = {<i>x</i><sub>3</sub>,<i>x</i><sub>4</sub>,<i>x</i><sub>5</sub>} podziały PU = P3•P4 i PV = P1•P2•P5 można wyznaczyć bezpośrednio z podziałów:
Na tej podstawie obliczamy:
Numerujemy bloki PV:
PV = (B1, B2, B3, B4 , B5, B6 , B7)
czyli para (B1, B2) jest zgodna, natomiast para (B5, B7) jest sprzeczna.
Ale do wyznaczenia zgodnych (lub sprzecznych) par (Bi, Bj) niekoniecznie musimy się posługiwać skomplikowaną nierównością PU · gij £ PF. Wystarczy w tym celu obliczyć iloczyn zbioru Bi È Bj z blokami podziału PU i sprawdzić, czy każdy „niepusty iloczyn” jest zawarty w jakimś bloku PF.
Do obliczenia PG zastosujemy algorytm wyznaczania klas zgodnych wg par niezgodności: (B1, B7), (B2, B5), (B2, B6), (B3, B7), (B4, B5), (B4, B6), i (B5, B7). Utworzona według par niezgodnych formuła typu iloczyn sum i jej kolejne przekształcenia są następujące:
(B1 + B7) (B2 + B5) (B2 + B6) (B3 + B7) (B4 + B5) (B4 + B6) (B5 + B7) =
= (B7 + B1B3B5) (B2B4 + B5B6) = B2B4B7 + B5B6B7 + B1B2B3B4 B5 + B1B3B5B6
Klasy zgodne uzyskamy odejmując od zbioru {<i>B</i><sub>1</sub>,...,<i>B</i><sub>7</sub>}, zbiory tych Bi, które występują w jednym składniku obliczonego wyżej wyrażenia typu „suma iloczynów”. Stąd:
B1B3B5B6 + B1B2B3B4 + B6B7 + B2B4B7.
{<i>B</i><sub>1</sub>,..., <i>B</i><sub>7</sub>} - {<i>B</i><sub>2</sub>, <i>B</i><sub>4</sub>, <i>B</i><sub>7 </sub>} = { <i>B</i><sub>1</sub>, <i>B</i><sub>3</sub>, <i>B</i><sub>5</sub>, <i>B</i><sub>6</sub>}
{<i>B</i><sub>1</sub>,...,<i>B</i><sub>7</sub>} - {<i>B</i><sub>5 </sub>, <i>B</i><sub>6 </sub>, <i>B</i><sub>7</sub> } = {<i> B</i><sub>1</sub>, <i>B</i><sub>2</sub>, <i>B</i><sub>3</sub>, <i>B</i><sub>4</sub>}
{<i>B</i><sub>1</sub>,...,<i>B</i><sub>7</sub>} - {<i>B</i><sub>1</sub>, <i>B</i><sub>2</sub>, <i>B</i><sub>3</sub>, <i>B</i><sub>4 </sub>, <i>B</i><sub>5</sub>} = {<i>B</i><sub>6 </sub>, <i>B</i><sub>7</sub>}
{<i>B</i><sub>1</sub>,...,<i>B</i><sub>7</sub>} - {<i> B</i><sub>1</sub>, <i>B</i><sub>3</sub>, <i>B</i><sub>5</sub>, <i>B</i><sub>6</sub>} = {<i>B</i><sub>2</sub>, <i>B</i><sub>4</sub>, <i>B</i><sub>7 </sub>}
Z powyższych klas bloków zgodnych można wyselekcjonować dwie: { <i>B</i><sub>1</sub>, <i>B</i><sub>3</sub>, <i>B</i><sub>5</sub>, <i>B</i><sub>6</sub>} oraz{<i>B</i><sub>2</sub>, <i>B</i><sub>4</sub>, <i>B</i><sub>7 </sub>}, pokrywające zbiór {<i>B</i><sub>1</sub>,..., <i>B</i><sub>7</sub>}, czyli:
W tym przypadku rozwiązanie jest trywialne. Wracając do pierwotnych kostek tworzących poszczególne bloki Bi otrzymujemy:
w którym od razu określamy kodowanie bloków.
Obliczanie podziału PG można uprościć rezygnując z możliwości uzyskania rozwiązania optymalnego tj. podziału PG z najmniejszą liczbą bloków, co w realizacji odpowiada najmniejszej liczbie wyjść z komponentu G. Metoda prowadząca do takiego rozwiązania polega na zastosowaniu podziału ilorazowego PU |PU·PF. Podział ilorazowy podaje informację, które bloki podziału PV należy umieścić w różnych blokach tworzonego podziału PG. Dwa bloki Bi, Bj, podziału PV należy umieścić w różnych blokach PG wtedy, gdy ich przecięcia ze zbiorem Bu podziału PU należą do różnych elementów Cs, Ct, odpowiedniego bloku podziału PU |PU·PF. Taką metodę konstruowania podziału PG nazywać będziemy metodą rozdziału elementów podziału ilorazowego PU |PU·PF. Na przykład dla podziałów PU, Pf, PV z przykładu 3.1:
podział ilorazowy jest następujący: 
Rozważmy bloki B1 i B7 podziału PV. Ich przecięcia z blokiem
, czyli 1 i 7 należą odpowiednio do Cs = (1,3,5) oraz Ct = (7), czyli dwóch różnych elementów PU |PU·Pf. Zatem konstruując podział PG należy B1 i B7 umieścić w różnych blokach PG.
Metodę rozdziału przy tworzeniu podziału PG dla funkcji z przykładu 3.1 wyjaśnimy posługując się interpretacją graficzną przedstawioną na rys. 3.4.
Rys. 3.4. Konstrukcja podziału Pg
Z podziału ilorazowego wnioskujemy, że PG może być dwublokowy i musi rozdzielać elementy (1,3,5) od (7), (2,4) od (6,8) itd. Dlatego (zaczynając od pierwszego bloku podziału ilorazowego) bloki PV zawierające elementy 1; 3,9 oraz 5,8 umieszczamy w pierwszym bloku PG – na rys 3.3 z lewej strony pionowej kreski, natomiast blok zawierający 7 musimy umieścić w drugim – po prawej stronie pionowej kreski. W drugim bloku podziału ilorazowego należy rozdzielić (2,4) od (6,8). Ale element 8 został już wpisany do pierwszego bloku, zatem również do pierwszego bloku należy wpisać blok PV = (6,10,11), natomiast do drugiego należy wpisać (2) i (4). W rezultacie uzyskujemy identyczny jak poprzednio.
Skuteczność wprowadzonego aparatu pokażemy na przykładzie funkcji TL27 (podroz. 2.6 – tab. 2.28 ).
Dla tej funkcji obliczyliśmy jeden z minimalnych zbiorów argumentów: X = {<i>x</i><sub>3</sub>, <i>x</i><sub>5</sub>,<i> x</i><sub>6</sub>,<i> x</i><sub>7</sub>,<i> x</i><sub>8</sub>,<i> x</i><sub>9</sub>,<i> x</i><sub>10</sub>}. Korzystając z tej informacji załóżmy poszukiwanie dekompozycji dla zbiorów U = {<i>x</i><sub>7</sub>, <i>x</i><sub>8</sub>,<i> x</i><sub>9</sub>} oraz V = {<i>x</i><sub>3</sub>, <i>x</i><sub>5</sub>,<i> x</i><sub>6</sub>,<i> x</i><sub>10</sub>}. Bezpośrednio z tablicy 2.28 zapisujemy podziały Pi utworzone na zbiorze K ponumerowanych wektorów K = {1, 2, …, 25}:
Kolejne obliczenia uzyskane bezpośrednio z podziałów Pi są następujące:
Dla wygody dalszych obliczeń podział PU zapiszemy w postaci podziału ilorazowego:
Najważniejszą czynnością jest obliczenie podziału Pg . Aby to zrealizować wystarczy zauważyć, że:
- podział Pg musi rozdzielać elementy 1 i 4 od elementu 10; 2 od 11; 3 od 14 i 18 i 21 itp. Wynika to z podziału ilorazowego,
- podział Pg musi być zbudowany z bloków podziału PV.
Zatem, jeśli zaliczymy bloki
oraz
do pierwszego bloku Pg, to blok
musimy zaliczyć do drugiego bloku Pg (ponieważ zawiera element 10) itp. Reszta obliczeń jest pokazana na rys. 3.5.
|
Pg |
|
|
Blok pierwszy |
Blok drugi |
|
|
|
Rys. 3.5. Konstrukcja podziału Pg
Na tej podstawie stwierdzamy, że:
Zastosowanie omówionych wyżej algorytmów dekompozycji do syntezy logicznej modułów wielowyjściowych (np. matryce PLA, moduły PLD, pamięci ROM) wymaga przede wszystkim uogólnienia podstawowego twierdzenia o dekompozycji na przypadek układów wielowyjściowych. Łączna (jednoczesna) dekompozycja wszystkich funkcji wchodzących w skład układu realizowanego z zastosowaniem modułu wielowyjściowego pozwala na wyodrębnienie wielowyjściowych podukładów H, G, których tablice prawdy stanowią bądź bezpośrednią informację, określającą na przykład zawartość pamięci ROM lub komórki typu LUT, bądź też są punktem wyjścia do dalszych etapów syntezy (np. minimalizacja układów wielowyjściowych) w przypadku matryc PLA.
Łatwo sprawdzić, że PV × Pg £ Pf. Zatem dekompozycja istnieje. Dalej, korzystając z podziałów PV i Pg obliczamy tablicę funkcji g (tab. 3.7). Obliczenia interpretujemy następująco. Dla przykładu: blok
jest zawarty w drugim bloku podziałów P1, P5, P6, natomiast w pierwszym bloku podziału P10 oraz w pierwszym bloku podziału Pg. Dlatego odpowiadający mu wektor jest 1110, ma wartość funkcji g = 0 (patrz tab. 3.6).
Podobnie postępujemy dla funkcji h (tab. 3.7), ale tu korzystamy z bloków iloczynu podziałów PU × Pg oraz ich przynależności do podziałów P7, P8, P9, Pg oraz Pf .
|
Tablica 3.6 |
Tablica 3.7 |


















































