[1] SDC One = Software Defined Computer na STM32

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

Rozpoczynamy serię artykułów opisujących współczesną konstrukcję komputera z klasycznym mikroprocesorem z okresu początków techniki mikroprocesorowej. Projekt ten powstał z kilku powodów; ma on zastosowanie dydaktyczne, może też zostać potraktowany hobbystycznie. Przede wszystkim jednak stanowi on ciekawą konstrukcję harmonijnie łączącą mikroprocesorową technologię sprzed kilkudziesięciu lat z technologią współczesną. Publikację tę dedykujemy szczególnie nienajmłodszym entuzjastom techniki mikroprocesorowej, którzy niegdyś, w epoce ZX-Spectrum i Apple II, rozpoczęli budowę własnego, wymarzonego 8-bitowego mikrokomputera i być może nigdy jej nie ukończyli, a wciąż marzą o użyciu w prawdziwym projekcie schowanego gdzieś na dnie pudła z elementami mikroprocesora.

Pierwotnie celem projektu było stworzenie prostego, taniego, łatwego w budowie i przystającego do współczesnej technologii komputerowej mikrokomputera z klasycznym 8 bitowym mikroprocesorem. W trakcie realizacji projektu okazało się, że stosunkowo niewielkim nakładem pracy i bez dodatkowych nakładów finansowych możemy uzyskać pełnowartościowy komputer działający z typowym dla swej epoki oprogramowaniem systemowym i użytkowym.
Najistotniejszymi cechami projektu miały być i są jego prostota i niska cena, przekładające się również na czas potrzebny na wykonanie komputera. Cel ten udało się osiągnąć: montaż komputera zajmuje mniej niż godzinę, a jego koszt nie przekracza 100 zł.

 

Koncepcja i zarys projektu

Moc obliczeniowa współczesnych układów mikroprocesorowych umożliwia wykonywanie przez nie zadań, które kiedyś wymagały użycia specjalizowanych układów elektronicznych. Układy mikroprocesorowe pełnią na przykład rolę modulatorów i demodulatorów w urządzeniach radiowych, dzięki czemu w jednym urządzeniu możemy łatwo zrealizować wiele schematów modulacji lub demodulacji; rozwiązanie takie nazywa się radiem zdefiniowanym programowo. Nasz projekt miał na celu programową realizację funkcji układów tworzących komputer, więc nazwaliśmy go komputerem zdefiniowanym programowo.

 

Założenia projektowe

Przystępując do opracowywania konstrukcji założyliśmy następujące jej cechy:

• Użycie rzeczywistego, tradycyjnego mikroprocesora 8- lub 16-bitowego.

• Realizacja sprzętowego monitora szyny, umożliwiającego ładowanie programów, odczyt i edycję pamięci i portów wejścia-wyjścia, pracę krokową procesora na poziomie cykli transmisji na szynie, zbieranie śladu wykonania programu i pułapkowanie.

• Współpraca z komputerem PC przez interfejs USB, z możliwością komunikacji przez terminal z oprogramowaniem działającym na mikroprocesorze oraz ładowania oprogramowania i monitorowania pracy procesora poprzez drugi terminal, zapewniający interfejs dla monitora szyny.

• Zasilanie z interfejsu USB komputera PC.

• Wyposażenie komputera w pamięć i podstawowy zestaw urządzeń wejścia wyjścia, w tym konsolę/terminal, przycisk, diody LED, timer i urządzenia pamięci masowej o funkcjonalności dysków.

• Jak najmniejsze wymiary, minimalizacja liczby i kosztów elementów, a tym samym również czasu potrzebnego na montaż.

