Historia


       W Magazynie SERIOUS opisywałem sposób minimalizacji funkcji logicznych za pomocą tablic Karnaugha (Kano). Mam zamiar opisać projektowanie układów sekwencyjnych. (Ale kiedy!?) Temat baaaardzo trudny. Już ten, o minimalizacji był nie do zniesienia, co dopiero teraz. Właściwy opis zamieszczony zostanie w SERIOUS #XXxx, a tu, rozgrzewka.

       Na początek:

Cała "cyfrówka" dzieli się właściwie na dwie części:

  1. układy kombinacyjne
  2. układy sekwencyjne

       Układ kombinacyjny to taki, w którym sygnały na wejściu bezpośrednio oddzia łują na jego wyjście w momencie gdy si pojawią na wejściu. Łapiecie?

       Więc jeżeli na wejściu np. bramki AND pojawi się sygnał, to wliczając w to opóźnienia wnoszone przez samą bramkę, sygnał ten oddziałuje na wyjście i tam natychmiast, już się pojawia. A układ sekwencyjny to taki w którym sygnał pojawia się na wejściu, ale na wyjście będzie oddziaływał w momencie pojawienia się najbliższego sygnału zegarowego. (Zbocza, poziomu) Nie jest ważne jak kształtuje się w czasie, ważne jest CO dochodzi do wejścia zegarowego danego układu. Więc np. sygnałem zegarowym może być sygnał generatora "zmodernizowany" ja kimś innym sygnałem cyfrowym, ale dla samego układu wykonawczego jest nim ten, który wchodzi na jego wejście zegarowe.

       Z tych prostych definicji wynika, że obydwa rodzaje układów różnią się w zasadzie reakcją na sygnał wejściowy. W jednym jest ona natychmiastowa, w drugim, "za chwilę", aż pojawi się najbliższy sygnał zegarowy, czy jak kto woli taktujący.

       Jednak w układach sekwencyjnych sprawa nie jest tak prosta jakby się wydawało. Zazwyczaj, choć nie musi tak być układy sekwencynje mają swoją historię.

I na tym zagadnieniu chcę skupić Waszą uwagę.

Cóż to jest ta historia.

Weźmy pod lupę licznik pracujący w naturalnym kodzie dwójkowym zliczający do czterech.

Kto choć trochę orientuje się w układach elektronicznych wie, że taki licznik MUSI składać się z co najmniej dwu przerzutników. A przerzutnik, to najprostszy jednostkowy element układów sekwencyjnych. (Dla układów kombinacyjnych, będzie nim bramka). Dwa przerzutniki, to cztery stany na wyjściu. No bo każdy z nich może przyjąć jedną z dwu wartości (0,1).

Znany ciąg mówi wszystko.

ABwyjścia
00
01
10
11
00i kombinacje zaczynają się
..powtarzać

       ... Powstaje problem.
Jeżeli w takim liczniku nie ma resetu, to w momencie włączenia zasilania, na jego wyjściach pojawić się może dowol na kombinacja i licznik od niej zaczyna zliczać kolejne impulsy podawane na jego wejście zegarowe. Po dwu kolejnych impulsach w zasadzie nie wiadomo jaki stan licznik przyjmie Nie można określić jego ustawienia, bo nie wiadomo, co było przedtem. No i to jest -historia- o której tu chcę "potruć".

       Tak więc układ sekwencyjny ma historię inaczej mówiąc, stan następny takiego układu ustali się w/g stanu jego wejść po nadejściu najbliższego impulsu zegarowego. Ale nie tylko. Zależy od tego co było przedtem, od historii. Bo to jest oczywiste.

       Jeżeli stanem aktualnym licznika jest stan 01, to następnym może być tylko 10, bo o tym stanowi jego historia i logika jego połączeń elektronicznych.

       Zrozumienie tego zagadnienia pozwala projektować układy sekwencyjne które pracują w/g założeń, bo nie zawsze to co się chce, można kupić.

       Załóżmy zatem, że przykładowy licznik ma układ reset i w momencie włączenia zasilania został wyzerowany. Po nadejściu kolejnych dwóch impulsów zegarowych jesteśmy w stanie określić stan wyjść licznika. Właśnie na podstawie jego historii. Wiadomo, że przed pojawieniem się tych dwu impulsów zegarowych licznik był w stanie 00, bo to efekt działania układu reset. Po pierwszym impulsie licznik MUSIAŁ przyjąć stan 01, a po drugim 10. Nie jest możliwe, by po dwóch impulsach zegarowych licznik przyjął stan 11 (chyba że jest "walnięty"). Nie pozwala na to jego historia, która jednoznacznie określa co MUSI się pojawić na wyjściu gdy wcześniej było to i to.

       Zatem, w prawidłowym analizowaniu i projektowaniu układów sekwencyjnych należy brać pod uwagę stan wejść i historię układu. I na tej podstawie można określić jakie stany pojawią się na wyjściu po nadejściu najbliższego impulsu zegarowego. W tak prostym układzie jaki tu pokrótce opisałem w zasadzie nie ma problemu z zaprojektowaniem układu, czy zrozumieniem jego zasady działania. Spróbujmy zatem zaprojektować przynajmniej w pamięci układ sekwencyjny na kórego wyjściach pojawią się następujące stany.

       (Układ ma trzy wyjścia: A B C)

