EDVAC

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj
Edvac.jpg

EDVAC (ang. Electronic Discrete Variable Automatic Computer) – maszyna zbudowana według projektu J. Prespera Eckerta, J.W. Mauchly'ego i Johna von Neumanna, oddana w kwietniu 1949, działająca od stycznia 1952 do końca 1962[1]. Projekt komputera zaczął powstawać już w roku 1944, w trakcie prac nad jego poprzednikiem, ENIAC-iem. Do usprawnień należy zaliczyć przechowywanie programu w pamięci, binarne kodowanie liczb oraz rtęciową pamięć operacyjną.

EDVAC został zbudowany dla Army Ordnance Department przez Moore School of Electrical Engineering przy Uniwersytecie Pensylwanii i zainstalowany w Ballistic Research Laboratory, Aberdeen Proving Ground kosztem $467,000. Komputer był taktowany zegarem 1MHz i zużywał 56 kilowatów mocy. W roku 1949 składał się z 3000 lamp elektronowych i 8000 diod, do roku 1961 liczby te wzrosły do 5937 i 12000.[1]:30


Architektura[edytuj | edytuj kod]

EDVAC był binarnym komputerem szeregowym o 44-bitowym słowie wyrównanym do 48 cykli. Pamięć operacyjna miała rozmiar 1024 słów. Bity były kodowane jako puls, oznaczający jedynkę, oraz brak pulsu, czyli zero. Pulsy następowały co 1 mikrosekundę i trwały około 0.3μs. Wykrycie braku pulsu było możliwe dzięki sygnałowi zegarowemu[2]:1.1.

Transmisja jednego słowa trwała 48 μs, okres nazywany małym cyklem (minor cycle). Pamięć operacyjna składała się z rtęciowych linii opóźniających ze wzmacniaczami regenerującymi pulsy. Linie, określane jako długie zbiorniki (long tank), mieściły po 8 słów. Długi zbiornik miał więc długość 384 μs, tzw. duży cykl (major cycle). Wykonanie dużego cyklu trwało 8 małych cykli.

Słowa kodujące liczby zaczynały się od znaku (puls oznaczał minus), po którym następował najmniej znaczący bit, następnie kolejne bity, aż do najstarszego, a na końcu 4 zera dopełniające do 48. Wystąpienie na ostatnich czterech pozycjach pulsu było traktowane jako błąd i powodowało zatrzymanie maszyny. Kodowanie liczb przypomina znak-moduł, z dokładnością do pozycji bitu znaku. Tak zapisana liczba była interpretowana jako ułamek z przedziału (-1, 1) zapisany stałopozycyjnie. Mnożenie i dzielenie były zaprojektowane tak, aby wspierać tę interpretację.[2]:1.2

Rozkazy również zajmowały jedno słowo. Pierwsze 4 bity kodowały rozkaz, a pozostałe 40 – cztery adresy w pamięci operacyjnej. 10 bitów wystarczało do zaadresowania wszystkich 1024 komórek pamięci. W przypadku operacji arytmetycznych dwa adresy wskazywały operandy, trzeci miejsce zapisania wyniku, a czwarty następną instrukcję. Trzymanie adresu następnej instrukcji miało pozwalać na optymalizację dostępów do pamięci; opóźnienie odczytu z długich zbiorników można było przewidzieć i tak rozmieścić dane i kod w pamięci, aby zminimalizować opóźnienie.[1]:27

Główne komponenty[edytuj | edytuj kod]

Zegar[edytuj | edytuj kod]

Ta jednostka zawierała generator głównego pulsu zegarowego. Poza nim wyprowadzone było również 48 sygnałów zapalających się jeden po drugim w kolejnych taktach małego cyklu.[2]:1.3

Dyspozytor[edytuj | edytuj kod]

