[2] SDC One = Software Defined Computer na STM32: realizacja protokołu szyny mikroprocesora przy użyciu STM32

Wszystkie części cyklu artykułów są dostępne pod adresem.

Zapewnienie prawidłowego działania SDC_One wymaga analizy protokołów szyny używanych mikroprocesorów. Należy przeanalizować wykresy czasowe przedstawiające przebiegi sygnałów we wszystkich rodzajach cykli generowanych przez procesor, wartości parametrów czasowych zawarte w dokumentacji procesora oraz ustalić, które czynności są krytyczne czasowo, wymagają reakcji w ściśle określonym przedziale czasowym i, w związku z tym, muszą zostać zrealizowane sprzętowo przy użyciu peryferiali mikrokontrolera.

Krytyczne znaczenie dla realizacji komputera zdefiniowanego programowo ma sygnał gotowości/niegotowości do zakończenia cyklu transmisji, który pozwala modułowi współpracującemu z procesorem (pamięci, urządzeniu peryferyjnemu) poinformować procesor o potrzebie wydłużenia cyklu. W czasach gdy używane w projekcie procesory były projektowane, sygnał ten służył głównie zapewnieniu możliwości współpracy z wolniejszymi, a więc i tańszymi, pamięciami i urządzeniami wejścia-wyjścia. Dodatkowo umożliwiał on realizację pracy krokowej, a więc pewne, chociaż dość prymitywne, mechanizmy debugowania. W SDC_One sygnał ten jest przez większość czasu w stanie sygnalizującym niegotowość. Daje to mikrokontrolerowi czas na wykonanie wszystkich czynności niezbędnych do realizacji bieżącego cyklu transmisji, które mogą zajmować różną ilość czasu w zależności od rodzaju działań zleconych przez procesor, oraz umożliwia mikrokontrolerowi podjęcie decyzji o finalizacji cyklu w odpowiednim momencie np. po wydaniu przez użytkownika polecenia przejścia do kolejnego cyklu w przypadku pracy krokowej.

Typowy schemat sekwencji czynności procesora podczas wykonania pojedynczego cyklu wygląda następująco:

• procesor wystawia adres na szynie adresowej,

• ustawia sygnały sterujące sygnalizujące początek nowego cyklu oraz informujące o rodzaju odwołania – kierunku przesyłania danych, pozwalające zidentyfikować typ cyklu maszynowego,

• jeśli wykonywany jest zapis, procesor wystawia dane na linie danych,

• sprawdza stan sygnału niegotowości i jeśli sygnał niegotowości jest aktywny wstawia takty oczekiwania utrzymując niezmieniony stan sygnałów szyny,

• po wykryciu gotowości, finalizuje transakcję; zapamiętuje dane z linii danych w cyklu odczytu,

• kończy cykl wycofując sygnały sterujące.

Schemat ten może się różnić w zależności od procesora, mogą występować dodatkowe czynności lub niektóre kroki mogą być zrealizowany w sposób charakterystyczny dla określonej serii układów.

Działania, które musi podjąć mikrokontroler w celu poprawnego obsłużenia protokołu szyny procesora wynikają bezpośrednio z przedstawionej wyżej sekwencji czynności i obejmują:

• wykrycie początku nowego cyklu maszynowego,

• identyfikację rodzaju cyklu,

• reakcję odpowiednią dla wykrytego typu transferu:o w cyklu odczytu: pobranie odpowiednich danych, wysterowanie szyny danych i wystawienie na niej odpowiednich wartości,o w cyklu zapisu: zapamiętanie danych dostępnych na szynie danych, interpretację ich wartości i stosowną reakcję,

• sygnalizację gotowości do zakończenia cyklu transmisji poprzez deaktywowanie sygnału niegotowości,

• wykrycie zakończenia bieżącego cyklu i aktywowanie sygnału niegotowości,

• jeśli wykonywany był cykl odczytu, wycofanie sterowania szyny danych.

W przypadku niektórych procesorów mogą występować dodatkowe czynności np. w przypadku multipleksowanej szyny konieczność zapamiętania adresu dostępnego na szynie tylko na początku cyklu. Dla większości używanych procesorów czynnościami krytycznymi czasowo są aktywowanie sygnału niegotowości oraz wycofanie sterowania szyny danych (ustawienie linii danych w stan wysokiej impedancji), żeby uniknąć konfliktu na szynie grożącego uszkodzeniem buforów wyjściowych używanych układów, w przypadku gdyby w kolejnym cyklu procesor próbował wysterować szynę danych.

