[Lazarus] Kalkulator wyrażeń logicznych
: wtorek 21 sty 2020, 01:30
Kalkulator wyrażeń logicznych
Domek z karthttps://www.youtube.com/watch?v=uBIqfYda4lU
W praktyce zabawy z układami logicznymi czasami zachodzi konieczność zbudowania kombinacyjnego układu logicznego, takiego na bramkach. Małe piwo jak realizuje on prostą funkcję kombinacyjną. Trochę gorzej przedstawia się, gdy ta funkcja logiczna staje się rozbudowana. Wyobraźmy sobie taki układ:I teraz rzecz najmniej przyjemna w tym wszystkim. Trzeba zweryfikować poprawność funkcji logicznej. Kto ma ochotę określić wynik funkcji „na piechotę”? Można do tego użyć jakiegoś programu do obróbki cyfrówki, przykładowo program do obróbki układów PLD i sprawdzić (poprzez symulację) generowane wyniki funkcji. Pomijając samą kwestię opisu układu (można go wysmarować w VHLD'u lub narysować), sprowadza się to do ustalenia na wejściach stanów logicznych i (poprzez symulację) uzyskać wynik funkcji logicznej.
Można zrobić inaczej, podążyć moją drogą. Otóż napisałem sobie odpowiedni program do obróbki funkcji logicznych. Łączy on w sumie kilka wątków: algorytmów rekurencyjnych i zagadnień klasy budowy kompilatorów.
Powyższy układ można „podzielić” na mniejsze kawałki i uzyskać następujące równania logiczne.Mamy:

Treść tego równania można wkleić do odpowiedniego okienka i ustalić stany logiczne na użytych wejściach. Przez Przed wyrachowaniem wyniku, dokonywana jest analiza wyrażenia. Okazuje się, że nie zgubiłem nawiasów (wszystkie nawiasy mają swoją parę, analizator wyrażenia sprawdza dokładnie postać zapisu i nie da sobie wcisnąć „ciemnoty”).Klik na przycisk „Oblicz” i mamy wynik:Można poprzestawiać stany na wejściach i ponowne „Oblicz” da wynik funkcji logicznej.
Jak skonstruowany jest program? Ma wbudowany analizator wyrażenia logicznego (dowolnie skomplikowanego) i je obrabia. Dokładnie tak samo robią to kompilatory, z tym, że w tym przypadku nie jest generowany kod programu (choć to nie jest żaden problem) a zachodzi interpretacja wyrażenia. Interpretacja → czyli program wykonuje nakazane z zapisu wyrażenia logicznego obliczenia i uzyskuje wynik. Całość sprowadza się do dwóch chwytów: notacji BNF (przydatnej w trakcie analizy wyrażenia) oraz notacji Łukasiewicza (zwanej inaczej notacją odwrotna polską, przydatną do rachowania lub generowania kodu dla procka). Ale o tym to już w następnej części.
Domek z karthttps://www.youtube.com/watch?v=uBIqfYda4lU
W praktyce zabawy z układami logicznymi czasami zachodzi konieczność zbudowania kombinacyjnego układu logicznego, takiego na bramkach. Małe piwo jak realizuje on prostą funkcję kombinacyjną. Trochę gorzej przedstawia się, gdy ta funkcja logiczna staje się rozbudowana. Wyobraźmy sobie taki układ:I teraz rzecz najmniej przyjemna w tym wszystkim. Trzeba zweryfikować poprawność funkcji logicznej. Kto ma ochotę określić wynik funkcji „na piechotę”? Można do tego użyć jakiegoś programu do obróbki cyfrówki, przykładowo program do obróbki układów PLD i sprawdzić (poprzez symulację) generowane wyniki funkcji. Pomijając samą kwestię opisu układu (można go wysmarować w VHLD'u lub narysować), sprowadza się to do ustalenia na wejściach stanów logicznych i (poprzez symulację) uzyskać wynik funkcji logicznej.
Można zrobić inaczej, podążyć moją drogą. Otóż napisałem sobie odpowiedni program do obróbki funkcji logicznych. Łączy on w sumie kilka wątków: algorytmów rekurencyjnych i zagadnień klasy budowy kompilatorów.
Powyższy układ można „podzielić” na mniejsze kawałki i uzyskać następujące równania logiczne.Mamy:
- NOT ( A AND B AND C)
- NOT D
- E AND F
- NOT H
- G AND I AND J
- NOT (K OR L)
- cos1 = NOT ( ( NOT ( A AND B AND C)) OR (NOT D) OR (E AND F))
- cos2 = NOT ( (NOT H) AND (G AND I AND J))
- cos1 XOR cos2 = (NOT ( ( NOT ( A AND B AND C)) OR (NOT D) OR (E AND F))) XOR (NOT ( (NOT H) AND (G AND I AND J)))
- NOT ( ((NOT ( ( NOT ( A AND B AND C)) OR (NOT D) OR (E AND F))) XOR (NOT ( (NOT H) AND (G AND I AND J)))) AND (NOT (K OR L)))
Treść tego równania można wkleić do odpowiedniego okienka i ustalić stany logiczne na użytych wejściach. Przez Przed wyrachowaniem wyniku, dokonywana jest analiza wyrażenia. Okazuje się, że nie zgubiłem nawiasów (wszystkie nawiasy mają swoją parę, analizator wyrażenia sprawdza dokładnie postać zapisu i nie da sobie wcisnąć „ciemnoty”).Klik na przycisk „Oblicz” i mamy wynik:Można poprzestawiać stany na wejściach i ponowne „Oblicz” da wynik funkcji logicznej.
Jak skonstruowany jest program? Ma wbudowany analizator wyrażenia logicznego (dowolnie skomplikowanego) i je obrabia. Dokładnie tak samo robią to kompilatory, z tym, że w tym przypadku nie jest generowany kod programu (choć to nie jest żaden problem) a zachodzi interpretacja wyrażenia. Interpretacja → czyli program wykonuje nakazane z zapisu wyrażenia logicznego obliczenia i uzyskuje wynik. Całość sprowadza się do dwóch chwytów: notacji BNF (przydatnej w trakcie analizy wyrażenia) oraz notacji Łukasiewicza (zwanej inaczej notacją odwrotna polską, przydatną do rachowania lub generowania kodu dla procka). Ale o tym to już w następnej części.