Dyspozytor (dispatcher) dekodował instrukcje i generował sygnały sterujące pracą pozostałych jednostek. Zawierał cykliczny rejestr o pojemności jednego małego cyklu, w którym trzymał aktualnie wykonywany rozkaz. Posiadał również układ realizujący przesunięcia i konwertujący sygnały asynchroniczne na synchroniczne, co było konieczne przy wczytywaniu danych z zewnątrz.[2]:1.3

Rachmistrz[edytuj | edytuj kod]

Odpowiednik dzisiejszej jednostki arytmetyczno-logicznej. Wykonywał operacje dodawania, odejmowania, mnożenia i dzielenia. Miał dwie kopie obwodów liczących; rozbieżność wyników między nimi powodowała zatrzymanie maszyny.[2]:1.3

Pamięć[edytuj | edytuj kod]

Pamięć operacyjna była zorganizowana w dwa identyczne banki, lewy i prawy, zbudowane z 64 linii opóźniających każdy, umieszczonych w obudowach utrzymujących temperaturę 50°C. Pojedynczy bank mieścił 512 słów i umożliwiał pracę komputera nawet w przypadku awarii drugiego banku. Poza długimi zbiornikami, każdy bank zawierał też trzy krótkie zbiorniki wykorzystywane przez Rachmistrza, oraz część obwodów Dyspozytora odpowiedzialną za wybór wskazanej pozycji w pamięci. Fizycznie banki znajdowały się na przeciwległych krańcach maszyny.[2]:1.4

Czytnik i Rekorder[edytuj | edytuj kod]

Układ do odbierania i wysyłania danych na urządzenia zewnętrzne. Początkowo nośnikiem miał być przewód magnetyczny [1], ale ta technologia okazała się zawodna i została do roku 1952 zastąpiona przez taśmę dziurkowaną od IBM. W 1954 została jeszcze dodana pamięć bębnowa. Obie zmiany nastąpiły długo po zbudowaniu komputera, kiedy zmiany były trudne do wprowadzenia, co uczyniło rozwiązania do obsługi taśm i bębna ułomnymi i mało wydajnymi.[1]:31-32

Panel Kontrolny[edytuj | edytuj kod]

Służył do obsługi komputera przez człowieka. Znajdowały się na nim przyciski do włączania zasilania, uruchamiania, przerywania i wznawiania obliczeń, jak również przełączniki do ręcznego wprowadzania danych, ustawiania adresu pierwszej instrukcji i trybu pracy. Panel pozwalał na podgląd i zmianę zawartości dowolnej komórki pamięci, a także na zaglądanie do rejestrów Dyspozytora i Rachmistrza. Do wyświetlania danych służył oscyloskop oraz lampy neonowe.[2]:1.4

Zestaw instrukcji[edytuj | edytuj kod]

Schemat kodowania instrukcji przedstawiony jest w tabeli. Bity są numerowane w kolejności pojawiania się na kablu, czas płynie w lewo.

44 ... 35 34 ... 25 24 ... 15 14 ... 5 4 ... 1
A1 A2 A3 A4 typ operacji

Spośród 16 numerów operacji możliwych do zapisania na 4 bitach wykorzystywane było 11, pozostałe były równoważne z instrukcją stopu. Wykonanie odbywało się w czterech etapach, z których każdy mógł trwać wiele małych cykli. W większości instrukcji A4 stanowił adres następnej instrukcji, automatycznie ładowanej do Dyspozytora w ostatnim etapie wykonania rozkazu.[2]:1.5-1.6

Poniższy opis jest oparty na raporcie z roku 1949 i nie zawiera późniejszych zmian, które m.in. zastąpiły instrukcję obsługującą przewód magnetyczny trzema rozkazami do czytania i pisania z taśmy dziurkowanej oraz Panelu Kontrolnego.[1]:28

Przerwij[edytuj | edytuj kod]

Zatrzymuje obliczenia i sygnalizuje to na Panelu Kontrolnym. Zasilanie pozostaje włączone, a maszyna jest gotowa do wznowienia działania. Naciśnięcie przycisku rozpoczęcia obliczeń powoduje załadowanie rozkazu spod A4 i kontynuację działania. Adresy A1, A2 i A3 są ignorowane.[2]:1.7