W przypadku multipleksowanej szyny również zapamiętanie adresu dostępnego przez określony czas na liniach współdzielonych z innymi sygnałami jest krytyczne czasowo. Ponieważ estymowany czas odpowiedzi na przerwanie w mikrokontrolerach rozważanych przy konstrukcji SDC_One wynosi ok. 250 ns, czynności krytyczne czasowo nie mogą być wykonywane w procedurze obsługi przerwania i należy użyć mechanizmów sprzętowych dostępnych w mikrokontrolerach. Skorzystanie z mechanizmów sprzętowych umożliwia również debugowanie programu bez obawy o uszkodzenie układów w wyniku zatrzymania programu skutkującego nie dotrzymaniem ograniczeń czasowych i dopuszczeniem do konfliktu na szynie. W związku z tym pojawiła się koncepcja, aby do realizacji czynności krytycznych czasowo użyć modułu DMA. Sygnały szyny procesora podłączone są do wyprowadzeń mikrokontrolera.

Sygnały wejściowe procesora podłączone są do wyjść mikrokontrolera i vice versa. Wyłączenie sterowanie linii przez mikrokontroler polega na ustawieniu ich jako wejścia w rejestrze MODER określonego portu GPIO. Zmiana stanu wyjścia mikrokontrolera zachodzi przez zapis odpowiedniej wartości do rejestru BSRR, natomiast odczyt wartości sygnałów jest możliwy poprzez rejestr IDR. Zawartość rejestrów sterujących portów GPIO może być modyfikowana przez transfery DMA. W przypadku mikrokontrolerów serii F4 i F7 istnieją tu pewne ograniczenia.

Rys. 3. Połączenie szyn w mikrokontrolerach serii F4

Na rysunku 3 widoczne są połączenia szyn w mikrokontrolerach serii F4 – kropki oznaczają istnienie połączenia między dwoma szynami. Porty GPIO dostępne są przez szynę AHB1. Jak widać w oznaczonym miejscu nie istnieje połączenie między modułem DMA1 i szyną AHB1. Z tego powodu do zmiany stanu rejestrów portów GPIO może zostać użyty tylko moduł DMA2. Ograniczenia takie nie występują w przypadku serii L4, gdzie istnieje połączenie między szyną AHB1 i obydwoma modułami DMA.

Konieczność wykonania określonych akcji przez procesor może być wykryta przez monitorowanie stanu wyjściowych sygnałów sterujących procesora i detekcję odpowiednich zboczy. Żądania transferu DMA mogą być zgłaszane przez różne zdarzenia generowane przez peryferiale mikrokontrolera, ale nie w wyniku zmiany stanu linii portów GPIO. Zbocza sygnałów portów mogą być natomiast wykrywane przez timer działający w trybie capture, który z kolei może zgłosić żądanie transferu DMA.

W mikrokontrolerach serii F4 i F7 z powodów przedstawionych powyżej konieczne jest użycie timera mogącego współpracować z modułem DMA2, co realnie ogranicza wybór timerów do TIM1 i TIM8.Tryb capture timera pozwala na zapamiętanie wartości licznika timera po wystąpieniu określonego zdarzenia na jednym z monitorowanych wejść (kanałów), co może zostać użyte m.in. do pomiaru długości trwania impulsu. W przedstawionym schemacie zapamiętana wartość licznika jest ignorowana; istotna jest możliwość zgłoszenia żądania transferu DMA w wyniku wystąpienia zdarzenia capture. Timery w mikrokontrolerach STM32 mają kilka użytecznych własności pozwalających w niektórych przypadkach znacznie uprościć konstrukcję komputera zdefiniowanego programowo. Timery te mają typowo 4 kanały połączone w pary: kanał 1 i 2 oraz 3 i 4.