Najciekawszą część projektu stanowiła minimalistyczna realizacja stosunkowo skomplikowanej części sprzętowej – otoczenia mikroprocesora. Przyjęto, że cały komputer poza samym procesorem zostanie zrealizowany przy użyciu jednego układu scalonego. Typowymi układami do takich zastosowań są programowalne układy logiczne FPGA; są one jednak dosyć kosztowne, a projektowanie ich zawartości wykracza daleko poza możliwości przeciętnego entuzjasty techniki cyfrowej. Nasz projekt miał mieć walory dydaktyczne i miał on służyć popularyzacji techniki mikroprocesorowej, dlatego podjęliśmy, zakończoną sukcesem, próbę realizacji logiki komputera przy użyciu mikrokontrolera. Dzięki takiemu podejściu cała funkcjonalność układów otaczających procesor w komputerze została zrealizowana przez oprogramowanie mikrokontrolera, korzystające z jego zasobów sprzętowych – pamięci i peryferiali.

Komputer SDC_One (Software-Defined Computer), który stanowi pierwszy efekt tych prac zawiera tylko dwa układy scalone – mikroprocesor docelowy oraz mikrokontroler rodziny STM32.
W tekście dotychczas nie padła nazwa typu mikroprocesora. Stało się tak dlatego, że SDC_One był od początku projektowany z myślą o zastosowaniu w nim niemal dowolnie wybranego mikroprocesora z 8-bitową szyną danych, produkowanego w latach 70-tych lub 80-tych XX wieku. Niemal równocześnie powstały więc cztery modele SDC_One, w których użyto mikroprocesorów:

• Zilog Z80 CPU,

• Motorola MC68008,

• Intel 8085,

• WDC65C02.

Cztery wymienione modele procesorów stanowią reprezentatywny przekrój różnych podejść do budowy wewnętrznej procesora i jego komunikacji z otoczeniem poprzez szynę zewnętrzną.
Przystępując do projektu postawiliśmy pytanie: czy jest możliwa realizacja różnych protokołów szyn zewnętrznych procesorów przy użyciu sprzętu i oprogramowania współczesnego mikrokontrolera o przeciętnej wydajności, umożliwiająca działanie klasycznego mikroprocesora z wydajnością zbliżoną do maksymalnej? Odpowiedź na to pytanie okazała się być twierdząca.

Problemy projektowe

Rozpoczynając projektowanie SDC_One zidentyfikowaliśmy dwa podstawowe problemy, których rozwiązanie było kluczowe dla konstrukcji urządzenia zgodnie z założeniami. Pierwszym z nich było zapewnienie poprawnej realizacji protokołu szyny mikroprocesora przez mikrokontroler. W naszym projekcie zasoby sprzętowe i oprogramowanie mikrokontrolera miały pełnić funkcję, którą w typowych mikrokomputerach pełniły układy logiczne, których czasy propagacji wynoszą od kilku do kilkudziesięciu nanosekund. Narzucało to bardzo ostre wymagania na czasy realizacji poszczególnych faz protokołu szyny przez sprzęt i oprogramowanie mikrokontrolera; możliwość spełnienia tych wymagań przez mikrokontroler nie była oczywista.
Drugim problemem było zapewnienie zgodności elektrycznej pomiędzy mikroprocesorem i mikrokontrolerem, w przypadku, gdy mikroprocesor jest zasilany napięciem 5 V. Niemal wszystkie współczesne mikrokontrolery o wydajności umożliwiającej realizację projektu są zasilanie napięciem 3.3 V, więc zapewnienie połączenia sygnałów jedno- i dwukierunkowych gwarantującego poprawną współpracę obu układów wymaga analizy i dopasowania poszczególnych sygnałów na poziomie elektrycznym.

Wybór mikrokontrolera