takt A B C
1 0 1 1
2 0 1 1
3 0 0 0
4 0 0 0
5 1 0 0
6 1 1 0

       Jak widać, nijak nie przystaje to do naturalnego kodu dwójkowego, czy BCD, albo innego. Ot, taka właśnie kombinacja ma się pojawiać na wyjściach w kolejnych taktach zegarowych. Nie będziemy sobie zawracać głowy stanem reset, bo nie o to chodzi.

       Przyjmujemy że układ tak ma pracować i już. Ostatecznie to tylko rozważania teoretyczne.

Więc, w takcie <1> na wyjściach ma się pojawić kombinacja 011. No i niech się pojawi. By to było możliwe, na wejściach układu muszą pojawić się jakieś sygnały, bo w/g nich układ odpowiednio wygeneruje stan wyjściowy.

W takcie <2> będzie tak samo, bo na wyjściu ma się pojawić ta sama kombinacja, czyli 011.

Ale już w takcie <3> jest inaczej. Stanem wyjściowym jest 000. Aby układ właśnie tak zareagował na trzeci impuls zegarowy, na jego wejścia musi zostać podana odpowiednia kombinacja sygnałów wejściowych.

       Jakich?

No właśnie, jakich?

To proste, 000.

       Ale przed chwilą, na te same wejścia podana została kombinacja 011, bo tego wymaga stan wyjść który został założony. Jak łatwo zauważyć, wystarczy tylko zmienić stan dwu wejść by ze stanu: 011 otrzymać stan 000.

Kto to ma zrobić. Układ jest automatem więc musi się to zrealizować automatycznie. Tu pomocne są układy kombinacyjne, bo na wejściu układu sekwencyjnego należy wymuszać odpowiednie stany wejściowe.

A jak wiadomo maszyna nie ma rozumu, więc można posłużyć się zwykłą logiką, tą elektroniczną.

Taki układ kombinacyny sam musi się jakoś ustawiać, by przed pojawieniem się następnego sygnału zegarowego, podstawić na wejścia odpowiednie sygnały.

No właśnie, układ musi "wiedzieć" co było przedtem, bo tylko na tej podstawie może wygenerować sekwencję segnałów wejściowych, i co się z tym wiąże, wyjściowych.

Stąd, układ sekwencyjny MUSI mieć pamięć. (Elektroniczną). Może nią być sam układ przerzutników z których zostanie zbudowana cała struktura logiczna. To najprostsze rozwiązanie. Mając pamięć, układ jest w stanie "wiedzieć" co było przedtem. Na tej podstawie generować będzie sygnały wejściowe, no i wyjściowe.

       Proszę zwrócić uwagę na sygnały wyjściowe w taktach 3,4,5, które tu powtórzę:

3 0 0 0
4 0 0 0
5 1 0 0

       Zgodnie z tym co napisałem wyżej, w takcie <4> układ musi "wiedzieć" co było w takcie <3> bo na tej podstawie wygeneruje sygnały wejściowe. A w takcie <3> było 000. Ale rozpatrując takt <5> dochodzimy do wniosku, że układ powinien pamiętać co było w takcie <4> a tam też było 000. To jak to? Ta sama "przeszłość" a mają wygenerować się inne sygnały? W takcie <3> jest 000, w następnym ma być 000. W takcie <4> jest 000 a w następnym 100 !!!

No i kołomętlik gotowy.

Ale czy historia o której tu mówimy ma dotyczyć tylko poprzedniego stanu który był przed chwilą na wyjściach układu sekwencynego?

       NIE!!!

Przecież można brać pod uwagę stany dużo wcześniejsze, które byłu w takcie n-1, n-2, n-3 itd...

Wtedy jednoznacznie wyznaczyć można stany wejść, by wyjścia przyjęły zamierzone kombinacje.

       Po co to wszystko?

Jak zaznaczyłem, układy sekwencyjne muszą mieć pamięć. Budowane z przerzutników, same w sobie stanowią taką pamięć. Aby przerzutnik mógł prawidłowo pracować, w/g założonej sieci działań, na jego wejścia podawać należy odpowiednie stany które jak się to mówi, wzbudzą odpowiedni stan wyjścia po pojawieniu się sygnału zegarowego.

Aby całość jeszcze bardziej skomplikować, powiem że należy znać tzw. tablicę wzbudzeń przerzutnika. Mało tego. Dostępnych jest kilka rodzajów przerzutników. Np. D, JK, T itd.

- Który wybrać, jak to połączyć?

- Oto są pytania godne SERIOUS'a.

       Ale...

       By dobrze orientować się w temacie wystarczy umieć minimalizować funkcje logiczne, wiedzieć co to historia układu sekwencyjnego, znać tablicę wzbudzeń, albo przejść przerzutnika, no i wiedzieć co się chce zbudować.

       Było trudne?

Zenon/DIAL