Sygnał podany na wejście powiązane z jednym z kanałów z pary może zostać podany na wejście drugiego kanału z pary. Jest to użyteczne, jeśli określone zdarzenie (zmiana sygnałów sterujących procesora) musi generować dwa transfery DMA. Sytuacja taka zachodzi, gdy zarówno aktywowanie sygnału niegotowości jak i przestawienie linii danych w stan wysokiej impedancji są wykonywane po wykryciu zakończenia bieżącego cyklu transmisji, co jest typowym przypadkiem. Wymaga to zapisu dwóch rejestrów sterujących – BSRR dla sygnału niegotowości i MODER dla szyny danych. Można wówczas podać ten sam sygnał na dwa kanały DMA i wygenerować 2 żądania transferu do dwóch lokacji. Bez tego mechanizmu konieczne byłoby użycie dwóch timerów (lub ewentualnie dwóch wejść powiązanych z dwoma kanałami timera), co wiązałoby się z koniecznością użycia większej liczby wyprowadzeń i poprowadzenia dodatkowych ścieżek na płytce w celu rozprowadzenia sygnałów.

Większa liczba niezbędnych wyprowadzeń uniemożliwiłaby użycie w projekcie tańszej i mniejszej płytki Nucleo-64. Inną użyteczną własnością timerów jest możliwość monitorowania przez kanał 1 sygnału będącego różnicą symetryczną sygnałów z wejść powiązanych z kanałami 1, 2 i 3 timera. Pozwala to w prosty sposób obsłużyć sytuację, gdy wystąpienie określonego zdarzenia, np. początku czy końca cyklu transmisji, jest wykrywane na podstawie zmian więcej niż jednego sygnału, ponieważ w różnych typach cykli transmisji występują zbocza różnych sygnałów.Jeśli zapewnione zostanie dotrzymanie zależności czasowych dla krytycznych czynności, procesor po rozpoczęciu cyklu transmisji będzie oczekiwał na deaktywowanie sygnału niegotowości wstawiając takty oczekiwania dopóki to nie nastąpi.

W takiej sytuacji czynności, które nie są krytyczne czasowo mogą zostać wykonane w procedurze obsługi przerwania, które powinno być zgłaszane po wykryciu rozpoczęcia nowego cyklu transmisji przez procesor. Należy zapewnić, że każdy cykl maszynowy zostanie obsłużony dokładnie raz oraz, że w momencie odczytu stanu sygnałów szyny przez mikrokontroler będą one już ustalone. Wiąże się to z koniecznością starannego doboru sygnałów, których zbocza będą powodować zgłoszenie przerwania oraz ewentualnym ignorowaniem niektórych przerwań.Analiza protokołu szyny każdego z procesorów używanych w projekcie ma na celu ustalenie dokładnego sposobu jego obsługi oraz wybór zboczy sygnałów, które będą powodować zgłoszenie żądań transferu DMA i przerwania początku cyklu. Poniżej przedstawiono analizę protokołu szyny procesorów Zilog Z80, Motorola MC68008, Intel 8085 oraz WDC65C02.

Zilog Z80

Z80 to procesor bazujący na układzie Intel 8080, wprowadzony na rynek w 1976 roku przez firmę Zilog. Jest on zgodny programowo z procesorem Intel 8080. Używany był m.in. w komputerach ZX Spectrum i jako drugi procesor (obok MOS 8502) w Commodore 128. Jest to procesor 8-bitowy wyposażony w 16-bitową szynę adresową i 8-bitową szynę danych. Procesor ma wyróżnioną przestrzeń wejścia-wyjścia.

W czasie działania procesor generuje 6 podstawowych rodzajów cykli (na początku podano oznaczenia używane jako identyfikator cyklu w konsoli monitora szyny):

• M1 – pobranie kodu operacyjnego instrukcji

• MR – odczyt pamięci

• MW – zapis do pamięci

• IR – odczytu portu wejściowego

• IW – zapis do portu wyjściowego

• IA – potwierdzenia przyjęcia przerwania

Ważniejsze sygnały sterujące procesora to:

• wyjścia procesora (wejścia uC)

-MREQ – żądanie dostępu do pamięci; uaktywniany w cyklach odczytu i zapisu pamięci oraz w cyklu pobrania kodu operacyjnego instrukcji,

-IORQ – żądanie dostępu do przestrzeni wejścia-wyjścia; uaktywniany w cyklach odczytu i zapisu portów wejścia-wyjścia oraz w cyklach potwierdzenia przyjęcia przerwania.

-RD – strob odczytu,

-WR – strob zapisu,

