10.3 Mach 16 Die Maxon-Coprozessor-Cache-Erweiterung MACH 16
Der ST auf 16 MHz
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.
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.
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
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
Die GAL-Listings
Listing 1
Cache-Controller fur ATARI ST
*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
*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
*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
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
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.
label: dbra d0,label
Bild 1c: HL-Benchmarks
Halbleiter:
IC1:
IC2,IC3:
IC4,IC5:
IC6:
IC7,IC8:
IC9:
IC10:
Widerstande:
R1-R4:
R5:
Kondensatoren:
C1-C9:
Sonstiges:
eventuell IC Sockel
Michael Glässner - ST Computer - Sonderheft ST Extra 3
Bild von Bernd Maedike
Copyright © Robert Schaffner (doit@doitarchive.de) Letzte Aktualisierung am 23. Mai 2004 |