Podręcznik
4. Metody minimalizacji funkcji boolowskich
4.1. Metoda Karnaugha
Mimo swoich niedoskonałości metoda Karnaugha jest najczęściej wykładaną metoda minimalizacji funkcji boolowskich. Paradoksalnie to co jest jej wadą – prostota – jest jednocześnie jej zaletą, gdyż można szybko ją „opanować” i stosować w obliczeniach ręcznych. Należy jednak pamiętać, że w praktyce projektowania inżynierskiego metoda tablic Karnaugha jest absolutnie nieprzydatna, gdyż zakres jej zastosowań kończy się na funkcjach 6 – 7 argumentów, a typowe zadania praktyczne operują funkcjami o kilkudziesięciu argumentach.
Rys. 2.8. Zasada sklejania
W metodzie Karnaugha każda kratka odpowiedniej tablicy (zwanej tablicą Karnaugha) odpowiada wektorowi zmiennych binarnych. Można więc powiedzieć, że ciąg wartości tych zmiennych tworzy adres kratki. Kratki są ponumerowane w taki sposób, że numer i jest liczbą dziesiętną odpowiadającą kombinacji zmiennych (wektorowi zero-jedynkowemu) traktowanej jako liczba dwójkowa. W poszczególnych kratkach wpisane są wartości funkcji, tj. 0 lub 1 przyjmowanej przez funkcję dla tej kombinacji lub symbol „–”, jeżeli funkcja nie jest określona (rys. 2.8). W tablicy Karnaugha różniącym się tylko o negację pełnym iloczynom przyporządkowane są leżące obok siebie pola tablicy (sąsiednie kratki), które się łączy (skleja) odpowiednią pętelką. Korzysta się z faktu, że dla dowolnego .
Dla uzyskania efektu sąsiedztwa współrzędne pól opisuje się tzw. kodem Gray’a. Kod Gray’a jest takim ciągiem wektorów binarnych, w którym każde dwa sąsiednie wektory różnią się wyłącznie na jednej pozycji. Przykłady kodu Gray’a dla dwóch i trzech zmiennych podane są w tabl. 2.10.
Tablica 2.10
0 |
0 |
|
0 |
0 |
0 |
0 |
1 |
|
0 |
0 |
1 |
1 |
1 |
|
0 |
1 |
1 |
1 |
0 |
|
0 |
1 |
0 |
|
|
|
1 |
1 |
0 |
|
|
|
1 |
1 |
1 |
|
|
|
1 |
0 |
1 |
|
|
|
1 |
0 |
0 |
Minimalizacja metodą Karnaugha polega na wykonaniu dwóch czynności:
- wpisanie funkcji do tablicy,
- zakreślanie pętelek i kojarzenie z nimi iloczynów zmiennych prostych i zanegowanych.
Wpisywanie funkcji do tablicy Karnaugha ułatwia numeracja kratek. Na rys. 2.9 podajemy przykłady tablic Karnaugha z ponumerowanymi kratkami według naturalnego kodu binarnego (NKB), odpowiednikami. Wzorce tych tablic ułatwiają znajdowanie kratek odpowiadających wektorom w tablicy prawdy.
Rys. 2.9. Przykłady tablic z ponumerowanymi kratkami
Minimalizacja funkcji f z poprzedniego rozdziału, której tablicę prawdy powtarzamy w tabl. 2.11 wymaga zatem wpisania funkcji do tablicy Karnaugha.
Tablica 2.11
|
x1 |
x2 |
x3 |
f |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
2 |
0 |
1 |
0 |
0 |
3 |
0 |
1 |
1 |
1 |
4 |
1 |
0 |
0 |
0 |
5 |
1 |
0 |
1 |
1 |
6 |
1 |
1 |
0 |
1 |
7 |
1 |
1 |
1 |
1 |
Wystarczy w tym celu wyszukiwać kratki tablicy, których współrzędne odpowiadają wektorom tablicy prawdy i do ich wnętrza wpisywać wartość funkcji.
Tablica 2.12
Tablica Karnaugha funkcji f podana jest w tabl. 2.12. Następnie zakreślamy pętelki. Pętelki muszą obejmować kratki wypełnione „1”, których współrzędne reprezentują pełne iloczyny zmiennych podlegające uproszczeniu zasadami algebry Boole’a. Łatwo stwierdzić, że „1” małej pętelki są opisane wyrażeniem:
natomiast dużej:
Stosując zasady algebry Boole’a można wyrażenie 2-1 uprościć do iloczynu x1x2, natomiast wyrażenie 2-2 do jednej zmiennej x3, zatem f = x1x2 + x3.
Niestety zakreślanie pętelek i kojarzenie z nimi odpowiednich iloczynów jest trudniejsze. Omawiamy ten proces na bardziej skomplikowanym przykładzie (rys. 2.10), w którym dla poszczególnych kopii tablicy Karnaugha trzech zmiennych zaznaczamy pola odpowiadające pojedynczym zmiennym (prostym i zanegowanym). Pokrywanie się tych pól określa odpowiedni iloczyn zmiennych prostych
Rys. 2.10. Ilustracja minimalizacji funkcji boolowskiej
Minimalizacja funkcji za pomocą tablic Karnaugha sprowadza się do wykonania czynności opisanych w następującym algorytmie.
Algorytm 2.1
1) Wpisujemy funkcję do tablicy Karnaugha.
2) Zakreślamy pętelki.
a) Pętelki zakreślamy wokół grup sąsiadujących kratek zawierających „1” albo „1” i „–” (kreski).
b) Liczba kratek objętych pętelka musi wynosić: 1, 2, 4, …,2k.
c) Staramy się objąć pętelką jak największą liczbę kratek.
3) Pętelki zakreślamy tak długo, aż każda „1” będzie objęta co najmniej jedną pętelką, pamiętając o tym aby pokryć wszystkie „1” możliwie minimalną liczbą pętelek.
4) Z każdą pętelką kojarzymy iloczyn zmiennych prostych lub zanegowanych. Suma tych iloczynów, to minimalne wyrażenie boolowskie danej funkcji.
Należy zminimalizować funkcję f zapisaną symbolicznie w postaci SOP liczbami dziesiętnymi:
f = S[0, 5, 6, 7, 10, (2, 3, 11, 12)]
Tablica 2.13
Korzystając z odpowiedniego wzoru tablicy z rys. 2.9 znajdujemy kratki o odpowiednich numerach i wpisujemy do nich „1” i ”–„ (kreski). W pozostałe wpisujemy „0”. Po wpisaniu zakreślamy pętelki (tabl. 2.13), z którymi kojarzymy odpowiednie iloczyny, uzyskując w rezultacie minimalne wyrażenie boolowskie w postaci sumy iloczynów:
W podobny sposób postępujemy przy obliczaniu minimalnego wyrażenia w postaci iloczynu sum. Jedyną różnicą jaką w tym przypadku należy wprowadzić do algorytmu 2.1 jest zmiana w punkcie w punkcie 2a, a mianowicie: pętelki zakreślamy wokół grup sąsiadujących kratek zawierających „0” albo „0”
Minimalizacja funkcji z przykładu 2.4 do postaci iloczynu sum przedstawiona jest na tabl. 2.14.
Rozwiązanie
Tablica 2.14
Poszczególnym pętelkom na tej tablicy odpowiadają sumy zmiennych, których iloczyn tworzy następujące wyrażenie:
Uprościć następujące wyrażenie:
Rozwiązanie
Nanosimy wyrażenie Y na tablicę Karnaugha (tab. 2.15) i upraszczamy tworząc pętelki obejmujące zera. Następnie wypisujemy rozwiązanie, dla kanonicznego iloczynu sum argumenty z 0 są proste, argumenty z 1 są zanegowane.
Tablica 2.15
Po minimalizacji uzyskaliśmy następująca funkcję:
Przykład 2.4 posłuży teraz do wprowadzenia jednego z najważniejszych pojęć minimalizacji jakim jest implikant.
Implikant danej funkcji f jest to iloczyn literałów (zmiennych prostych i zanegowanych) taki, że odpowiadający mu zbiór wektorów binarnych nie zawiera wektora „zerowego” funkcji.
Prosty implikant jest to implikant, który zmniejszony o dowolny literał przestaje być implikantem.
Na przykład jest implikantem funkcji f, bo zbiór wektorów reprezentowanych przez ten implikant: 0111 oraz 0011 nie zawiera żadnego wektora (mintermu), dla którego wartość funkcji jest 0. Są to bowiem mintermy, które w naturalnym kodzie binarnym odpowiadają liczbom 7 i 12, i jak widać z zapisu funkcji f = S[0, 5, 6, 7, 10, (2, 3, 11, 12)], nie należną one do zbioru wektorów „zerowych” tej funkcji.
Pojęcie implikantu można zinterpretować na tablicy Karnaugha. W tablicy 2.16 zakreślono dwie pętelki. Mniejsza odpowiada implikantowi . Nie może to być implikant prosty, gdyż pętelkę tę można powiększyć. Większej pętelce odpowiada implikant prosty , w którym nie można już usunąć żadnego literału.
Tablica 2.16
Zminimalizować metodą Karnaugha następującą funkcję boolowską:
f = S[4,5,10,11,15,18,20,24,26,30,31, (9,12,14,16,19,21,25)]
Po zakreśleniu „pętelek” (tab. 2.17) uzyskujemy następujące wyrażenie boolowskie:
Tablica 2.17
W dotychczasowych przykładach minimalizowane były pojedyncze funkcje boolowskie, dla których – w celu uzyskania rozwiązania z minimalnym kosztem – tworzone były wyłącznie implikanty proste. W ogólnym przypadku minimalizacji zespołów funkcji boolowskich tworzenie minimalnego rozwiązania wyłącznie na podstawie implikantów prostych nie zawsze prowadzi do najlepszego rezultatu końcowego. Problem sygnalizuje przykład 2.8.
Należy zrealizować zespół trzech funkcji czterech argumentów:
f1= S(3,7,11,14,15)
f2 = S(3,7,12,13,14,15)
f3 = S(3,7,11,12,13,15)
Tablica 2.18
Jeśli każdą funkcję zminimalizujemy oddzielnie (tablice Karnaugha poszczególnych funkcji pokazane są w tabl. 2.18), to uzyskamy następujące wyrażenia:
których realizację pokazano na rys. 2.11. Do realizacji tych trzech funkcji potrzebujemy 9 bramek
Rys. 2.11. Realizacja funkcji z tablicy 2.18
Zauważmy jednak, że bramka AND dla f1 może być usunięta przez wykorzystanie bramki AND z f3 (rys. 2.12a). Natomiast bramkę AND z f2 można usunąć przez wykorzystanie faktu , co prowadzi do struktury zbudowanej zaledwie z 7 bramek (rys. 2.12b).
Rys. 2.12. Realizacja funkcji z tablicy 2.18: a) z uproszczoną funkcją f1; b) z uproszczonymi funkcjami f1 i f2
Przykład sugeruje, że w realizacji zespołu funkcji stosowanie minimalnej sumy implikantów prostych nie zawsze prowadzi do rozwiązania z minimalnym kosztem. Kolejny przykład ilustruje w jaki sposób należy dobierać implikanty zespołu funkcji, aby uzyskać rozwiązanie z minimalnym kosztem.
Należy zminimalizować zespół funkcji:
y1 = S(2,3,5,7,8,9,10,11,13,15)
y2 = S(2,3,5,6,7,10,11,14,15)
y3 = S(6,7,8,9,13,14,15)
W tablicach 2.19a, b, c podane są wykresy Karnaugha poszczególnych funkcji, odpowiednio: y1, y2, y3. Po zakreśleniu „pętelek” obejmujących implikanty proste uzyskujemy następujące wyrażenia boolowskie:
Realizacja tych wyrażeń wymaga zastosowania 7 bramek AND i 3 bramek OR.
Tablica 2.19
Znacznie lepszą realizację uzyskamy dokonując minimalizacji w sposób przedstawiony w tablicach 2.20a, b, c.
Tablica 2.20
Pętelki w tych tablicach zakreślamy tak, aby uzyskiwać implikanty wspólne dla co najmniej dwóch spośród trzech funkcji. Spełnienie tego warunku wymusza zakreślanie pętelek wokół grup kratek reprezentujących implikanty, które nie są implikantami prostymi. W rezultacie uzyskujemy następujące wyrażenia:
Realizacja powyższych wyrażeń łącznie, mimo pozornie większego skomplikowania dla poszczególnych funkcji, jest oszczędniejsza niż poprzednio; całość wymaga bowiem zastosowania 5 bramek AND i trzech bramek OR.