W projekcie SDC_One chcieliśmy użyć łatwo dostępnego i niedrogiego mikrokontrolera o wydajności i zasobach wystarczających do realizacji komputera o funkcjonalności zbliżonej do konstrukcji komputerów 8-bitowych z lat 1980-tych. Ze względu na dostępność i dostępne wsparcie projektowe zdecydowaliśmy się na użycie układów rodziny STM32. W celu uproszczenia konstrukcji komputera chcieliśmy użyć gotowej płytki uruchomieniowej serii Nucleo. Najprostszym modułem tej serii umożliwiającym realizację SDC_One okazała się być płytka NUCLEO-L476RG, wyposażona w mikrokontroler STM32L476. Pierwsze doświadczenia przeprowadziliśmy przy użyciu płytek zawierających mikrokontrolery serii STM32F7 i STM32F4. W porównaniu z serią STM32L4 mają one wyższą wydajność, jednak do budowy naszego komputera niezbędne byłoby w takim przypadku użycie większych i droższych płytek serii Nucleo-144. Płytka z L476 należy do ekonomicznej i bardziej rozpowszechnionej serii Nucleo-64, o mniejszych rozmiarach. Wymagania dotyczące mikrokontrolera wynikają głównie z możliwości realizacji sprzętowej wybranych aspektów protokołu szyny mikroprocesora przy użyciu peryferiali mikrokontrolera, co opisujemy w dalszej części tekstu. Istotna jest również dostępność w mikrokontrolerze niezbędnych peryferiali i pamięci dla komputera docelowego.

Ważnymi dla realizacji projektu SDC_One cechami mikrokontrolera STM32L476 są:

• peryferial USB o dużej liczbie punktów końcowych (8 par IN+OUT),

• pamięć RAM o pojemności 128 KiB,

• moduł DMA współpracujący z portami GPIO mikrokontrolera (w seriach F4 i F7 istnieją tu poważne ograniczenia),

Zgodność elektryczna mikroprocesora i mikrokontrolera

Problem zgodności elektrycznej mikroprocesora z mikrokontrolerem występuje wtedy, gdy oba układy zasilane są różnymi napięciami – może wtedy zachodzić potrzeba elektrycznego dopasowania ich wejść i wyjść. Mikrokontroler zastosowany w SDC_One jest zasilany napięciem 3.3 V, więc problem dopasowania elektrycznego będzie zachodził w przypadku, gdy mikroprocesor wymaga zasilania 5V.
Warto zauważyć, że niektóre modele klasycznych mikroprocesorów, zwłaszcza ich nieco bardziej współczesne wersje, są specyfikowane przez producenta również do pracy z zasilaniem 3.3 V. Są to np. WDC W65C02S i OKI MSM80C85AH. Również wersja Z80CPU wykonana w technologii CMOS (Z84C00xx), pomimo że jest oficjalnie specyfikowana tylko na 5 V, działa poprawnie również przy zasilaniu 3.3 V.

Jeżeli jednak chcemy zbudować komputer z mikroprocesorem zasilanym napięciem 5 V, musimy zadbać o jego poprawną współpracę z mikrokontrolerem pomimo różnicy napięć zasilających oba układy.

Przy łączeniu mikroprocesora z mikrokontrolerem mamy do czynienia z kilkoma różnymi przypadkami połączeń. Problem zgodności poziomów logicznych przy różnym zasilaniu układów nie występuje w dwóch przypadkach:

• współpracy wyjścia μC z wejściem mikroprocesora zgodnym ze standardem TTL,

• współpracy wejścia uC typu FT (five-volt tolerant) z wyjściem mikroprocesora.

W obu tych przypadkach możemy bezpośrednio połączyć wyprowadzenia układów zasilanych różnymi napięciami.

W zależności od typu mikrokontrolera i mikroprocesora, możemy mieć do czynienia z trzema innymi przypadkami, wymagającymi wprowadzenia dodatkowych elementów.

Najprostszy z nich – to sterowanie z wyjścia mikroprocesora wejścia μC typu TT (3-woltowego) z dozwolonym niezerowym natężeniem prądu wstrzykiwania. W takim przypadku wystarczy wprowadzić pomiędzy wyjście μP i wejście μC rezystor szeregowy o rezystancji pojedynczych kΩ.

