Architektura mikroprocesorów Z80 zagadnienia sprzętowe
Układ Z80-CPU jest jednostką centralną (od ang. Central Processor Unit). Zadaniem tego układu jest realizacja ciągu rozkazów zapisanych w formie programu. Początkowo te układy były produkowane w formie wydzielonych układów scalonych w obudowie DIP40. Z czasem w ofercie Ziloga pojawiły się bardziej zintegrowane układy zawierające więcej niż tylko samą jednostkę centralną. Przykładem może być układ Z84C15 (Z80-EIPC). Zawiera on w jednym układzie scalonym między innymi takie podzespoły jak:
- Z80-CPU – jednostka centralna,
- Z80-SIO – kontroler transmisji szeregowej,
- Z80-CTC – kontroler licznikowo-zegarowy,
- Z80-PIO – uniwersalny port równoległy (zespół WE/WY).
Odnóżna procka (chyba tu nie da się zrobić tabelki):
D0-D7 we/wy trójstanowe dwukierunkowa, 8-bitowa magistrala danych. D0 oznacza najmniej znaczący bit, D7 najbardziej znaczący bit. To poprzez te druty przepływa cała mądrość.
A0-A15 wyjścia trójstanowe jednokierunkowa, 16-bitowa magistrala adresowa. A0 oznacza najmniej znaczący bit. Przez te druty, mikroprocesor informuje otoczenie gdzie lub skąd chce dane.
/RESET wejście Wejście zerowania, aktywne stanem niskim. To taki drucik do mikroprocesora, który mówi: “no koleś procek, zaczynamy od początku”.
CLK wejście Sygnał zegarowy taktujący pracę mikroprocesora, to taki drucik, który mówi jak szybko trzeba pracować (jak “ekonom z batem”).
/BUSREQ wejście Sygnał żądania zwolnienia przez CPU magistrali danych, adresowej i sterującej, stan aktywny-niski. To taki drucik, który żąda od CPU wprowadzanie linii danych, adresów i linii sterujących (/MREQ,/IORQ, /RD i /WR) w stan wysokiej impedancji i zawieszenia swojej pracy, czyli “ej ... koleś procek, może miałbyś ochotę na drzemkę, a ja ci pogrzebię w twoich zapiskach”.
/BUSACK wejście Sygnał odpowiedzi na żądanie /BUSREQ. Pojawienie się stanu niskiego jest potwierdzeniem zwolnienia magistrali systemowych (magistrala danych, adresowa i sterująca znajdują się w stanie wysokiej impedancji), czyli “idę się zdrzemnąć, a wy możecie w tym czasie poszperać w mojej pamięci”.
/HALT wyjście Sygnał stanu zatrzymania mikroprocesora. Stan niski na wyjściu /HALT oznacza, że Z80 CPU jest w trakcie wykonywania rozkazu HALT. Podczas zatrzymania mikroprocesor wykonuje rozkaz NOP, dzięki czemu nadal odświeżane są pamięci dynamiczne, czyli “finito z robotą”.
/INT wejście Sygnał zgłoszenia przerwania maskowalnego (stan aktywny niski). Stan na tym druciku wymuszany jest przez zewnętrzne układy we-wy, czyli “uwaga, ktoś puka do naszych drzwi i chce zburzyć nasz błogi spokój”.
/NMI wejście Sygnał zgłoszenia przerwania niemaskowalnego (aktywny-niski). Przerwanie NMI ma wyższy priorytet niż przerwanie maskowalne. Cechą charakterystyczną tego przerwania jest to, że jak zostanie zgłoszone , to ZAWSZE wejdzie, czyli “ktoś puka do drzwi i jak nie otworzymy mu, to se sam je otworzy ... łomikiem”
/M1 wyjście Stan aktywny-niski. Ten drucik informuje o rozpoczęciu wykonania pierwszego cyklu maszynowego (pobranie kodu instrukcji do wykonania). Stany niskie na wyjściach /M1 i /MREQ oznaczają, że mikroprocesor jest w trakcie pobierania kodu rozkazu z pamięci, czyli “uwaga ... przyjmuję zleconko na małą robótkę”
/IORQ wyjście trójstanowe Stan aktywny-niski. Drucik informujący, że magistralą adresową przesyłany jest ważny adres układów we-wy, czyli “uwaga, będę grzebać po portach”. Stan niski sygnału /IORQ i /M1 [niejako pobranie instrukcji z portu a nie z pamięci] oznacza potwierdzenie przyjęcia przerwania, czyli “uwaga, kto do mnie pukał i czego chce?”
/MREQ wyjście trójstanowe Stan aktywny-niski. Sygnał informujący, że na magistrali adresowej jest wystawiony adres komórki w pamięci, czyli “uwaga, będę grzebać w pamięci ... swojej”.
/RD wyjście trójstanowe Stan aktywny-niski. Sygnał odczytu z pamięci lub urządzeń we-wy. Pojawienie się stanu niskiego na tym druciku oznacza wysłanie na magistralę danych zawartości komórki pamięci lub rejestru układu we-wy, czyli “uwaga ... słucham was”.
/WR wyjście trójstanowe Stan aktywny-niski. Sygnał zapisu danych do pamięci lub układów we-wy. Stan niski na tym druciku sygnalizuje, że na magistrali danych znajduje się bajt, które powinno być zapisane do pamięci lub układu we-wy adresowanego liniami A0-A15 magistrali adresowej, czyli “uwaga, mówię do was”.
/WAIT wejście Stan aktywny-niski. Stan niski na tym wejściu oznacza, że pamięć lub układy we-wy nie są gotowe do przesłania danych. Mikroprocesor przedłuża cykl odczytu lub zapisu nie zmieniając stanu sygnałów na wyjściach do czasu, gdy stan sygnału /WAIT zmieni się na wysoki, czyli drucik, poprzez który świat zewnętrzny informuje mikroprocesor “ej koleś procek, poczekaj, ja nie nadążam ... bo mam coś wspólnego ... z żółwiem”.
/RFSH wyjście Stan aktywny-niski. Taki drucik, który oznacza odświeżenie pamięci dynamicznych RAM, czyli “uwaga, ćwiczyć pamięć, bo niećwiczona pamięć to, ... co to ja miałem ... a pamięć miałem, to się chyba nazywa ... skleroza”.
Budowa mikrokomputera w oparcie o mikroprocesor Z80 praktycznie zawsze wygląda podobnie. Jako mikrokomputer należy tu rozumieć szeroko pojęte urządzenie zawierające mikroprocesor: zarówno coś w stylu “ZX SPECTRUM” (popularny swego czasu mikrokomputer generalnie używany do gier) jak i zwykły zegarek z wyświetlaczem sterowanym przez Z80. Budowa obu urządzeń podlegają tym samym zasadom. Całość można podzielić na dwie części: “procesor” (mikroprocesor) oraz “reszta świata”. Również jest to prawdziwe w przypadku mikrokontrolerów, tylko, że “reszta świata” również znajduje się fizycznie w tym samym układzie scalonym. Obie te części współpracują ze sobą i komunikują się poprzez grupy sygnałów sterujących, które generalnie można podzielić na trzy rodzaje:
- szyna danych,
- szyna adresowa,
- szyna sterująca.
W przypadku szyny adresowej (czyli zbioru pojedynczych drucików), to intuicyjnie można określić, co wchodzi w jej skład. Podobnie w przypadku szyny danych. Obie te szyny służą do przesyłania określonych informacji: szyna adresowa podaje adresy do pamięci lub urządzeń, z którymi mikroprocesor aktualnie ma potrzebę komunikacji, oraz szyna danych, przez którą mikroprocesor nakazuje pamięci lub urządzeniom zewnętrznych (porty) zapamiętanie informacji lub przez którą mikroprocesor pobiera informacje z pamięci lub z urządzeń zewnętrznych (portów).
Zawartość szyny sterującej, to właściwie zbiór wszelkiego rodzaju drucików, za pomocą których mikroprocesor określa dla reszty świata szczegóły swoich zachcianek. Również reszta świata może przekazywać sygnały do mikroprocesora. Generalnie, szyna sterująca zawiera wszelkiego rodzaju sygnały, które niosą określoną informacją zarówno dla mikroprocesora jak i od mikroprocesora.
Posługując się dokumentacją mikroprocesora Z80 można zaobserwować co i w jaki sposób jest wykonywane. Właściwie to należy uwierzyć dokumentacji, bo te przebiegi trudno jest zaobserwować w rzeczywistości. Jeżeli sygnał CLK ma częstotliwość 1MHz (na poniższym rysunku), to czas trwania T1 (T2, T3 ...) wynosi 1 mikrosekundę (1/1000000 s), a to raczej jest za szybko by dostrzec to nieuzbrojonym okiem.
Tłumacząc powyższy rysunek przedstawiający pobranie z pamięci kodu instrukcji do wykonania na język ludzi, to mamy (w chronologii czasowej pokazanej na rysunku):
- uwaga, na drucikach A0 do A15 jest zawarty adres (drucików jest 16 i za ich pomocą można wyprodukować ponad 65 tys różnych kombinacji),
- uwaga, ... przyjmuję zleconko na małą robótkę (w pewnym momencie M1=0),
- uwaga, będę grzebać w pamięci (w pewnym MREQ =0),
- uwaga, ... słucham was (w pewnym RD =0).
W czasie trwania cyklu odświeżania, mikroprocesor, by nie tracić czasu, wykonuje to co nakazuje mu pobrany rozkaz. Czasami zajmie mu to trochę więcej czasu, czasami dodatkowo trzeba będzie zrobić zapis do pamięci, czasami do portu, ewentualnie zamiast zapisu będzie odczyt. To wszystko zależy od kodu pobranego rozkazu. Istnieje bardzo wiele instrukcji, które nie będą wymagały dodatkowych akcji związanych z szynami danych, adresowych oraz sterowań.
Jak to wszystko, czego wymagał pobrany rozkaz zostanie zakończone, to mikroprocesor ponownie pobierze rozkaz do wykonania, czyli koło się zamyka.
Jak zostało wspomniane wcześniej, wykonywany rozkaz może być poleceniem odczytu lub zapisu danych do pamięci. Powyższy diagram pokazuje w szczegółach, co jest realizowane w tych operacjach.
W przypadku odczytu jest podobnie jak przy pobraniu kodu rozkazu (w końcu pobranie rozkazu do wykonania sprowadza się do odczytania tego kodu z pamięci). Jedyną występującą różnicą jest brak stanu aktywnego sygnału M1 (również nie występuje cykl odświeżania pamięci, który wchodzi w skład operacji pobrania rozkazu).
W przypadku zapisu do pamięci, również mikroprocesor na szynie adresowej wystawia adres, na szynie danych zapisywane informacje i wystawia sygnał żądania dostępu do pamięci, czyli: uwaga, będę grzebać w pamięci (w pewnym MREQ =0). W odpowiedzi wszystkie bramki, przerzutniki, rejestry i całe inne towarzystwo reszty świata się sprężyło i w napięciu [chodzi o napięcie emocjonalne a nie elektryczne ] czeka ... bo nie było informacji, że to odczyt (nie było RD=0), więc ... w pewnym momencie przychodzi: polecenie teraz zapisać (WR=0) i następuje odprężenie.
Przedstawione rysunki opisywały operacje dotyczące pamięci. Na podobnej zasadzie odbywają się sterowania w operacjach dotyczących portów. W tym przypadku zamiast sygnału MREQ występuje IORQ. W operacjach odczytu z portu przebieg sygnałów przedstawia następujący rysunek. Informacje występujące na szynie danych należy interpretować następująco:
- na drucikach A0 do A7 (inaczej niż w operacjach dotyczących pamięci) określony jest adres, możliwych kombinacji jest 256,
- uwaga, będę grzebać po portach (IORQ=0),
- uwaga, ... słucham was (w pewnym RD =0).
Z istotnych cykli wykonywanych przez mikroprocesor pozostało jeszcze przyjęcie i realizacja obsługi przerwania. Sama realizacja obsługi przerwania niczym nie różni się od normalnych cykli M1 (związanych z pobieraniem instrukcji do wykonania), natomiast cechy charakterystyczne występują w momencie rozpoczęcia obsługi przerwania. Przedstawia po poniższy rysunek. Z racji, że przerwanie w swej istocie zawsze jest związane z urządzeniami zewnętrznymi (portami), to rozpoczęcie obsługi przerwania jest sygnalizowane dla reszty świata pewnym charakterystycznym szczegółem: wykonany jest cykl M1 dla urządzenia (portu). Można to rozumieć jako pobranie kodu rozkazu do wykonania nie z pamięci, tylko z portu. Nie jest to rzeczywiste pobranie kodu rozkazy (nawet nie występuje sygnalizacja operacji odczytu, sygnał RD ciągle jest jedynką). Ta trochę dziwna sekwencja sterująca służy do sygnalizacji przez procesor faktu rozpoczęcia obsługi przerwania. Zgłaszające przerwanie urządzenia mają obowiązek rozpoznania tego stanu i w takim momencie “porozumieć się” z mikroprocesorem celem ustalenia wszystkich szczegółów związanych z rzeczywistym rozpoczęciem obsługi przerwania. Takie możliwości mają wszystkie układy wchodzące w skład rodziny mikroprocesorowej Z80.