Článek ve formátu PDF je možné stáhnout
zde.
Od zadání k realizaci
Každé položce pravdivostní tabulky lze přiřadit součinový člen – minterm. Jsou v něm zastoupeny všechny operandy tak, že pro jedničkové hodnoty operandu bude v součinu zastoupena nezměněná proměnná a pro nulové hodnoty bude negovaná (obr. 2, obr. 3 v minulé části). Každý minterm vynásobíme (AND) odpovídající pravdivostní hodnotou funkce a sečteme (OR). Tak vznikne logický výraz pro zadanou funkci – obvykle se nazývá úplná disjunktní norma (ÚDN). Popsaný postup vyplývá ze Shannonova rozkladu (expanzního teorému) – prvního vztahu z 11. pravidla Booleovy algebry. Mintermy násobené nulou budou nulové, takže logický výraz bude obsahovat jen mintermy, které odpovídají jedničkovým hodnotám funkce. Postup lze názorně interpretovat i v K-mapě. Poloha každého políčka je „lokalizována“ svým mintermem – jeho operandy je možné považovat za „souřadnice políčka“. Z pohledu teorie množin je to průnik ploch všech operandů s odpovídající pravdivostní hodnotou. Plocha mapy pokrytá jedničkovými políčky je jejich sjednocením – odpovídá logickému součtu OR.
Například funkce ekvivalence (shody) pro dvě proměnné je zobrazena pravdivostní tabulkou na obr. 2 a mapou na obr. 12a (oba obrázky najdete v minulé části tohoto dílu). Je pravdivá, jestliže oba její operandy mají shodnou hodnotu – oba jsou nulové nebo jedničkové. Uplatňuje se např. v situacích, kdy je třeba kontrolovat shodu proměnných nebo neměnnost stavu. Odpovídá ji logický výraz:
eq = (a AND b) OR (NOT a AND NOT b)
Závorky zde nejsou nutné, jsou uvedeny jen pro přehlednost. Výraz je již detailním podkladem pro realizaci funkce. Pro řešení programem v jazyce ST stačí rovnítko nahradit symbolem přiřazení := („pascalským rovnítkem“), zakončit středníkem a získáme příkaz k realizaci:
eq := (a AND b) OR (NOT a AND NOT b) ;
Pro řešení programu v grafických jazycích LD, CFC, popř. FBD, zbývá jen výraz převést na schéma zapojení s kontakty nebo s využitím nabídky funkcí ze standardní knihovny funkcí a funkčních bloků STDLIB, doporučených normou IEC 61131-3
a zabudovaných ve vývojovém systému Mosaic. Příklady jsou uvedeny na obr. 12 v předchozím dílu seriálu (v čísle 10 na str. 15). Při řešení pevnou logikou je třeba nejprve zvolit sortiment logických členů (hradel), které budou používány, přizpůsobit jim logické výrazy, vytvořit logické schéma a podle něj potom vyřešit fyzickou realizaci – navrhnout a vytvořit plošný spoj, osadit součástkami a otestovat bezchybnou funkci. Při řešení zákaznicky programovatelnými obvody je zapotřebí logické schéma přizpůsobit možnostem obvodu, naprogramovat, otestovat a pak jím osadit plošný spoj výsledného zařízení.
Minimálně o minimalizaci
Podobně lze postupovat u libovolných logických funkcí. Například funkce majorita ze tří (M3) je pravdivá, jestliže většina operandů nabývá jedničkovou hodnotu (alespoň dva operandy jsou jedničkové – tedy dva nebo tři). Je zobrazena pravdivostní tabulkou na obr. 2b a mapou na obr. 6. Z nich lze přímo získat logický výraz ve tvaru úplné disjunktní normy, který obsahuje čtyři trojmístné mintermy. S použitím pravidel Booleovy algebry je možné výraz zjednodušit na podstatně přehlednější a pochopitelnější tvar (zapsaný jako řádek programu):
M3 := (a AND b) OR (a AND c) OR (b AND c) ;
Závorky opět nejsou nutné. Výraz je dostatečným podkladem pro řešení pevnou logikou i programem PLC. Vytknutím před závorku vznikne kód:
M3 := a AND (b OR c) OR (b AND c) ;
Stejný výsledek (minimalizovaný výraz) je možné získat přímo z K-mapy (obr. 16). Obrazec pokrytí mapy lze rozložit na tři části – proužky dvou sousedních políček. Každému odpovídá jeden dvojmístný součinový člen: a AND b, a AND c, b AND c. Jejich množinovým sjednocením se získá obrazec pokrytí zadané funkce. Tomu odpovídá logický součet OR, takže opět vznikne upravený (minimalizovaný) výraz. Postup lze interpretovat jako postupné úpravy s použitím pravidel Booleovy algebry. Sloučením dvou sousedních políček je vždy vyloučena jedna proměnná, např.
(a AND b AND c) OR (a AND b AND NOT c) = (a AND b) AND (c OR NOT c) = (a AND b) AND 1 = (a AND b)
Podaří-li se sloučit čtyři sousední políčka do pásu nebo čtverce, vyloučí se dvě proměnné, při sloučení osmi sousedních políček jsou vyloučeny tři proměnné. Na obr. 15 je ukázán obdobný postup minimalizace funkce alespoň dva ze čtyř.
Úloha 3
Vypište výraz ve tvaru úplné disjunktní normy pro M3 a podle něj vytvořte program PLC v jazycích ST, LD a CFC. Obdobně vytvořte programy podle dvou upravených výrazů. Porovnejte jejich složitost a přehlednost.
Úloha 4
Z K-mapy na obr. 9 nejprve vytvořte logický výraz ve tvaru úplné disjunktní formy a pak jej postupně zjednodušujte. Která známá funkce bude výsledkem?
Úloha 5
Vytvořte K-mapu pro funkci NAND (negaci AND) pro dvě, tři a čtyři proměnné a z ní minimalizovaný logický výraz. Které pravidlo Booleovy algebry jste tím ověřili?
(pokračování příště)
Ing. Ladislav Šmejkal, CSc., Teco, a. s., a externí redaktor Automa
Obr. 15. K-mapy funkce alespoň dva ze čtyř a jejich šesti složek
Obr. 16. K-mapy funkce majorita ze tří a jejich tří složek
Booleova logika
1. komutativní zákon
a + b = b + a
a·b = b·a
2. distributivní zákon
(a + b)·c = a·c + b·c
a·b + c = (a + c) ·(b + c)
3. vyloučení třetího
a + non a = 1
a·non a = 0
4. neutrálnost konstant (tautologie)
a + 0 = a
a·1 = a
5. agresivnost konstant
a + 1 = 1
a·0 = 0
6. idempotence
a + a = a
a·a = a
7. asociativní zákon
(a + b) + c = a + (b + c)
(a·b)·c = a·(b·c)
8. dvojitá negace (involuce)
non (non a) = a
9. absorpce
a + a·b = a
a·(a + b) = a
a + (non a)·b = a + b
a·((non a) + b) = a·b
10. De Morganovy zákony
non (a + b) = (non a)·(non b)
non (a·b) = (non a) + (non b)
non ((non a) + (non b)) = a·b
non ((non a)·(non b)) = a + b
11. Shannonův rozklad (expanzní teorém)
f(x1, x2, ... xn) = x1·f(1, x2, ... xn) + non(x1)·f(0, x2, ... xn)
f(x1, x2, ... xn) = (x1 + f(0, x2, ... xn))·(non(x1) +
+ f(1, x2, ... xn))
12. zobecněný De Morganův zákon
non (f(x1, x2, ... xn, 0, 1, +, ·)) = f(x1, x2, ... xn, 0, 1, · +)
13. zobecněné zákony absorpce
x1 + f(x1, x2, ... xn) = x1 + f(0, x2, ... xn)
non x1 + f(x1, x2, ... xn) = non x1 + f(1, x2, ... xn)
x1·f(x1, x2, ... xn) = x1·f(1, x2, ... xn)
non x1·f(x1, x2, ... xn) = non x1·f(0, x2, ... xn)