Home Beschleuniger MightyMic CyReL CaTTamaran TT030 Accelerator
 

10.3 Mach 16


Die Maxon-Coprozessor-Cache-Erweiterung MACH 16


Der ST auf 16 MHz
Die Maxon-Coprozessor-Cache-Erweiterung MACH 16

Jeder hat sich wahrscheinlich schon einmal (zweimal, dreimal..) gewünscht, seinem ST mehr Dampf machen zu können. Jetzt gibt es mit der MAXON-Coprozessor-Cache-Erweiterung (MACH16) für jeden Bastler die Möglichkeit, sich diesen Wunsch zu erfüllen (für handwerklich nicht so Versierte ist natürlich auch ein Fertiggerät erhältlich).




Der Prototyp der MACH 16



Das Konzept

Der erste Gedanke zur Beschleunigung des ST ist natürlich, die Taktfrequenz des Prozessors zu erhöhen. Der MC68000 wird mit 16 MHz statt mit 8MHz getaktet. Damit wird die Rechenleistung aber noch lange nicht verdoppelt, da der Prozessor sich immer noch mit langsamen Buszugriffen abquälen muss. Deshalb sind zusätzlich auf der Karte noch 16 kBytes schnelles Cache-RAM vorhanden, das als Direct-Mapped-Cache (das Fremdwort wird unten erklärt) organisiert ist. Darauf kann der Prozessor mit voller Geschwindigkeit zugreifen, wodurch der ST bis doppelt so schnell läuft. Für besonders kritische Programme (Zeitschleifen!) kann der Cache-Speicher natürlich auch abgeschaltet werden. Wer es gern noch schneller hätte, kann zusätzlich noch den numerischen Coprozessor M68881 bestücken. Dieser wird auch mit 16 MHz betrieben und vervielfacht noch einmal die Rechenleistung bei Fliesskommaoperationen. Die Einbindung des M68881 in den ST ist kompatibel zu der ATARI-Koprozessorerweiterung, so Der Prototyp der MACH16 dass alle Programmpakete mit Coprozessorunterstützung (z.B. Turbo-C) funktionieren. Bevor nun aber genauer auf die Schaltung eingegangen wird, möchte ich an dieser Stelle die von mir verwendete Beschreibung von Logikpegeln erläutern. Es werden nur die Bezeichnungen 'aktiv' und 'inaktiv' bzw. 'nicht aktiv' verwendet. Dies geschieht, um Verwirrungen bei Active-Low- und Active-High-Signalen zu vermeiden. Alle verwendeten Signalbezeichnungen beziehen sich auf den Schaltplan. Active-Low-Signale werden durch ein vorangestelltes T gekennzeichnet. Zur Verdeutlichung: ein aktives Active-High-Signal hat den Logikpegel 1, ein aktives Active-Low-Signal den Logikpegel 0.


Das Cache-Prinzip