-M1 – aktywny w cyklu pobrania kodu operacyjnego oraz w cyklu potwierdzenia przyjęcia przerwania,

• wejścia procesora (wyjścia uC)

-WAIT – sygnał niegotowości,

-INT – zgłoszenie przerwania maskowalnego,

-NMI – zgłoszenie przerwania niemaskowalnego.

Na poniższych rysunkach widoczne są przebiegi czasowe sygnałów szyny dla cyklu dostępu do pamięci oraz cyklu potwierdzenia przyjęcia przerwania. W cyklu dostępu do pamięci po wystawieniu adresu sygnał  MREQ ustawiony zostaje w stan niski. Następnie w cyklu odczytu w stan niski ustawiony zostaje sygnał -RD, a w cyklu zapisu dane zostają wystawione na szynę danych i aktywowany jest sygnał -WR. Po zakończeniu cyklu transmisji sygnały -MREQ i -RD lub -WR ustawione zostają w stan wysoki. Stan sygnału -WAIT jest próbkowany opadającym zboczem zegara w takcie T2.

Rys. 4. Przebiegi czasowe sygnałów szyny w cyklach dostępu do pamięci procesora Zilog Z80

W cyklu potwierdzenia przyjęcia przerwania sygnał -M1, a później -IORQ ustawiony zostają w stan niski. Procesor odczytuje wektor przerwania z szyny danych, a następnie kończy cykl ustawiając sygnały -M1 i -IORQ w stan wysoki. W cyklu tym wstawiane są automatycznie dwa cykle oczekiwania. Stan sygnału -WAIT jest próbkowany opadającym zboczem zegara w drugim z tych taktów.

Rys. 5. Przebiegi czasowe sygnałów szyny w cyklach potwierdzenia przyjęcia przerwania procesora Zilog Z80

 

Cykle dostępu do przestrzeni wejścia-wyjścia wyglądają podobnie do cykli dostępu do pamięci z tą różnicą, że zamiast sygnału -MREQ aktywowany jest sygnał -IORQ i wstawiany jest jeden automatyczny takt oczekiwania.

Cykl pobrania kodu operacyjnego składa się z dwóch faz. W pierwszej następuje pobranie bajtu kodu operacyjnego z pamięci, co przebiega w sposób podobny do odczytu pamięci z tą różnicą, że dodatkowo aktywny jest sygnał -M1. Potem następuje faza odświeżania pamięci, która jest nieistotna dla konstrukcji SDC_One.

W przypadku procesora Z80 zarówno wyłączenie sterowanie szyny danych jak i aktywowanie sygnału niegotowości może nastąpić po wykryciu zakończenia bieżącej transakcji. W każdym generowanym przez procesor cyklu jeden z sygnałów -MREQ, -IORQ jest ustawiany w stan niski, a wraz z końcem cyklu ustawiany w stan wysoki. W związku z tym narastające zbocze tych sygnałów może zostać użyte do wykrycia końca cyklu i wygenerowania żądania transferu DMA – na rysunkach zbocza te zaznaczono kolorem zielonym.