Dodaj[edytuj | edytuj kod]

Składniki pod adresami A1 i A2, suma zapisywana pod A3. Przekroczenie zakresu może zostać zignorowane albo spowodować zatrzymanie programu, w zależności od stanu przełączników na Panelu Kontrolnym.[2]:1.7

Odejmij[edytuj | edytuj kod]

Odjemna pod adresem A1, odjemnik pod A2, różnica zapisywana pod A3. Obsługa przekroczenia zakresu jak w dodawaniu.[2]:1.7

Porównaj[edytuj | edytuj kod]

Jeśli liczba zapisana pod adresem A1 jest mniejsza od liczby spod A2, to następna instrukcja jest ładowana z adresu A3, w przeciwnym wypadku z A4.[2]:1.8

Pomnóż z zaokrągleniem[edytuj | edytuj kod]

Czynniki pod A1 i A2, znak i najwyższe 43 z 86 bitów iloczynu zapisywane pod A3. Ta operacja nigdy nie przekracza zakresu. Jeśli zinterpretujemy czynniki jako ułamki z zakresu (-1, 1), to wynik będzie ich iloczynem (zaokrąglonym), również z zakresu (-1, 1).[2]:1.8

Pomnóż dokładnie[edytuj | edytuj kod]

Czynniki pod A1 i A2. Starsze 43 z 86 bitów wyniku zapisywane pod A3, bez zaokrąglania, a młodsze 43 pod (A3 + 1) mod 1024. Znak wyniku jest zapisywany w obu komórkach pamięci.[2]:1.8-1.9

Podziel z zaokrągleniem[edytuj | edytuj kod]

Dzielna pod A1, dzielnik pod A2, znak i pierwsze 43 bity ilorazu (ostatni zaokrąglony) zapisywane pod A3. Jeśli wartość bezwzględna ilorazu jest większa lub równa 1, wynikiem jest ciąg jedynek z poprawnym znakiem. W takim wypadku program może być zatrzymany, chyba że w Panelu Kontrolnym jest ustawiony przełącznik ignorowania błędów przepełnienia.[2]:1.9

Podziel dokładnie[edytuj | edytuj kod]

Dzielna pod A1, dzielnik pod A2, znak i pierwszej 43 bity ilorazu (bez zaokrąglenia) zapisywane w A3, reszta z dzielenia (ze znakiem dzielnej) zapisywana w (A3 + 1) mod 1024.[2]:1.9

Przenieś[edytuj | edytuj kod]

Pozwala przesunąć bity słowa zapisanego pod A1 i nadpisać nimi część słowa spod A3. A2 nie jest w tym rozkazie adresem w pamięci, lecz koduje przesunięcie i nadpisywany region słowa A3.[2]:1.10 Trzy najmłodsze bity A2 wybierają jeden z 8 opisanych niżej wariantów instrukcji, kolejne 6 wartość przesunięcia (zapisanego w bazie 16 16 8 4 2 1), a najstarszy bit ustala kierunek przesunięcia.[2]:2.47 Przesunięcie w lewo odpowiada opóźnieniu bitów słowa w czasie (i pomnożeniu liczby przez naturalną potęgę dwójki), a przesunięcie w prawo - przyspieszeniu. Wystąpienie pulsu na ostatniej pozycji A2 sygnalizuje przesunięcie w prawo. Znak słowa zapisanego pod adresem A1 nie podlega przesunięciu w 7 z 8 wariantów, zamiast niego przesuwane jest 0. Bity przesunięte poza zakres [1, 44] są gubione.[2]:2.41-2.42

Warianty 1-4[edytuj | edytuj kod]

Nadpisują region A1, A2, A3 lub A4 w obrębie słowa pod adresem A3 bitami z odpowiadających pozycji w przesuniętym słowie spod A1. Programista musi zadbać, żeby dane do zapisu były na wysokości docelowego regionu.[2]:2.43