Wie oben schon erwähnt, wird ein mit 16 MHz getakteter Prozessor durch die langsame Peripherie stark gebremst. Um dem Prozessor nun aber Daten (natürlich auch Befehle) schnell zugänglich zu machen, befinden sich auf der Platine 16 kBytes schnelles RAM (8 k * 16 Bit), in dem Kopien des Hauptspeichers (RAM und ROM) gehalten werden. Will nun der Prozessor aus dem Hauptspeicher lesen, wird zuerst überprüft, ob sich schon eine Kopie des zu lesenden Speichers im Cache befindet. Ist dies der Fall, liegt ein 'Cache Hit' vor, und es wird aus dem schnellen RAM mit einem 16 MHz-Buszyklus (vier Takte, 250 ns) gelesen. Ansonsten ('Cache Miss') muss auf den Hauptspeicher zugegriffen werden. Dabei werden für den Prozessor Wartezyklen eingebaut, und ein Buszyklus dauert acht Takte (500 ns), was einem normalen 8 MHz-Zugriff entspricht. Auch bei einem Zugriff auf die I/O-Peripherie wird ein 'langsamer' Buszyklus benutzt. Zusätzlich wird auf den Hauptspeicher lesend immer in Wortbreite zugegriffen, wodurch bei aufeinanderfolgenden Byte-Zugriffen des Prozessors jedes zweite Byte aus dem Cache gelesen wird. Damit die Daten im Cache-Speicher immer denen im Hauptspeicher entsprechen, muss man sie natürlich auch bei Schreibzugriffen aktualisieren. Dabei werden gleichzeitig der Cache- und der Hauptspeicher mit eimem acht Takte dauerndem Buszyklus beschrieben (Write Through Cache). Bei dieser Realisierung erfolgt allerdings nur die Auffrischung der schon im Cache vorhandene Daten. Das hat den Vorteil, dass das Cache auch schon beim Speichertest während des Kaltstarts des ST aktiv sein kann. Zur Erklärung: Die Speichertestroutine bestimmt die Speicherbelegung durch Beschreiben und anschliessendes Probelesen von einzelnen Adressen. Würde nun durch jeden Schreibzugriff direkt das Cache aktualisiert, erhielte man immer das Ergebnis, dass der ST mit vier MByte bestückt sei. Der Vergleich der beiden Cache-Algorithmen ergab auch keine Unterschiede in der Rechenleistung, so dass guten Gewissens der günstigere gewählt werden konnte. Da der vorgesehene Cache-Speicher relativ klein ist, muss man recht häufig (bei einem Cache-Miss) entscheiden, welche Daten im Cache überschrieben werden können. Ideal wären natürlich die Daten, die der Prozessor nicht mehr braucht. Allerdings ist ein solcher 'Kaffeesatzalgorithmus' noch nicht entwickelt worden (wenn doch jemand einen kennen sollte, bitte den Autor benachrichtigen). Zum Erreichen von möglichst hohen Cache-Hit-Raten sind allerdings verschiedene Strategien bekannt. Wir verwenden die einfachste (und billigste!) Methode, das Direct-Mapped-Cache. Jeder Adresse des Hauptspeichers weist man eine Adresse im Cache zu. Dazu sind ausser den Daten-RAMs (6264) auch noch sehr schnelle Cache-Tag-RAMs (IDT7174S) vorhanden. Ihre Adresseingänge sind genauso wie die der DatenRAMs mit den unteren dreizehn Adressleitungen des Prozessors (A1-A13) verbunden. Durch diese unvollständige Adresszuordnung wird ein Speicherwort der Cache-RAMs vielen Hauptspeicherwörtern zugeordnet, die jeweils 16 kBytes auseinanderliegen. Um nun feststellen zu können, welche Hauptspeicherzelle in den Daten-RAMs gespeichert ist, sind die restlichen zehn Adressleitungen des Prozessors mit den Daten-Pins der CacheTag-RAMs verbunden. Ausser den Daten wird also auch noch der obere Teil der Adresse gespeichert. Wie erkennt die Cache-Steuerung nun aber, ob die vom Prozessor gewünschte Adresse im Cache liegt? Da kommen die speziellen Eigenschaften der Cache-Tag-RAMs ins Spiel. Sie haben zusätzlich zu dem normalen RAM-Innenleben noch einen Komparator integriert, der die aussen an den Daten-Pins anstehenden Datenmuster mit den gespeicherten vergleicht (für Insider: wenn /CS aktiv und /OE, /WE inaktiv). Das Ergebnis des Vergleichs wird am MATCH-Pin bekanntgemacht. Dieser Ausgang ist ein Open-Drain-Anschluss, so dass man leicht mehrere Bausteine parallel anschliessen kann (wie geschehen). Das so erzeugte Signal meldet der Logik einen auftretenden Cache-Hit (das Signal ist im Schaltplan mit HIT bezeichnet). Als zweite spezielle Eigenschaft besitzen die Cache-Tag-RAMs einen Löscheingang (/CLR), mit dem der Inhalt schnell (bei den benutzten RAMs in 65ns) gelöscht werden kann. Damit kann das gesamte Cache in besonderen Betriebszuständen als ungültig markiert werden. Dazu sind die nicht benutzten Daten-Pins mit VCC (+5V) verbunden. Die dort anliegenden Datenmuster (natürlich logisch eins) werden auch mit dem Inhalt der angewählten Speicherzelle verglichen, wodurch sich bei gelöschtem Cache immer ein Cache-Miss ergibt. Die erwähnten besonderen Betriebszustände, bei denen das Cache gelöscht wird, sind:

RESET des Prozessors.
Insbesondere beim Power-On-Reset ist der Cache-Inhalt undefiniert.

Busfreigabe des Prozessors. Da der DMA-Chip des ST seine Daten unter Umgehung des Adressbusses direkt in den RAM-Speicher schreibt, können die Zugriffsadresse nicht ermittelt und wie bei einem Prozessorzugriff das Cache aktualisiert werden. Die Daten im Cache könnten also ungültig sein. Die Busfreigabe ist mit /BGACK erkennbar.

Abschaltung des Caches. Das wäre nicht unbedingt nötig, ist aber am einfachsten zu realisieren.



Bild 1b: Anschlussplan der FPU



Die Schaltung