Do zgłaszania przerwań początku cyklu użyto opadającego zbocza sygnałów -RD i -WR, oraz dodatkowo sygnału –IORQ w celu wykrycia cyklu potwierdzenia przyjęcia przerwania – na rysunkach zbocza te zaznaczono kolorem niebieskim. Zdecydowano o użyciu sygnałów -RD i -WR, raczej niż  MREQ i -IORQ, ponieważ ułatwia to identyfikację i obsługę cykli. Sygnały -RD i -WR są aktywowane, gdy wszystkie pozostałe istotne sygnały sterujące oraz zawartość linii danych w cyklach zapisu są już ustalone, natomiast sygnały -IORQ i -MREQ są aktywowane na samym początku cyklu, co wymagałoby odczekania odpowiedniego czasu do ustalenia pozostałych sygnałów zanim można by przystąpić do identyfikacji cyklu. Ponieważ w cyklu potwierdzenia przyjęcia przerwania żaden z sygnałów -RD, -WR nie jest aktywny konieczne było użycie dodatkowego sygnału do wykrycia tego cyklu. Wybrano sygnał -IORQ, który jest aktywowany w momencie, gdy możliwe jest już prawidłowe zidentyfikowanie cyklu – sygnał -M1 jest już aktywny. Użycie sygnału -M1 byłoby problematyczne, gdyż zarówno w cyklu potwierdzenia przyjęcia przerwania, jak i w cyklu pobrania kodu operacyjnego sygnał ten aktywowany jest jako pierwszy, co uniemożliwia natychmiastową identyfikację cyklu – konieczne jest odczekanie pewnego czasu do pojawienia się sygnałów umożlwiających odróżnienie cyklu M1 (w którym aktywny jest dodatkowo sygnał –MREQ) od cyklu potwierdzenia przyjęcia przerwania (w którym aktywny jest sygnał –IORQ). W związku z użyciem sygnały -IORQ do zgłaszania przerwania początku cyklu niektóre zgłoszenia przerwania powinny zostać zignorowane, aby nie przeprowadzić obsługi tego samego cyklu dwukrotnie. Po zgłoszeniu przerwania następuje sprawdzenie jego źródła. Jeśli zgłoszenie było od sygnału -IORQ, to sprawdzany jest stan linii -M1. Jeśli sygnał -M1 jest aktywny, to jest to cykl potwierdzenia przyjęcia przerwania, który zostaje następnie obsłużony. Jeśli natomiast sygnał -M1 nie jest aktywny, to przerwanie jest ignorowane, ponieważ mamy do czynienia z cyklem dostępu do przestrzeni wejścia-wyjścia i zostanie ono zgłoszone ponownie w wyniku aktywowania któregoś z sygnałów -RD, -WR.

68008

Seria Motorola M68000 (znana również jako 68k) to rodzina 32-bitowych procesorów, której pierwszym przedstawicielem był procesor MC68000 wyposażony w 24-bitową szynę adresową i 16-bitową zewnętrzną szynę danych. Używany był on m.in. w komputerach Atari ST, Commodore Amiga i Apple Macintosh. MC68008 to wersja procesora MC68000 wyposażona w 8-bitową zewnętrzną szynę danych i 20- lub 22-bitową szynę adresową. MC68008 został wprowadzony na rynek w roku 1982. Był on popularny w zastosowaniach wbudowanych.

W przeciwieństwie do procesora Zilog Z80, procesory rodziny 68k nie mają wyróżnionej przestrzeni wejścia-wyjścia – porty wejścia wyjścia są odwzorowane w przestrzeni adresowej pamięci. Ważniejsze sygnały sterujące procesora to:

• wyjścia procesora (wejścia uC)

-AS – strob adresu – aktywny gdy na liniach adresowych wystawiony jest ważny adres odwołania,

-DS – strob danych – w cyklach odczytu uaktywniany, gdy na szynie danych są wystawione ważne dane, w cyklach zapisu – gdy procesor jest gotowy na przyjęcie danych,

R/-W – sygnalizuje kierunek transmisji (odczyt/zapis),

FC0, FC1, FC2 – pozwalają dokładniej zidentyfikować rodzaj wykonywanego dostępu – poziom zaufania: użytkownika lub systemu, dostęp do programu lub danych,

-IORQ – żądanie dostępu do przestrzeni wejścia-wyjścia; uaktywniany w cyklach odczytu i zapisu portów wejścia-wyjścia oraz w cyklach potwierdzenia przyjęcia przerwania,

• wejścia procesora (wyjścia uC):

-DTACK – sygnał gotowości,

-IPL0/-IPL2, -IPL1 – linie priorytetu zgłaszanego przerwania; w procesorze MC68008 linie IPL0 i IPL2 są połączone i na zewnątrz wyprowadzony jest jeden sygnał, co oznacza, że dostępne priorytety to 0 (000b), 2 (010b), 5 (101b) i 7 (111b); priorytet 0 oznacza brak zgłoszenia przerwania, priorytet 7 – przerwanie niemaskowalne,

-VPA – aktywowanie tego sygnału w cyklu potwierdzenia przyjęcia przerwania powoduje, że procesor wykonuje operację autowektorowania tj. pobiera wektor przerwania z ustalonej lokacji zależnej od priorytetu przerwania.

-BERR – sygnał błędu szyny, oznacza problem z wykonaniem bieżącej transakcji; po jego uaktywnieniu procesor kończy cykl maszynowy bez finalizacji transakcji i przechodzi do obsługi błędu; jeśli sygnał ten zostanie aktywowany razem z sygnałem -HALT, procesor kończy cykl maszynowy bez finalizacji transakcji i czeka na deaktywowanie tych sygnałów, po czym ponawia próbę wykonania transakcji,