Drugi przypadek – to sterowanie z wyjścia μP wejścia μC typu TT bez możliwości wstrzykiwania prądu. Można tu użyć jednego z następujących rozwiązań:

• rezystor szeregowy po stronie μP i dioda Schottky pomiędzy wejściem uC i zasilaniem 3.3 V;

• symulacja wyjścia typu „otwarty dren” – dioda Schottky podłączona katodą do wyjścia μP i anodą do wejścia μC, rezystor pomiędzy wejściem μC i zasilaniem 3.3 V;

• dzielnik rezystorowy na wyjściu μP.

Pozostaje jeszcze problem sterowania z wyjścia mikrokontrolera wejścia mikroprocesora wymagającego w stanie wysokim napięcia powyżej 3.3V. Wymaganie takie często dotyczy wejść sygnału zegarowego mikroprocesorów, np. Z80CPU lub MC6800. Można w tym przypadku zastosować bufor – translator poziomów. Doświadczenia wykazały, że przy częstotliwościach nie przekraczających kilku MHz można wysterować takie wejście mikroprocesora w dużo prostszy sposób: wystarczy użyć wyjścia mikrokontrolera tolerującego napięcie 5V, skonfigurować je jako wyjście z otwartym drenem i połączyć przez rezystor ok. 1.5 kΩ z zasilaniem 5V. W ten sposób napięcie na wejściu mikroprocesora w stanie wysokim będzie bliskie 5V.

Jedynym z analizowanych przypadków, w którym niezbędne byłoby wprowadzenie układu aktywnego translatora poziomów logicznych, jest współpraca z mikrokontrolerem dwukierunkowej szyny mikroprocesora wymagającej napięć wejściowych spoza minimalnego zakresu standardu TTL. Przypadek ten dotyczy tylko najstarszych mikroprocesorów 8-bitowych, np. serii 8080.

Zasady realizacji protokołu szyny mikroprocesora

Określenie sposobu realizacji protokołu szyny wybranego mikroprocesora przez mikrokontroler należy zacząć od analizy opisu protokołu szyny zawartego w dokumentacji mikroprocesora – wykresów czasowych i wartości czasów charakterystycznych, pod kątem identyfikacji krytycznych fragmentów protokołu szyny, wymagających reakcji układów zewnętrznych bez przekroczenia wymaganego maksymalnego czasu.
W zwykłym komputerze układy otaczające procesor reagują sprzętowo na sygnały sterujące wystawiane przez procesor i na ich podstawie realizują cykle transmisji, zapisując lub odczytując dane. W komputerze zdefiniowanym programowo czynności te wykonuje oprogramowanie mikrokontrolera.

W większości typów mikroprocesorów czas trwania cyklu transmisji danych, zależny od częstotliwości przebiegu zegarowego procesora, może zostać wydłużony poprzez podanie z zewnątrz sygnału niegotowości, więc czas wykonania samego odczytu lub zapisu danych przez mikrokontroler nie jest krytyczny. Nie ma natomiast możliwości spowolnienia sekwencji akcji rozpoczynających i kończących cykl transmisji – mikrokontroler musi zapewnić zmiany stanu linii łączących go z mikroprocesorem w określonym w dokumentacji procesora reżimie czasowym. Wymagane w tym przypadku czasy reakcji na zmiany stanu sygnałów sterujących szyną nie przekraczają 200 ns, co wyklucza sterowanie stanem sygnałów wychodzących z mikrokontrolera na drodze programowej (np. przez procedury obsługi przerwań) i narzuca konieczność reakcji sprzętowej przy użyciu peryferiali mikrokontrolera.

W zależności od typu mikroprocesora, szybka reakcja sprzętowa może być niezbędna w następujących przypadkach:

• wyłączenie sterowania szyny danych po zakończeniu cyklu odczytu danych przez procesor,

• uaktywnienie sygnału niegotowości (żądania wydłużenia cyklu transmisji przez procesor) w czasie gwarantującym poprawne wydłużenie cyklu,