Nachdem der Schaltplan schon angesprochen wurde, kommt hier eine kleine übersicht. Da wäre zunächst einmal IC 1, die 16 MHz-CPU MC68000. Die meisten Pins der CPU sind mit den entsprechenden Pins des CPU-Sockels verbunden, der die alte CPU ersetzt (zum Einbau später mehr). Nur /AS, /UDS, /LDS und /DTACK sind davon ausgenommen und werden von der Cache-Steuerung übernommen. Ferner ist der Takteingang CLK mit dem 16 MHzTakt CL 16 verbunden. 1C2 und 1C3 sind die Cache-Tag-RAMs IDT7174S-35. Das -35 bedeutet 35 ns Zugriffszeit. Der Anschluss der Adressund Datenleitungen wurde schon erklärt. Die ICs sind immer selektiert (/CS ist mit Masse verbunden), die Ausgangstreiber immer desaktiviert (/OE auf VCC). Für die Cache-Steuerung wird mit den beiden MATCH-Ausgängen und R5 das Signal HIT erzeugt, das ein Cache-Hit anzeigt. /CLR ist der Löscheingang, und mit /WE können die Cache-Tag-RAMs beschrieben werden. Für die Daten-RAMs 1C4 und 1C5 genügen die langsameren Speichertypen 6264LPIO mit 'nur' 100 ns Zugriffszeit. 1C4 speichert die unteren acht Daten-Bits DO bis D7, während 1C5 für D8 bis D15 zuständig ist. Auch an diesen Bausteinen ist das Chip-Select mit dem Anschluss von /CE 1 und CE2 an Masse bzw. VCC immer aktiv. Die Ansteuerung der Ausgangstreiber für einen Lesezugriff erfolgt gemeinsain über /DOE. Im Gegensatz dazu können 1C4 und 1C5 mit /LDW und /UDW getrennt beschrieben werden. Der Anschluss des Fliesskomma-Coprozessors MC68881 (ICIO) an den MC68000 ist relativ einfach. Da der MC68881 einen 32-Bit breiten Datenbus besitzt, muss jede Datenleitung des Prozessors zweimal angeschlossen werden. Dass der MC68000 nur einen 16-Bit Datenbus besitzt, wird dem Coprozessor mit /SIZE an WC und AO an Masse mitgeteilt. Die Registerwahl im MC68881 geschieht durch A1 bis A4, wodurch 16 16-Bit-Register unterschieden werden können. Dieser 32-ByteAdressbereich wird durch das Chip-Select /FCS (erzeugt in IC6) ab der Adresse $FFFA40 (kompatibel zum ATARI-Coprozessor) in den Adressraum des Prozessors eingeblendet. /RESET, /AS und R/W sind mit den gleichnamigen Signalen des Prozessors verbunden, /DSACKI mit dem System-DTACK-Signal /SDT. /DS (Data Strobe) wird mit zwei NANDs in 1C9 aus /UDS und /LDS gewonnen. Der Takteingang ist natürlich an den 16 MHzTakt CL16 angeschlossen.




Bild 1a: Schaltplan der MACH 16 (ohne FPU)



Cache-Steuerung

Kommen wir nun zum Kern der Schaltung, zur Cache-Steuerung. Sie ist mit den drei GALs IC6 bis IC8, entsprechend GAL1 bis GAL3, realisiert. Die einfachste Funktion hat IC6 (GAL1) zu erfüllen. Es stellt einen simplen Adressdekoder dar. Die Logikgleichungen dafür sind dem GAL-Listing 1 zu entnehmen. Die Ausgänge sind mit '.T' als Tri-State-Ausgänge konfiguriert. Dadurch können einige Ausgänge abgeschaltet und als (Adress-) Eingänge benutzt werden. Das Signal MEM wird aktiv, wenn ein Zugriff auf den Hauptspeicher (RAM oder ROM) erfolgt. Dazu werden die Adressen $000000 bis $3FFFFF und $FCOOOO bis $FEFFFF dekodiert. /FCS ist das Chip-Select-Signal für den Coprozessor und wird für die Adressen $FFFA40 bis $FFFA5F aktiv. In IC8 (GAL3) sind die DTACK-Steuerung und die Cache-Löschlogik zusammengefasst (siehe GAL-Listing 3). Die Cache-Löschlogik ist schnell beschrieben. Sie fasst die drei oben beschriebenen Bedingungen zum Löschen der CacheTag-RAMs durch eine OR-Verknüpfung zusammen.



Die GAL-Listings

Listing 1

Cache-Controller fur ATARI ST
GAL 1: Adressdekodierung

*IDENTIFICATION
  CCDT1V1C;

*TYPE
  GAL20V8;

*PINS
  A23      = 1,
  A22      = 2,
  A21      = 3,
  A20      = 4,
  A19      = 5,
  A18      = 6,
  A17      = 7,
  A15      = 8,
  A13      = 9,
  A11      = 10,
  A9       = 11,
  A7       = 13,
  A8       = 14,
  A12.T    = 16,
  A14.T    = 17,
  A16.T    = 18,
  A6.T     = 19,
  MEM.T    = 20,                % RAM/ROM-Zugriff %
  A10.T    = 21,
 /FCS.T    = 22,                % Fpu Chip Select %
  A5       = 23;


*BOOLEAN-EQUATIONS

  A6.E = GND ;
  A10.E = GND ;
  A12.E = GND ;
  A14.E = GND ;
  A16.E = GND ;

  MEM = /A23 & /A22
      + A23 & A22 & A21 & A20 & A19 & A18 & /A16
      + A23 & A22 & A21 & A20 & A19 & A18 & /A17;

  FCS =  A23 & A22 & A21 & A20 & A19 & A18 & A16
       & A15 & A14 & A13 & A12 & A11 & /A10 & A9 & /A8 & /A7 & A6 & /A5;

*END

Listing 2

Cache controller fur ATARI ST
GAL 2: Cache und Bussteuerung

*identification
CCDT2V6;