• linie dwukierunkowe typu otwarty dren:

-RESET – sygnał inicjacji procesora, uaktywniany razem z -HALT,

-HALT – uaktywniany wraz z -RESET przy inicjacji procesora lub wraz z -BERR w celu wstrzymania działania procesora.

Pod względem przebiegów czasowych sygnałów na szynie można wyróżnić 4 rodzaje cykli:

• cykl odczytu,

• cykl zapisu,

• cykl odczytu-modyfikacji-zapisu,

• cykl specjalny (potwierdzenie przyjęcia przerwania).

Cykl odczytu-modyfikacji-zapisu to cykl pozwalający na wykonanie niepodzielnej operacji modyfikacji bajtu w pamięci używany przez instrukcję TAS – Test And Set, ustawiającą najbardziej znaczący bit w adresowanym bajcie, która może posłużyć do implementacji operacji semaforowych. Jest on realizowany poprzez wygenerowanie pojedynczego strobu adresu na linii  AS w czasie następujących po sobie faz odczytu i zapisu generujących dwa stroby danych na linii -DS.

Po uwzględnieniu informacji uzyskanych na podstawie stanu sygnałów FC2..0 można wyróżnić następujące cykle (na początku podano oznaczenia używane jako identyfikator cyklu w konsoli monitora szyny):

• SPR – Supervisor Program Read – odczyt programu systemu,

• SDR – Supervisor Data Read – odczyt danych system,

• SDW – Supervisor Data Write – zapis danych systemu,

• UPR – User Program Read – odczyt programu użytkownika,

• UDR – User Data Read – odczyt danych użytkownika,

• UDW – User Data Write – zapis danych użytkownika,

• CSR – CPU Space – cykl specjalny – w procesorze MC68008 jedyny cykl specjalny to potwierdzenie przyjęcia przerwania.

Na poniższych rysunkach widoczne są przebiegi czasowe sygnałów szyny dla cykli odczytu i zapisu procesorów serii 68k. W cyklu odczytu procesor wystawia informacje o rodzaju odwołania na liniach FC2-FC0 oraz adres na liniach adresowych, następnie uaktywnia sygnały –AS i –DS i oczekuje na dane oraz potwierdzenie gotowości. Stan sygnału –DTACK jest próbkowany opadającym zboczem zegara między S4 i S5.

Rys. 6. Przebiegi czasowe sygnałów szyny w cyklach odczytu procesorów serii 68k

Cykl zapisu wygląda podobnie z tym, że po aktywowaniu sygnału -AS procesor wystawia dane na linie danych i po ustaleniu ich stanu sygnalizuje ich ważność uaktywniając sygnał -DS. Cykl odczytu-modyfikacji-zapisu jest połączeniem następujących po sobie cykli odczytu i zapisu z tym samym adresem, rodzajem odwołania i pojedynczym strobem adresu rozciągającym się na obydwie fazy cyklu.

Cykl specjalny (CPU Space) jest podobny do cyklu odczytu. Charakteryzuje go określony stan linii FC2-FC0 oraz zawartość linii adresowych. Aktywowanie sygnału -VPA, gdy procesor próbuje uzyskać identyfikator przerwania, powoduje zignorowanie przez procesor zawartości linii danych i wygenerowanie numeru wektora przerwania wewnętrznie na podstawie jego priorytetu.

Rys. 7. Przebiegi czasowe sygnałów szyny w cyklach zapisu procesorów serii 68k

Podobnie jak w przypadku procesora Zilog Z80, oba transfery DMA (deaktywowanie sygnału –DTACK i wyłączenie sterowania szyny danych) są wykonywane po wykryciu tego samego zdarzenia, mianowicie końca cyklu transmisji sygnalizowanego narastającym zboczem sygnału  DS (oznaczonym na rysunkach kolorem niebieskim).

Zgłoszenie przerwania początku cyklu następuje po wykryciu opadającego zbocza sygnału -DS (oznaczonym na rysunkach kolorem zielonym). Użycie sygnału  DS jest tu najbardziej naturalnym wyborem, ponieważ strob na tej linii pojawia się w przypadku każdego wykonywanego transferu danych na szynie – w cyklu odczytu-modyfikacji-zapisu osobno dla obu transakcji występujących w tym cyklu.

