logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Implementacja dowolnej(?) funkcji logicznej tylko z pomocą multipleksera 8:1

ghost666 21 Lis 2019 15:28 3087 14
  • Możliwe jest użycie multipleksera 8: 1 do zaimplementowania dowolnej funkcji logicznej z 3 wejściami, ale czy możemy go użyć do implementacji funkcji 4-wejściowej? To bardzo ciekawe pytanie, szczególnie ze strony tego, jak uczymy się układów logicznych. Opisany powyżej wywód, zaczął się na forach EEWeb i związany był z jednym z artykułów dotyczących tablic Karnaugh i obliczania tabel prawdy i generacji układów logicznych.

    Cały przebieg dyskusji nie jest ważny. To, co istotne, to zaprezentowana poniżej tabela prawdy dla układu logicznego.

    ABCQ
    0000
    0010
    0101
    0111
    1001
    1010
    1101
    1110


    Z tej tabeli, korzystając z minimalizacji tabelą Karnaugha, wygenerować możemy minimalne równanie Boolowskie, a z niego skonstruować układ logiczny, taki jak pokazany na poniższym schemacie.

    Implementacja dowolnej(?) funkcji logicznej tylko z pomocą multipleksera 8:1


    Wydawałoby się, że tutaj dochodzimy już do końca zagadnienia. Nic błędnego, jeden z uczestników dyskusji wysłał wiadomość do autora artykułu:

    Cytat:
    Cześć Max, podobał mi się twój artykuł o bramkach logicznych. Dołączone do wiadomości jest jednochipowe rozwiązanie problemu zbiornika do trawienia PCB (powyższa tabela prawdy - przyp.red.). Będzie działać dla każdej kombinacji logicznej trzech wejść i łatwo będzie przejść od tabeli prawdy do schematu. Wykorzystuje układ CD4512, który ma trzy wejścia: A, B i C, które wybierają jedno z ośmiu wejść danych (D0 do D7) i przedstawiają stan wybranego wejścia na wyjściu Q. Wszystko, co musisz zrobić, to podłączyć osiem wejść do GND (masy ) lub VDD (zasilania), aby dopasować pozycję zer i jedynek, na wyjścia Q do tabeli prawdy.


    Tej wiadomości towarzyszył schemat pokazany poniżej. Autor poniższego rozwiązania niech pozostanie anonimowy, ponieważ popełnił pewien drobny błąd. Omówmy poniższy układ. Spójrzmy najpierw na zaproponowany schemat:

    Implementacja dowolnej(?) funkcji logicznej tylko z pomocą multipleksera 8:1


    Pamiętajmy, że jest to niepoprawny schemat (poprawiony układ znajdziemy niżej w artykule).

    Spójrzmy teraz na proponowany układ - multiplekser CD4512. W karcie katalogowej tego elementu znaleźć możemy jego tabelę prawdy. Znajduje się ona poniżej. Zmieniono odrobinę tylko nazwy pinów, aby pasowały do tych na schemacie powyżej.

    ABCINH/OEQ
    00000D0
    00100D1
    01000D2
    01100D3
    10000D4
    10100D5
    11000D6
    11100D7
    XXX000
    XXXX1Z


    Mówi nam to, że CD4512 jest multiplekserem 8:1. Trzy wejścia wyboru: A, B i C są używane do wyboru jednego z ośmiu wejść danych od D0 do D7. Jakakolwiek wartość logiczna obecna była na wybranym wejściu, będzie ona przenoszona na wyjście Q. Widzimy również, że istnieją dwa dodatkowe piny sterujące. Jedyna na wejściu INH („inhibit”) wymusi wyjście równe zero. Tymczasem jedyna na /OE („włączenie wyjścia”) wyłączy wyjście układu i spowoduje jego wejście w stan wysokiej impedancji (Z).

    Jeśli na razie zignorujemy sygnały INH i /OE, to możemy przedstawić funkcjonalność pozostałej części układu jako kaskadę multiplekserów 2:1, jak pokazano na poniższym schemacie:

    Implementacja dowolnej(?) funkcji logicznej tylko z pomocą multipleksera 8:1


    Poświęćmy chwilę, aby powrócić do implementacji przesłanej powyżej. To, co zostało w niej zrobione, to podłączenie wejść D0 do D7 do wartości 0 i 1, odpowiadających wartości Q z naszej oryginalnej tabeli prawdy, jak pokazano poniżej:

    Implementacja dowolnej(?) funkcji logicznej tylko z pomocą multipleksera 8:1


    To bardzo praktyczne i łatwe do zrozumienia rozwiązanie. Zasadniczo możemy użyć naszego multipleksera 8:1, aby zaimplementować dowolną 3-wejściową funkcję logiczną. Wszystko, co musimy zrobić, to podłączyć wejścia D0 do D7 do 0 i 1, które chcemy wyświetlić na wyjściu Q, jak pokazano w żądanej tabeli prawdy. Jedynym problemem, jak już wspomniałem wcześniej, jest to, że autor wiadomości popełnił mały błąd w swojej implementacji. Zanim przejdziemy dalej, warto poświęcić chwilę na zastanowienie się nad tym, na co zwracaliśmy uwagę do tej pory, aby sprawdzić, czy można dostrzec problem.

    Pomocne może być porównanie naszej żądanej tabeli prawdy z naszego problemu do tabeli prawdy z karty katalogowej CD4512, jak pokazano poniżej:

    Oryginalna tabelkaTabelka dla układu CD4512
    ABCQCBAINH/OEQ
    000000000D0
    001000100D1
    010101000D2
    011101100D3
    100110000D4
    101010100D5
    110111000D6
    111011100D7
    XXX000
    XXXX1Z


    gdzie Z to stan wysokiej impedancji, a X to dowolny stan.

    Teraz błąd powinien być oczywisty i dobrze widoczny. W przypadku naszej oryginalnej tabeli zorganizowaliśmy wartości odpowiadające wejściom A, B i C jako standardową liczbę binarną, przy czym A reprezentuje najbardziej znaczący bit (MSB), a C reprezentuje najmniej znaczący bit ( LSB). Dla porównania, w przypadku tabeli prawdy CD4512, wejście A reprezentuje LSB wartości adresu podawanego do multipleksera.

    Istnieją dwa sposoby rozwiązania tego problemu. Pierwszym z nich jest zamiana sposobu, w jaki sygnały A, B i C naszego obwodu są podłączone do wejść A, B i C scalonego multipleksera. Innymi słowy, obecnie mamy sygnały obwodów A, B i C połączone odpowiednio z wejściami A, B i C układu. To, co musimy zrobić, to podłączyć sygnały A, B i C naszego obwodu odpowiednio do wejść C, B i A multipleksera, jak pokazano poniżej na poprawionym schemacie:

    Implementacja dowolnej(?) funkcji logicznej tylko z pomocą multipleksera 8:1


    Jest to całkiem prosta poprawka. Teraz zająć możemy się kolejną sprawą. Użytkownik forum, który postawił pierwszy problem, opublikował kolejny. Nie omówimy go szczegółowo w tym poście. Widzimy poniżej tabelę prawdy dla tego problemu oraz minimalny schemat reprezentujący równanie Boola wygenerowane dla tej tabeli.

    ABCD/A/ABCA+D/A+DQ
    000010010
    000110100
    001010010
    001110100
    010010010
    010110100
    011011011
    011111100
    100000100
    100100100
    101000100
    101100100
    110000100
    110100100
    111000100
    111100100


    Implementacja dowolnej(?) funkcji logicznej tylko z pomocą multipleksera 8:1


    Wcześniej zauważyliśmy, że możemy użyć multipleksera CD4512 (8:1) do realizacji dowolnej 3-wejściowej funkcji logicznej. W tym przypadku mamy jednak funkcję z czterema wejściami. Czy jest jakiś sposób, aby użyć CD4512 do realizacji powyższej funkcji? Zapraszam Forumowiczów do rozwiązania tej zagadki.

    Źródło: https://www.eeweb.com/profile/max-maxfield/articles/using-81-multiplexers-to-implement-logical-functions
    O autorze
    ghost666
    Tłumacz Redaktor
    Offline 
    Fizyk z wykształcenia. Po zrobieniu doktoratu i dwóch latach pracy na uczelni, przeszedł do sektora prywatnego, gdzie zajmuje się projektowaniem urządzeń elektronicznych i programowaniem. Od 2003 roku na forum Elektroda.pl, od 2008 roku członek zespołu redakcyjnego.
    https://twitter.com/Moonstreet_Labs
    ghost666 napisał 11960 postów o ocenie 10197, pomógł 157 razy. Mieszka w mieście Warszawa. Jest z nami od 2003 roku.
  • #2 18292383
    Janusz_kk
    Poziom 38  
    Ja tu widzę dwa razy powielony ten sam błąd, w tabeli prawdy cd4512 dla wejść xxx inibit=0
    podaje na wyjściu 0, są to przedostatnie wiersze, powinno być dla inhibit=1.
    Drugi problem, są 16 wejściowe mutiplexery, co prawda ttl ale są.
  • #3 18292428
    Konto nie istnieje
    Poziom 1  
  • #5 18292557
    Konto nie istnieje
    Poziom 1  
  • #6 18292631
    Konto nie istnieje
    Poziom 1  
  • #7 18293974
    dr.hannibal
    Poziom 22  
    ghost666 napisał:
    la porównania, w przypadku tabeli prawdy CD4512, wejście A reprezentuje LSB wartości adresu podawanego do multipleksera.

    Tylko że w "Tabelka dla układu CD4512" jest akurat nadal błędnie wpisane A jako MSB i C jako LSB.
  • #8 18295605
    krisRaba
    Poziom 31  
    dr.hannibal napisał:
    Tylko że w "Tabelka dla układu CD4512" jest akurat nadal błędnie wpisane A jako MSB i C jako LSB.

    Też gapiłem się na tabelkę zastanawiając się o co chodzi, bo przecież "Oryginalna tabelka" ma A/B/C identyczne jak te w "Tabelka dla układu CD4512" ;) Dopiero wchodząc w datasheet zauważyłem różnicę i liczenie binarne z A jako LSB...
    Natomiast czy to jest wielki problem czy błąd? Przecież wiersze można przetasować i po prostu podpiąć D0-D7 do właściwych potencjałów, by wynikowo na Q pojawiło się to, co ma się pojawić :)
    Co innego, gdyby D0-D7 miały jakieś stany na sztywno zaszyte w scalaku ;) A tak to korygujesz na...

    Oryginalna tabelkaTabelka dla układu CD4512
    ABCQABCINH/OEQ
    000000000D0
    001000100D4
    010101000D2
    011101100D6
    100110000D1
    101010100D5
    110111000D3
    111011100D7
    XXX000
    XXXX1Z


    i możesz zostawić A/B/C tam gdzie były. Co za różnica do jakiego potencjału podpięte będzie D0-D7, ważne, żeby truth-table się zgadzała :)

    Swoją drogą analogiczny trik można stosować np. prowadząc ścieżki adresowe w RAM (przy magistrali równoległej), jeśli jakoś głupio się krzyżują na PCB. Przecież nie jest dla nas ważne gdzie fizycznie będzie przechowywana dana, więc czy zamienimy A0 z A3, czy A6 z A13, to pula dostępnych adresów będzie taka sama i jak wpisujesz czy odczytujesz dane, to z konkretnego zrozumiałego dla MCU adresu, a gdzie on będzie fizycznie w RAM? Who cares? ;) Trzeba oczywiście się przyjrzeć, czy nie będzie jakiegoś problemu z bankami pamięci czy operacjami na half-word, ale zwykle jest to tak rozwiązane, że wszystko jest OK nawet po zmiksowaniu pinów adresowych ;)
  • #9 18296023
    Konto nie istnieje
    Poziom 1  
  • #10 18297098
    krisRaba
    Poziom 31  
    Rozwiń proszę swoją myśl, bo nie wiem o co Ci chodzi.

    Odniosłem się do konkretnego stwierdzenia, że sygnały A B C są w truth table liczone / adresowane w inny sposób niż w multiplekserze, więc żeby skorygować ten błąd trzeba zamienić miejscami A i C. Dałem inną propozycję wraz z objaśnieniem dlaczego tak można zrobić... Czego kolega nie zrozumiał?
    Masz np. w tabeli A=1, B=0, C=0 i powinieneś na wyjściu dostać Q=1. Patrzysz, że dla takich A B C w mux wystawisz D1, to podpinasz go do VCC i masz spełniony warunek. Kogo obchodzi, że w truth table ABC binarnie tworzy 4, a w mux z racji odwrócenia MSB/LSB to 1 (stąd D1)? Jak poustawiasz stany D0-D7 odpowiednio do truth table, zgodnie ze skorygowaną przeze mnie kolejnością, to wszystko będzie się zgadzać bez odwracania MSB/LSB
  • #11 18297776
    Konto nie istnieje
    Poziom 1  
  • #12 18297825
    krisRaba
    Poziom 31  
    Nie brałem udziału w zagadce :-P Operuję na ABC, a nie ABCD, bo odnoszę się do pierwszego przykładu. Nie wiem czemu tego nie rozumiesz. Odniosłem się tylko do kwestii adresacji. Aż mi się przypominają jałowe dyskusje z kol. R-MIK :-P
    Generalnie D0-D7 ustawiasz tak, by zgadzało się truth table, a ono będzie różne zależnie od tego jaki układ logiczny chcesz zrobić. Czasem będzie to ustawione na stałe 0 lub 1, a czasem zawinięty sygnał z innego wyjścia. W to już nie wnikam, bo komentowałem co innego ;-)
  • #13 18298185
    Konto nie istnieje
    Poziom 1  
  • #14 18298552
    krisRaba
    Poziom 31  
    spec220 napisał:

    Temat autora w podsumowaniu odnosi się do zagadki. Źle kolegę zrozumiałem. Nie mogłem się dopatrzeć sensu próby rozwiązania przez kolegę owej zagadki.

    To w sumie ciekawe, bo patrząc na post #8 był tam wstęp w postaci cytatu, nawiązanie i dopiero potem podana propozycja alternatywnego rozwiązania "błędu" ;-)
    Dalsza dygresja była z rozpędu, bo opiera się na tym samym "pomieszaniu" linii adresowych. Może komuś się przyda jak na to wpadnie tutaj, a kiedyś przyjdzie mu walczyć z takim zagadnieniem. Sam kiedyś głowiłem się nad tym, bo pinout MCU nie chciał za nic pokryć się z pinoutem pamięci SRAM i jak ktoś mi później rzucił tą informacją, to stwierdziłem, że to genialne, lecz nieoczywiste przy schematycznym patrzeniu ;-)

    Swoją drogą ja lubię śledzić tego typu tematy, bo trochę rozszerza to horyzonty, ktoś dorzuci jakiś ciekawy trop itp. Pewnie bym nie szukał możliwości zastąpienia szeregu bramek muxem by zrealizować to w ten sposób. Podobnie jak logika użyta w temacie o płynącym kierunkowskazie, gdzie zrobiono to na rejestrze przesuwnym i zawijaniu na wejście sygnału z dalszego wyjścia. Itp itd.
    Potem to się obija gdzieś w głowie i jak dostajesz temat, to masz więcej pomysłów, bo łączysz trochę tego, trochę tamtego ;-) Ja działam bardziej na MCU, ale i tam da się poszyć ze sobą rzeczy, których autor pewnie nie planował do takiej pracy ;-) A jak jesteś pomysłowy i skuteczny w rozwiązywaniu problemów, to cebuliony lecą ;-)
  • #15 18298583
    Konto nie istnieje
    Poziom 1  
REKLAMA