*type
GAL16V8;

*pins

/PAS    = 1,            % verzogertes AS-Signal         %
/UDS    = 2,                    % Upper Data Strobe (prozessor) %
/LDS    = 3,                    % Lower Data Strobe (prozessor) %
/WR     = 4,            % Read/Write                    %
/AS     = 5,            % Address strobe (prozessor)    %
 CEN    = 6,                    % Cache ein-aus                                 %
 MEM    = 7,            % RAM/ROM-Zugriff               %
/BGACK  = 8,                    % Bus Grant ACKnowledge                 %
 HIT    = 9,            % Cache-Treffer                 %
 EN_I   = 11,                   % Cache Enable (Ruckkopplung)   %
 ENAB.T = 12;           % Cache Enable (Ausgang)        %
/CWE.T  = 13;                   % Write Enable Cache-RAMs               %
/LDWE.T = 14;                   % Write Enable unteres Daten RAM%
/UDWE.T = 15;                   % Write Enable oberes Daten RAM %
/BLDS.T = 16,                   % Lower Data Strobe (bus)       %
/BUDS.T = 17,                   % Upper Data Strobe (bus)       %
/BAS.T  = 18,                   % Address Strobe (bus)                  %
/DOE.T  = 19,                   % Output Enable Daten-RAMs              %

*boolean-equations

 BAS.E = /BGACK;

 BAS = AS & PAS & /EN_I
         + AS & PAS & /MEM
         + AS & PAS & WR
         + AS & PAS & /HIT
         + AS & BAS;

 BLDS.E = /BGACK;

 BLDS = PAS & LDS & /EN_I
          + PAS & LDS & /MEM
          + PAS & LDS & WR
          + PAS & LDS & MEM & /WR & /HIT
          + PAS & UDS & MEM & /WR & /HIT
          + LDS & BLDS
          + UDS & BLDS;

 BUDS.E = /BGACK;

 BUDS = PAS & UDS & /EN_I
          + PAS & UDS & /MEM
          + PAS & UDS & WR
          + PAS & UDS & MEM & /WR & /HIT
          + PAS & LDS & MEM & /WR & /HIT
          + UDS & BUDS
          + LDS & BUDS;

 CWE = EN_I & BAS & ( UDS + LDS ) & MEM & /WR & /HIT
         + ( UDS + LDS ) & CWE;

 DOE = ( UDS + LDS ) & MEM & /WR & HIT & /CWE & EN_I;

 UDWE = EN_I & PAS & ( UDS + LDS ) & MEM & ( /WR & /HIT + WR & UDS & HIT )
      + ( UDS + LDS ) & UDWE ;

 LDWE = EN_I & PAS & ( UDS + LDS ) & MEM & ( /WR & /HIT + WR & LDS & HIT )
      + ( UDS + LDS ) & LDWE ;

 ENAB = /AS & CEN + AS & EN_I + CEN & EN_I ;


*end

Listing 3

Cache controller fur ATARI ST
GAL 3: DTACK Steuerung und Cache Loschlogik
(nur zum Entwurf)

*identification
CCDT3V8;

*type
GAL16V8;

*pins

 CL8    = 2,            % 8 Mhz Takt                    %
/SDT    = 3,            % System DTack                  %
/FCS    = 4,            % Fpu Chip Select               %
/RESET  = 5,            % Reset                         %
/BGACK  = 6,                    % Bus Grant ACKnowledge                 %
 MEM    = 7,            % RAM/ROM-Zugriff               %
/WR     = 8,            % Read/Write                    %
 HIT    = 9,            % Cache-Treffer                 %
 ST0.R  = 12,           % Bit 0 der Zustandskodierung   %
/PDT.T  = 13,           % Prozessor Dtack                               %
 ST1.R  = 14,           % Bit 1 der Zustandskodierung   %
 ST2.R  = 15,           % Bit 2 der Zustandskodierung   %
/PAS.R  = 16,           % verzogertes AS-Signal         %
/CLR.T  = 17,                   % Cache-Loschsignal                             %
/AS.T   = 18,           % Address strobe (Eingang)      %
 ENAB.T = 19;           % Cache Enable (Eingang)        %

*boolean-equations

 ENAB.E = GND ;

 AS.E = GND ;

 CLR = BGACK + RESET + /ENAB ;

 PDT = ST2 & /ST1 & /ST0 & PAS          % Zustand S5 %
         + ST2 & /ST1 &  ST0 & PAS              % Zustand S6 %
         + ST2 &  ST1 &  ST0 & PAS              % Zustand S8 %
         + FCS & AS & SDT;                              % FPU-Zugriff %

         ST0 = AS & /RESET & /FCS & /PAS
                 + AS & /RESET & ST1 & /ST0
                 + AS & /SDT & /RESET & /ST2 & ST1
                 + AS & /CL8 & /RESET & /ST2 & ST1
                 + /RESET & ST2 & /ST0
                 + AS & /WR & /RESET & ST2 & ST1;

     ST1 = AS & MEM & HIT & /WR & ENAB & /RESET & /FCS & /PAS
         + AS & /RESET & /FCS & /ST2 & /ST1 & ST0
         + AS & /RESET & ST1 & /ST0
         + AS & /SDT & /RESET & /ST2 & ST1
         + AS & /CL8 & /RESET & /ST2 & ST1
         + AS & /WR & /RESET & ST2 & ST1;

     ST2 = AS & MEM & HIT & /WR & ENAB & /RESET & /FCS & /PAS
         + AS & SDT & CL8 & /RESET & /ST2 & ST1 & ST0
         + /RESET & ST2 & /ST0
         + AS & /WR & /RESET & ST2 & ST1;

    /PAS = RESET
         + ST2 & /ST1 & ST0
         + WR & ST2 & ST1
         + /AS & ST0
         + /FCS & /ST2 & /ST1 & /ST0 & PAS
         + /AS & /ST2;

