Elektroda.pl
Elektroda.pl
X
PCBway
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

ghost666 21 Lis 2019 15:28 1683 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

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
    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.
    ghost666 napisał 9436 postów o ocenie 7364, pomógł 157 razy. Mieszka w mieście Warszawa. Jest z nami od 2003 roku.
  • PCBway
  • #2
    Janusz_kk
    Poziom 24  
    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ą.
  • PCBway
  • #5
    spec220
    Poziom 13  
    ghost666 napisał:
    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.

    Ok. czyli 4512 trzeba tak skonfigurować aby obsługiwał czwartą zmienną binarną "D" (?) gdzie bramka Q przyjemnie stan wysoki (+V) tylko w jednym przypadku (?) A=0, B=1
    C=1, D=0 Q=1 (?)

    O ile dobrze zrozumiałem problem, to należy wykorzystać wejście D6 dla realizacji funkcji zmiennej B+C oraz wejście INH do realizacji funkcji zmiennej D.
  • #6
    drobok
    Poziom 31  
    ABD na adresowe a C na wejście odpowiadające adresowy z ABD, reszta do 0.
    A jak wejścia można zewrzeć to wystarczy dać AD na adresowe a zwarte BC na adres 00 i wystarczą 2bity adresu.
  • #7
    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
    krisRaba
    Poziom 28  
    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
    spec220
    Poziom 13  
    krisRaba napisał:
    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

    A czytał kolega tytuł tematu ? (pomijając błędy w tabeli prawdy)
  • #10
    krisRaba
    Poziom 28  
    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
    spec220
    Poziom 13  
    krisRaba napisał:
    Czego kolega nie zrozumiał

    W tej tabeli którą przedstawiono bramka Q ma być pobudzona tylko w jednym przypadku, jest to wartość 6 dla CD4512, pozostałe wartości to 0, albo stałe 0 dla wartości z poza zakresu samego CD4512 dla czterech binarnych wartości wejściowych A,B,C,D, gdzie D jest robiona na doczepkę po przez wejście INH.
    Zaś kolegi tabela operuje tylko B i C w zakresie 1/2 bajta, a co z warunkami dla drugiej połowy bajtu (?)
  • #12
    krisRaba
    Poziom 28  
    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
    spec220
    Poziom 13  
    krisRaba napisał:
    Nie brałem udziału w zagadce

    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 co przedstawiono w tym artykule to nic innego jak dekoder logiczny stanów WE względem WY. Gadka szmatka o jakiś danych adresowych rodem z dziedziny mikroprocesorowej jest trochę nad wyrost przesadzona, aczkolwiek nie twierdzę iż nie jest fachowa. :wink:

    R-MIK (?) gdzieś mi się obiło o uszy, ale chyba nie na tym forum.
  • #14
    krisRaba
    Poziom 28  
    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
    drobok
    Poziom 31  
    Równie dobrze zamiast mux'a do realizacji funkcji można użyć pamięci rom, układu pal etc. PUC się kłania ;)