Na linii  AS generowany jest wówczas pojedynczy strob, co wyklucza użycie tylko tego sygnału, gdyż prowadziłoby do braku obsługi fazy zapisu, rozpoczęcie której nie spowodowałoby zgłoszenia przerwania oraz do pojawienia się konfliktu na szynie w fazie zapisu, gdyż wyłączenie sterowanie szyny danych przez mikrokontroler nastąpiłoby dopiero po zakończeniu całego cyklu.

Intel 8085

Procesor Intel 8085 różni się od poprzednich tym, że ma multipleksowaną szynę – po tych samych liniach jest najpierw przysyłany mniej znaczący bajt adres, a następnie dane. Obecność adresu na współdzielonych liniach jest sygnalizowana przez strob na linii ALE. Czas, przez jaki adres jest dostępny na szynie zależy od częstotliwości zegara procesora i nie może być wydłużony. W związku z tym, zapamiętanie mniej znaczącego bajtu adresu jest czynnością krytyczną czasowo i jest obsługiwane przez transfer DMA wyzwalany przez timer działający w trybie capture monitorujący stan linii ALE i wykrywający opadające zbocze. Transfer polega na zapisaniu zawartości rejestru wejściowego (IDR) portu GPIO do pamięci.  Opadające zbocze sygnału ALE powoduje również zgłoszenie przerwania początku cyklu. Deaktywowanie sygnału gotowości READY i wyłączenie sterowania linii danych są wykonywane wraz w końcem bieżącego cyklu, który sygnalizowany jest przez narastające zbocze jednego z sygnałów -RD, -WR, -INTA, które są aktywowane odpowiednio w cyklach odczytu (pamięci, przestrzeni wejścia-wyjścia lub kodu operacyjnego), zapisu i potwierdzenia przyjęcia przerwania.

Sygnały te są monitorowane przez drugi timer, który zgłasza odpowiednie żądania DMA. Procesor Intel 8085 generuje puste cykle potwierdzenia przyjęcia przerwania (w odpowiedzi na sygnały RST, TRAP), w których nie uaktywnia żadnych strobów (żadnego z sygnałów -RD, -WR, -INTA), ale oczekuje na aktywowanie sygnału gotowości aby zakończyć cykl. Z tego powodu istotne jest, że zgłoszenie przerwania początku cyklu następuje po wykryciu opadającego zbocza sygnału ALE, które jest obecne w każdym, również pustym, cyklu, a nie opadających zboczy sygnałów -RD, -WR, -INTA. Dzięki temu w procedurze obsługi przerwania można wykryć wystąpienie pustego cyklu i aktywować sygnał gotowości bez wykonywania innych czynności.

Rys. 8. Przebiegi czasowe sygnałów szyny w cyklach odczytu i potwierdzenia przyjęcia przerwania procesora Intel 8085

 

Zweryfikowanie możliwości budowy poprawnie działającego komputera w przedstawiony wyżej sposób wymagało przeprowadzenia obliczeń i pomiarów weryfikujących możliwość dotrzymania wszystkich wymaganych parametrów czasowych. Na powyższych rysunkach kolorem czerwonym zaznaczono krytyczne parametry czasowe, których wartości można znaleźć w dokumentacjach poszczególnych procesorów. Na ich podstawie można wyliczyć ile czasu w najgorszym przypadku może upłynąć od zdarzenia powodującego wygenerowanie żądania transferu DMA do wygenerowania odpowiedniej reakcji. Wartości te zależą od czasu trwania taktu zegara procesora, a więc od częstotliwości jego pracy. Jeśli maksymalna częstotliwość uzyskana w obliczeniach, która zapewnia dotrzymanie parametrów czasowych będzie większa bądź równa minimalnej częstotliwości pracy określonego procesora, oznacza to, że możliwe jest zbudowanie poprawnie działającego komputera SDC_One z użyciem tego procesora w zaprezentowany powyżej sposób.

Poniżej przedstawiono odpowiednie obliczenia dla poszczególnych procesorów używając dla poszczególnych parametrów czasowych oznaczeń numerycznych z powyższych rysunków; czas trwania taktu zegara procesora oznaczono Tc.

 

Zilog Z80