*end



Cache controller fur ATARI ST
Für GAL 3: Syncrones Schaltwerk für DTACK Steuerung
(nur zum Entwurf)

*identification
CCDT3V8;

*type
GAL20V8;

*declaration
z-var = 4;
x-var = 9;

*pins

/AS     = 2,            % Address strobe                %
 CL8    = 3,            % 8 Mhz Takt                    %
 MEM    = 4,            % RAM/ROM-Zugriff               %
/SDT    = 5,            % System DTack                  %
 HIT    = 6,            % Cache-Treffer                 %
/WR     = 7,            % Read/Write                    %
 ENAB   = 8,            % Cache Enable                  %
/RESET  = 9,            % Reset                         %
/FCS    = 10,           % Fpu Chip Select               %
 ST0.R  = 15,           % Bit 0 der Zustandskodierung   %
 ST1.R  = 16,           % Bit 1 der Zustandskodierung   %
 ST2.R  = 17,           % Bit 2 der Zustandskodierung   %
/PAS.R  = 18;           % verzogertes AS-Signal         %

*x-names
 AS = 1, SDT = 2, CL8 = 3,
 MEM = 4, HIT = 5, WR = 6, ENAB = 7,
 RESET = 8, FCS = 9;

*z-names
 ST2 = 1, ST1 = 2, ST0 = 3, PAS = 4;

*z-values;

 s1 = 000 0;
 s2 = 001 1;
 s3 = 010 1;
 s4 = 011 1;
 s5 = 100 1;
 s6 = 101 1;

 s8 = 101 1;

 s9 = 000 1;

*flow-table

 s[1..9], --- ---- 1 -, f1;         % RESET -> Anfangszustand %
 s[1..4], 0-- ---- 0 -, f1;         % nicht AS in S1-S4 -> Anfangszustand %

 s1, 1-- 0--- 0 0, f2;
 s1, 1-- -0-- 0 0, f2;
 s1, 1-- --0- 0 0, f2;
 s1, 1-- ---0 0 0, f2;
 s1, 1-- 1101 0 0, f8;              % cache hit -> Zustand S8 %
 s1, 1-- ---- 0 1, f9;              % FPU zugriff -> zustand S9 %

 s2, 1-- ---- 0 0, f3;
 s2, 1-- ---- 0 1, f9;              % FPU zugriff -> zustand S9 (zur Sicherheit) %

 s3, 1-- ---- 0 -, f4;

 s4, 10- ---- 0 -, f4;
 s4, 110 ---- 0 -, f4;
 s4, 111 ---- 0 -, f5;              % nur wenn DTACK und CL8 -> S5 %

 s5, --- ---- 0 -, f6;              % In S5 und S6 wird dtack (PDT) fur den %
                                    % Prozessor erzeugt %

 s6, --- ---- 0 -, f1;

 s8, 1-- --0- 0 -, f8;              % Cache hit -> solange AS anliegt und kein %
 s8, 0-- ---- 0 -, f1;              % WR erzeugt wird (read-modify-write zyklus) %
 s8, --- --1- 0 -, f1;              % ist PDT aktiv. %

 s9, 1-- ---- 0 1, f9;              % FPU Zugriff %
 s9, 0-- ---- 0 -, f1;
 s9, --- ---- 0 0, f1;




Die DTACK-Steuerung