Wariant 5[edytuj | edytuj kod]

Zastępuje bit znaku słowa A3 najmłodszym bitem przesuniętego słowa A1. Nie jest to bit znaku słowa A1, w szczególności przesunięcie o zero powoduje wyzerowaniu bitu znaku A3.[2]:2.44

Wariant 6[edytuj | edytuj kod]

Kopiuje wszystkie przesunięte bity słowa A1 poza znakiem; słowo A3 zachowuje swój oryginalny znak.[2]:2.42

Wariant 7[edytuj | edytuj kod]

Kopiuje wszystkie przesunięte bity słowa A1 oraz znak. Znak nie ulega przesunięciu, jest tylko przepisywany. Całe słowo A3 zostaje utracone; ten wariant realizuje klasyczne przesunięcie arytmetyczne.[2]:2.44

Wariant 0[edytuj | edytuj kod]

Przesuwa tylko bit znaku słowa A1, ignorując jego resztę, i nadpisuje nim bit słowa A3 na pozycji, do której nastąpiło przesunięcie. To pozwala ustawić bądź wyzerować dowolny bit słowa A3, nie zmieniając pozostałych.[2]:2.44-2.45

Załaduj[edytuj | edytuj kod]

Ten rozkaz miał służyć do kopiowania danych między pamięcią operacyjną a zewnętrznym nośnikiem, a także do czytania z przełączników Panelu Kontrolnego i pisania na jego lampy neonowe. A2 koduje jedną z 23 operacji wejścia-wyjścia, natomiast A1 i A3 oznaczają początek i koniec obustronnie domkniętego zakresu adresów w pamięci, na których operuje instrukcja. A2 koduje następujące opcje:[2]:1.10-1.14

  • wybór urządzenia od 0 do 3, gdzie 0 to Panel Kontrolny, a pozostałe to taśmy
  • kierunek przewijania taśmy
  • zapis, odczyt lub przewijanie
  • specjalny tryb czytania adresów z taśmy

Ostatnia opcja pozwalała wczytywać dane do dowolnych adresów pamięci. Na taśmie musiały być na przemian 10-bitowe adresy i 44-bitowe dane. Operację kończyło napotkanie na taśmie adresu równego A3.

Wyświetl[edytuj | edytuj kod]

Projekt przewidywał instrukcję sterującą w czasie rzeczywistym kropką oscyloskopu. Słowa pod adresami A1 i A2 miały zawierać współrzędne X i Y, a dwa najmłodsze bity A3 numer wyświetlacza (1, 2 lub 3). Docelowo zrezygnowano jednak z tego rozkazu.[1]:28


Tryby pracy[edytuj | edytuj kod]

Panel Kontrolny pozwalał na pracę w trybie normalnym lub specjalnym. Tryb specjalny pobierał rozkazy z Przełączników Rozkazu Specjalnego i służył do ręcznego uruchomienia programu. Tryb normalny pobierał rozkazy z pamięci i mógł działać na różne sposoby:[2]:1.15

  • automatycznie, aż adres pobranej instrukcji będzie równy adresowi końcowemu ustawionemu na przełącznikach
  • krokowo, wykonując jedną instrukcję po każdym wciśnięciu przycisku rozpoczęcia obliczeń
  • krokowo, wykonując jeden etap instrukcji (każda instrukcja miała 4 etapy)
  • krokowo, przez jeden mały cykl

Przypisy

  1. a b c d e f Michael Williams. The origins, uses, and fate of the EDVAC. „Annals of the History of Computing”. 15 (1), 1993. IEEE. 
  2. a b c d e f g h i j k l m n o p q r s t u v w x y z S.E. Gluck, W.H. Boghosian: A functional description of the Edvac. Philadelphia: Moore School of Electrical Engineering. [dostęp 10.02.2015].

Linki zewnętrzne[edytuj | edytuj kod]