Od narastającego zbocza sygnału -MREQ lub -IORQ do końca cyklu może minąć minimalnie 0,5 ∙ Tc   T52,max = 0,5 ∙ Tc   85 ns.  Od początku cyklu do uaktywnienia sygnału -WAIT może minąć maksymalnie Tc (takt T1) + 0,5 ∙ Tc (połowa taktu T2) – T17,min = 1,5 ∙ Tc   70 ns. Od początku cyklu do wystawienia przez procesor danych może minąć minimalnie 0,5 ∙ Tc (połowa taktu T1). Ostatecznie, uaktywnienie sygnału -WAIT musi nastąpić w czasie 0,5 ∙ Tc   85 ns + 1,5 ∙ Tc   70 ns = 2 ∙ Tc   155 ns, a przestawienie linii danych w stan wysokiej impedancji w czasie 0,5 ∙ Tc   85 ns + 0,5 ∙ Tc = Tc – 85 ns od zbocza powodującego zgłoszenie żądania DMA.

 

Motorola MC68008

Czas od opadającego zbocza zegara między S6 a S7 do narastającego zbocza sygnału -DS wynosi  maksymalnie T12,max = 50 ns. Czas od opadającego zbocza sygnału R/-W do zmiany impedancji linii danych wynosi minimalnie T55,min = 20 ns. Czas od narastającego zbocza zegara między S1 a S2 do ustawienia linii R/-W w stan niski wynosi maksymalnie T20,max = 45 ns, natomiast wartość minimalna nie jest specyfikowana, tak więc czas od narastającego zbocza zegara między S1 a S2 do zmiany impedancji linii danych wynosi minimalnie T55, min = 20 ns. Czas setup dla sygnału  DTACK względem opadającego zbocza zegara między S4 a S5 wynosi T47 = 10 ns. Ostatecznie, deaktywowabnie sygnału -DTACK musi nastąpić w czasie 2,5 ∙ Tc (S7, S0..4) – T47 – T12,max= 2,5 ∙ Tc   60 ns, a przestawienie linii danych w stan wysokiej impedancji w czasie 1,5 ∙ Tc (S7,S0..1) + T55,min  – T12,max = Tc – 30 ns od zbocza powodującego zgłoszenie żądania DMA. Czas wykonania transferu DMA zależy od wielu czynników i nie jest specyfikowany w dokumentacji mikrokontrolera. Należało więc przeprowadzić odpowiednie pomiary w takiej konfiguracji w jakiej miał działać SDC_One.

Pomiary przeprowadzono przy użyciu mikrokontrolera używanego ostatecznie w projekcie tj. STM32L476 pracującego z częstotliwością 80 MHz. Zaprogramowano jeden z timerów mikrokontrolera na generowanie przebiegu PWM o określonej częstotliwości. Przebieg ten podano na wejście innego timera, który zaprogramowano do pracy w trybie capture i zgłaszania dwóch żądań transferów DMA o różnych priorytetach, które zmieniały stan dwóch wyprowadzeń odwzorowując na nich przebieg PWM. Wyniki pomiarów przedstawiono na poniższym rysunku.

Rys. 9. Wyniki pomiarów opóźnienia wprowadzanego przez timer i DMA

Czas wykonania transferu o wyższym priorytecie wynosił 141 ns, a transferu o niższym priorytecie – 172 ns. Uwzględniając te wyniki można obliczyć maksymalne częstotliwości pracy procesorów. Dla procesora Z80 z zależności Tc – 85 ns >= 141 ns i 2 ∙ Tc   155 ns >= 172,5 ns otrzymujemy Tc >= 226 ns. Maksymalna częstotliwość pracy wynosi więc 4,4 MHz i jest większa od minimalnej częstotliwości pracy procesora specyfikowanej w dokumentacji, która wynosi 0,25 MHz. Dla procesora MC68008 z zależności Tc – 30 ns >= 141 ns i 2,5 ∙ Tc   60 ns >= 172,5 ns otrzymujemy Tc >= 171 ns. Maksymalna częstotliwość pracy wynosi więc 5,8 MHz i jest większa od minimalnej częstotliwości pracy procesora specyfikowanej w dokumentacji, która wynosi 2 MHz.

Julia Kosowska

Grzegorz Mazur

Autor: STM32eu

STM32eu