Die DTACK-Steuerung im GAL3 ist als synchrones Schaltwerk (Mealy-Automat) entworfen. Das bedeutet, dass der Baustein mit einem Taktsignal, hier dem im Vergleich zum Prozessor invertierten 16MHz-Takt, betrieben wird. Die Ausgänge des Schaltwerkes wechseln nur mit der steigenden Flanke des Taksignals ihren logischen Zustand. Dazu werden die Ausgangszellen des GALs mit '.R' als Registerausgänge definiert. Aus den Logikgleichungen im Listing zu GAL3 lässt sich die Funktion des Schaltwerks jedoch kaum erklären. Die Gleichungen sind allerdings auch das Ergebnis eines GAL-Assemblers, der direkt den Entwurf von synchronen Schaltwerken zulässt. Für den Entwurf werden bestimmte Bit-Muster der Ausgänge sogenannten Zuständen zugeordnet. Das Verhalten des Schaltwerkes wird dann nur noch durch den Wechsel von einem Zustand zum nächsten bestimmt. Welcher Zustandswechsel zur Durchführung kommen, hängt nur von den Eingangssignalen ab und wird in einer übergangstabelle beschrieben. Das GAL-Listing 4 zeigt die Entwurfsdatei des Schaltwerkes für den benutzten GAL-Assembler. Obwohl das Schaltwerk in einem GAL16V8 realisiert wurde, musste ich in diesem Listing als Typ ein GAL20V8 angeben, da der GAL-Assembler für ein GAL16V8 beim Entwurf von synchronen Automaten nur acht Eingangsvariablen zulässt, aber hier neun benutzt wurden. Weil aber nur die aus dem Entwurf resultierenden Logikgleichungen in das GAL-Listing 3 kopiert werden mussten, stört dies nicht. Nach dem Schlüsselwort 'declaration' werden die Anzahl der Eingänge (x-var) und die Anzahl der synchronen Ausgänge (z-var) definiert. Danach folgt mit 'pins' die Namensgebung für die Ein- und Ausgänge. Die Pin-Nummern sind nur aus syntaktischen Gründen angegeben und haben hier keine Bedeutung. Unter 'x-names' legt man die Reihenfolge fest, in der die Eingänge später in der übergangstabelle aufgeführt werden:



1.AS Adresse Strobe des Prozessors
2.MM DTACK-Signal der ST-Periherie
3.CL8 8Mhz Takt
4.MEM Speicherdekodierung von GAL 1
5.HIT Cache Hit-Signal der Cache TAG-Rams
6.WR Read/Write des Prozessors
7.ENAB Cache eingeschaltet
8.RESET Na, was wohl?
9.FCS Chipselekt Signal des CoProzessors



Hier werden alle Signale zum besseren Verständnis als Active-High angenommen. Der wirkliche Signalpegel ist mit der Namensgebung unter 'pins' definiert. Dann bestimmt man mit 'z-names' die Reihenfolge der Ausgänge für die Zustandskodierung. STO bis ST2 sind reine Zustandsausgänge, die nur intern rückgekoppelt werden. PAS hingegen kann man als ein verzögertes AS-Signal betrachten. Es findet Verwendung, um die Zugriffszeiten der Cache-Tag-RAMs auszugleichen. Mit Aktivierung von PAS wird in GAL2 die Entscheidung getroffen, ob ein Cache-Hit vorliegt oder nicht. Die Zustandskodierungen legen Sie unter 'z-values' fest. Die Zustände sind mit s1 bis s9 bezeichnet und willkürlich festgelegt, wobei s7 nicht existiert. Nur die Zuordnung von PAS steht aus dem genannten Grund fest. Jetzt kommen wir endlich mit 'flowtable' zum eigentlichen Knackpunkt des Schaltwerks, der übergangstabelle. Ein Tabelleneintrag beginnt darin mit einem oder mehreren Ausgangszuständen, dann folgt die notwendige Kombination der Eingänge, um in den rechts stehenden Folgezustand zu gelangen. Eine 'O' bedeutet dabei, dass der Eingang für den Zustandswechsel logisch inaktiv sein muss. Eine 'F' steht dementsprechend für logisch aktiv und ein '-' dafür, dass der Eingang für diesen übergang irrelevant ist. Die erste Zeile beschreibt die Initialisierung des Schaltwerkes beim Reset. Nach einem Reset ist immer der Anfangszustand s1 erreicht. Ebenso erfolgt ein Wechsel nach s1, wenn in den Zuständen s1 bis s4 das AS-Signal inaktiv wird (nächste Zeile). Dies kann z. B. bei einem BUS-Error oder einem synchronen Buszyklus passieren. Die folgenden sechs Zeilen beschreiben den Zustand s1. Betrachten wir zuerst einmal die Spezialfälle. Wenn ein Coprozessorzugriff stattfindet, erkennbar durch die aktivierten Signale AS und FCS, findet ein Wechsel zum Zustand s9 statt. Bei einem Cache-Hit, d. h. MEM, HIT, ENAB aktiv und WR inaktiv, wird Zustand s8 angesprungen. In allen anderen Fällen, in denen AS aktiv ist, wird zum Zustand s2 verzweigt, womit ein 'langsamer' Buszyklus eingeleitet wird (wenn AS inaktiv ist, bleibt das Schaltwerk in s1, siehe Zeile 2). Ähnlich kann man die gesamte Zustandstabelle interpretieren. Ich beschränke mich jetzt aber auf ein paar Bemerkungen zu den Zuständen:

Die Zustände s2 und s3 sind reine Verzögerungszustände.

Im Zustand s4 wird auf das Dtack-Signal /SDT gewartet. Zur genauen Nachbildung des 8 MHz-Buszyklusses erfolgt die Verzweigung nach Zustand s5 allerdings erst, wenn der 8 MHz-Takt in seiner High-Phase ist.