• w przypadku mikroprocesorów z multipleksowaną szyną adresu/danych – odczytanie z szyny adresu w czasie, gdy jest on dostępny.

Ogólną zasadą w realizacji SDC_One jest to, że sygnał żądania wydłużenia cyklu transmisji (dla Z80 CPU jest to sygnał -WAIT) jest aktywny przez większość czasu. Jest on deaktywowany wtedy, gdy mikrokontroler jest gotowy do zakończenia cyklu transmisji i powtórnie aktywowany zaraz po wykryciu zakończenia cyklu przez mikroprocesor. Krytyczne dla działania komputera jest odpowiednio szybkie aktywowanie tego sygnału.

Szczegóły realizacji protokołu szyny dla poszczególnych typów procesorów opisano w dalszej części tekstu.

Konstrukcja i schemat

Dla ułatwienia budowy SDC_One zastosowano konstrukcję złożoną z dwóch płytek. Pierwszą z nich jest gotowa płytka Nucleo, produkowana przez ST Microelectronics i zawierająca mikrokontroler, interfejs debugowania, przycisk, diodę LED i złącza wyprowadzające wszystkie linie portów mikrokontrolera.

Druga płytka, własnej konstrukcji, jest nakładana na złącza płytki Nucleo; zawiera ona mikroprocesor i niezbędne elementy SDC_One niezawarte na płytce Nucleo. Dla każdego typu mikroprocesora należało zaprojektować inną płytkę, ze względu na odmienne zestawy sygnałów i ich rozmieszczenie w obudowach mikroprocesorów. Wymiary płytki procesora są mniejsze od wymiarów płytki Nucleo.

Fot. 1. SDC_One z procesorem Zilog Z80 CPU

Są również możliwe inne realizacje komputera. Można zaprojektować własną płytkę zawierającą mikroprocesor i mikrokontroler. Można również dla mikroprocesora użyć płatki stykowej, łącząc go z mikrokontrolerem przy użyciu przewodów wsuwanych w złącza płytki Nucleo. Taka realizacja nie wymaga wykonania własnej płytki drukowanej, musimy jednak dodatkowo wyprowadzić interfejs USB mikrokontrolera. W takim przypadku możemy zamiast Nucleo-64 użyć płytki serii Nucleo-144, która zawiera złącze USB połączone z mikrokontrolerem STM32.

Schemat SDC_One jest bardzo prosty. Wszystkie istotne sygnały mikroprocesora są połączone wyłącznie z portami mikrokontrolera. Szyna adresowa i danych mikrokontrolera jest dołączona do kolejnych linii portów GPIO w celu ułatwienia odczytu stanu szyn przez oprogramowanie mikrokontrolera. Przy określaniu połączeń sygnałów sterujących wzięto pod uwagę wymagania zapewnienia zgodności elektrycznej oraz współpracy z peryferialami mikrokontrolera. Sygnał zegarowy procesora jest generowany przez wyjście timera. Sygnały wyjściowe procesora, których zmiany stanu wymagają reakcji sprzętowej, są dołączone do wejść timerów mikrokontrolera. Na tych liniach, na których jest to niezbędne, zastosowano elementy dopasowujące opisane powyżej.

Schematy płytek dla poszczególnych typów mikroprocesorów zostaną zaprezentowane wraz z opisami odpowiednich realizacji SDC_One. Na rysunku 2 przedstawiono schemat ideowy połączeń przykładowej wersji SDC_One bez uwzględnienia dopasowania elektrycznego sygnałów.

Rys. 2. Schemat ideowy SDC_One z mikroprocesorem Z80 CPU zasilanym napięciem 3,3V

 

Płytka procesora jest ponadto wyposażona w gniazdo USB Mini-B oraz trójkolorową diodę LED, połączone z wyprowadzeniami mikrokontrolera.
Julia Kosowska

Grzegorz Mazur