Während der Zustände s5 und s6 wird das DTACK-Signal für den Prozessor erzeugt, um den Buszyklus abzuschliessen.

Die Verzweigung nach Zustand s8 findet statt, wenn ein Cache-Hit vorliegt. Dieser Zustand wird verlassen, wenn AS inaktiv oder WR in einem Read-Modify-Write-Zyklus aktiviert wird. Der Read-Modify-Write-Zyklus ist ein spezieller MC68000-Buszyklus, der nur bei dem Assernbler-Befehl TAS zur Anwendung kommt.

Zustand s9 wurde eingeführt, damit auf den Coprozessor mit voller Geschwindigkeit zugegriffen werden kann. Ein Coprozessorzugriff dauert so nur 4 Takte (= 250 ns) statt der normalen 8 Takte für die sonstige Peripherie.

Zurück zu GAL3

Mit dem GAL-Listing 4 fütterte ich, wie erwähnt, den GAL-Assembler, der nach einiger Zeit (ca. 1.5 s) die Logikgleichungen für ST0, ST1, ST2 und PAS ausspuckte. Die Gleichungen sind unverändert ins GAL-Listing 3 übernommen worden. Darnitbleibt im GAL-Listing 3 nur noch der Ausgang /PDT zu behandeln. Er ist mit dem /DTACK-Eingang des Prozessors verbunden. Das Signal wird in den Zuständen s5, s6 und s8 aktiv. Ausserdem wird das DTACK-Signal des Coprozessors asynchron an den Prozessor weitergereicht, damit der Coprozessorzugriff mit maximaler Geschwindigkeit abläuft.

Das letzte IC

In IC7 (GAL2) ist die Cache- und Bussteuerung untergebracht. Hier trifft man die Entscheidung, ob und wie das Cache oder der Systembus angesprochen werden. Doch bevor ich die Gleichungen des GAL-Listings 2 im einzelnen erkläre, erst ein überblick über den gewählten Cache-Algorithmus:

Lesezugriffe auf den Hauptspeicher werden möglichst aus dem Cache befriedigt (logo!).

Wenn ein Lesezugriff auf den Hauptspeicher nicht aus dem Cache zu erfüllen ist, wird das Cache mit den Daten (und Adressen) überschrieben. Dabei werden Byte-Zugriffe in Wortzugriffe gewandelt, da das Cache eine Datenbreite von 16 Bits besitzt.

Bei Schreibzugriffen erfolgt eine Aktualisierung des Caches nur, wenn die angesprochene Adresse schon darin gespeichert ist. Auf jeden Fall wird der Hauptspeicher beschrieben. Hierbei unterscheidet man natürlich Byte- und Wortzugriffe.

Zugriffe auf andere Adressen als die des Hauptspeichers berühren das Cache nicht. Der ROM-Port-Adressraum wurde absichtlich aus der Speicherdekodierung ausgeklammert, da er hauptsächlich für andere Peripherie zur Anwendung kommt.

Das Cache wird beim Reset, bei einem DMA-Zugriff, und wenn es abgeschaltet ist, gelöscht.

Nun zu den Gleichungen.

Da ist als erstes die Aufteilung des Cache-Enable-Signals in einen Ein- und einen Ausgang zu erklären. Normalerweise lassen sich die Ausgänge eines GALs direkt als Eingänge verwenden (Rückkopplung). Nur bei der verwendeten Konfiguration (alle Ausgänge sind im Tri-State-Modus) beschränkt sich die Funktion der Pins 12 und 19 auf reine Ausgänge. Dafür kann man die Pins 1 und 11 als Eingänge benutzen. Da alle anderen Ausgänge schon belegt waren und die Rückkopplung gebraucht wird, musste ich die Lösung mit getrenntem Einund Ausgang wählen. Die Gleichung für das ENAB-Signal stellt ein D-Latch dar. At dem Eingang CEN können Sie das Cache abschalten. Das kann z.B. mit einem Schalter geschehen. Durch das D-Latch verhindern Sie, dass sich der Zustand von ENAB während eines Buszyklusses (während AS aktiv ist) ändert. BAS ist das Bus-Address-Strobe. Der Ausgang wird durch "BAS.E = /BGACK" ebenso wie BUDS und BLDS während eines DMA-Zugriffs in den Tri-State-Modus versetzt. Um BAS zu aktivieren, müssen.erstens AS und PAS aktiv sein (zur Erinnerung: PAS ist ein verzögertes AS, das benötigt wird, damit die Cache-Tag-RAMs genügend Zeit haben, das HIT-Signal zu erzeugen). Ferner müssen das Cache abgeschaltet sein (/EN-I), kein Zugriff auf den Hauptspeicher erfolgen (/MEM), das Schreibsignal aktiviert sein oder ein Cache-Mss vorliegen (/HIT), damit BAS erzeugt wird. Mit "+ AS & BAS" erreicht man, dass ein einmal erzeugtes BAS bis zum Ende des Buszyklusses aktiv bleibt (Selbsthaltung). Für BUDS und BLDS gelten im Prinzip ähnliche Bedingungen zur Aktivierung wie bei AS, nur kommt hier noch die Umwandlung vorn Byte- zu Wortzugriffen hinzu. Dazu musste auch die Selbsthaltung auf das jeweils andere Signal augedehnt werden. BUDS und BLDS sind vollkommen symmetrisch. Mit CWE werden die Cache-Tag-RAMs beschrieben. Das Signal wird aktiv, wenn nach einem Cache-Miss ein Lesezugriff auf den Hauptspeicher erfolgt (das Cache muss natürlich eingschaltet sein). DOE aktiviert die Ausgangstreiber der Daten-RAMs, wenn ein Cache-Hit vorliegt. Die Verknüpfung mit /CWE ist nötig, weil bei einem Schreibzugriff auf die Cache-Tag-RAMs das Signal HIT aktiv wird. LDWE und UDWE steuern das Schreiben in die Daten-RAMs. LDWE und UDWE werden aktiviert, wenn ein Cache-Miss vorliegt oder eine im Cache vorhandene Adresse beschrieben wird. Im zweiten Fall sind natürlich Byte-Zugriffe durch Einbeziehung von UDS bzw. LDS zu beachten. Damit ist die Beschreibung der Schaltung abgeschlossen. Für manche Leser wird das Eingehen auf Schaltungsdetails wahrscheinlich recht starker Tobak gewesen sein, aber ich wollte interessierten Selbstbauern den Aufbau der Schaltung möglichst genau erläutern. Für den Betrieb einer Fertigkarte ist dieses Wissen natürlich nicht erforderlich.


Der Einbau

Egal ob man die MACH 16 selbst gebaut oder ein Fertiggerät erstanden hat, um einigen handwerklichen Aufwand kommt man nicht herum. Der alte Prozessor im ST muss entfernt werden. Jeder Versuch, ihn unbeschadet auszulöten, scheint mir zurn Scheitern verurteilt. Am besten werden alle Pins mit einem feinen Seitenschneider abgetrennt und die Reste einzeln ausgelötet. Dann können eine 64polige IC-Fassung eingelötet und die Karte aufgesteckt werden. Den 16-MHz-Takt greift man am günstigsten am Pin 39 des Shifters ab (Pin 5 der MMU ist auch möglich). An den CEN-Jumper kann ein Schalter zur Cache-Abschaltung angeschlossen werden. Das Cache ist bei überbrückten Jumper inaktiv.


Probleme mit Software

Vor dieser Möglichkeit muss man allerdings nur bei einer verschwindend kleinen Anzahl von Programmen Gebrauch machen. Entstehende Probleme sind im allgemeinen auf Zeitschleifen zurückzuführen. Besonders Programme, die den Floppy-Controller selbst programmieren, heben sich hierbei unrühmlich hervor, und das sind auch bekannte Disk-Utilities und Diskettenkopierprogramme. Deshalb hier ein Aufruf an alle Programmierer, für Zeitmessung nur die im ST vorhandenen Timer zu verwenden. Wie krass das Problem werden kann, möchte ich an der einfachsten denkbaren Zeitschleife erläutern:

label: dbra d0,label
Diese Schleife zählt d0.w runter, bis -1 erreicht ist. Laut Motorola-Spezifikation dauert ein Schleifendurchlauf 10 Takte. Da im ST sich aber Prozessor und Videologik den Bus teilen, erhöht sich die Taktzahl auf 12. Bei einem 8-MHz-Takt sind das 1500 ns. Mit aktiviertem Cache ist der Befehl nach dem ersten Zugriff im Cache gespeichert, und die 16-MHz-CPU kann mit voller Geschwindigkeit darauf zugreifen und wenn der Speicher nicht bremst, dauert ein Schleifendurchlauf nur noch 10*62.5 ns = 625 ns. Dies entspricht einer Beschleunigung um den Faktor 2.4. Die Zeitschleife wird also schon nach 41.6% der eigentlich vorgesehenen Zeit beendet, was zu den beschriebenen Problemen führt.




Bild 1c: HL-Benchmarks



Die Stückliste

Halbleiter:

IC1:
MC68000-16 CPU 16MHz

IC2,IC3:
IDT7174S-35 CACHE RAM 8K x 8bit 35ns

IC4,IC5:
6264-LP10 CMOS-RAM 8K x 8bit 100ns

IC6:
GAL20V8-25

IC7,IC8:
GAL16V8-25

IC9:
74AS00 4-NAND

IC10:
MC68881-16 FPU 16Mhz

Widerstande:

R1-R4:
4.7 KOhm

R5:
200 Ohm

Kondensatoren:

C1-C9:
100nF Keramik

Sonstiges:

eventuell IC Sockel
2*32 pol Stiftreihen



Michael Glässner - ST Computer - Sonderheft ST Extra 3
F1999L



Abbildung 1d - Hypercache Beschleuniger



Bild von Bernd Maedike





Copyright © Robert Schaffner (doit@doitarchive.de)
Letzte Aktualisierung am 23. Mai 2004
Home Beschleuniger MightyMic CyReL CaTTamaran TT030 Accelerator