minpic01.jpg

Bildschirm am Transputer-Link

Universelles `Debugging-Terminal´ für Transputer-Netzwerke

Martin Prüfer

Transputer-Netzwerk installiert, die Jobs ins Netz geschickt - und die geballte Rechenleistung ruht. Deadlock oder `Prozeßverklemmung´ macht das Debuggen echt paralleler, auf verschiedene Prozessoren verteilter Anwendungen zu einer Kunst, zumal die meisten Entwicklungsumgebungen dies nur unbefriedigend unterstützen. Ein Bildschirm, der sich an ein beliebiges freies Link des Transputer-Netzes anschließen läßt, erleichtert die Fehlersuche erheblich.

Unterthema: Logik kompakt verpackt
Unterthema: Stückliste
Unterthema: Occam-Listing
Unterthema: Benutzung von PLACE AT

Die hier vorgestellte Interface-Hardware `Link-2-Monitor´ (sprich: Link to Monitor, kurz L2M) setzt Daten von einem Transputer-Link in monochrome Bilder mit einem Video-Timing für `anspruchslose Monitore´ um. Auf diese Art lassen sich - umwelt- und portemonnaiefreundlich - ausrangierte BAS-, TTL- oder gar TV-Monitore wieder einer sinnvollen Verwendung zuführen. Da bei diesem Projekt die Transputer-Links am `Geschwindigkeits-Anschlag´ laufen müssen, mußte für den verwendeten Link-Adapter-Chip ein `überlappendes Acknowledge´ entwickelt werden.

Natürlich sind Daten, die über ein Transputer-Link verschickt werden, nicht schon von sich aus Video-Daten; erst nachdem spezifische Transputer-Software die Link-Daten aufbereitet hat, bringt der L2M Text oder einfache Grafik auf den Monitor. Ein L2M-System ist folglich ein universelles Grafik-Terminal für Transputer, das nicht nur zum Debugging, sondern im weitesten Sinne zu einfacher Prozeßvisualisierung etwa in der Meß- und Regelungstechnik taugt.

Verknotet

Transputer beziehungsweise Transputer-Netze sind normalerweise als Subsysteme organisiert, die von einer Host-Maschine gesteuert werden. Da Meldungen auf eigens angelegten Kanälen (Channels) durch das Transputer-Netz zum Host weitergereicht werden, geht der direkte Kontakt zu den Netzknotenrechnern verloren. Aus dem Tritt geratene Netzknoten (Deadlock) können diesen Kommunikationskanal ebenso unterbrechen wie gestörte Link-Verbindungen - damit bleiben dann auch die im Fehlerfall erwarteten Meldungen aus.

Über das Link-2-Monitor-Interface kann man jeden Transputerknoten in einem Netzwerk, der einen Link-Anschluß frei hat, einen Nebenjob als Debug-Terminal aufhalsen. Ob man dazu den L2M nun dauerhaft als Debug-Station an einem weit vom Host entfernten Transputer-Knoten laufen läßt oder nur zum `Abklappern´ diverser Transputer-Knoten im Fehlerfall benutzt, steht dem Anwender frei. Auf jeden Fall kann er sich auch dann Aufschluß über netzwerkinterne Zustände verschaffen, wenn einige oder gar alle Knoten vom Host aus nicht mehr erreichbar sind.

Problem Link-Datenrate

Die Ausgangsidee war, daß es mit der von Inmos als Standard vorgegebenen Link-Geschwindigkeit von 20 MBit/s möglich sein müßte, ein Schwarzweiß-Videosignal mit einer Pixelrate von mindestens 5 MHz zu erzeugen. Das entspricht einer grafischen Auflösung von mindestens 256 × 256 Pixel auf Monitoren mit video-ähnlichen Synchronfrequenzen.

Die effektive Link-Datenrate zwischen zwei Transputern vom Typ T800 beträgt bei hardwaremäßig eingestellten 20 MBit/s laut Inmos [1] 1,8 MByte/s. Diese hohe Netto-Datenrate wird erreicht, indem die Link-Interfaces der Prozessoren ein überlappendes Acknowledge senden: schon beim ersten Bit eines empfangenen Datenbytes wird die Empfangsbestätigung (Acknowledge) ausgesendet.

Kommuniziert ein Transputer jedoch mit einem Link-Adapter-Chip (wie dem IMS C011, der auf dem L2M-Board benutzt wird), sinkt die Nutzdatenrate auf weniger als 1 MByte/s (gemessen), da Link-Adapter kein Protokoll mit überlappendem Acknowledge beherrschen. Im Hinblick auf den Overhead, den ein videogerechtes Übertragungsprotokoll erfordert, reicht diese Transferrate für die geplante Grafikausgabe nicht aus.

`Überraschendes´ Acknowledge

Die Transferrate läßt sich aber deutlich erhöhen, indem man nicht das einfache Acknowledge des C011 benutzt, sondern mit Zusatz-Hardware ein eigenes, überlappendes Acknowledge generiert. Die L2M-Hardware enthält ein Fifo (first in, first out) zum Zwischenspeichern der vom C011 empfangenen Bytes. Solange dieses Fifo leer ist, kann man die unmittelbare Abnahme eines weiteren Bytes garantieren und darf folglich ein frühzeitiges (überlappendes) Acknowledge aussenden. Ist das Fifo voll, wird ein Acknowlege nach der Konvention des Link-Adapters erst dann erzeugt, wenn das Byte wirklich abgenommen wurde.

Über diesen Umweg erreicht man 1,8 MByte/s Datentransferrate, was der optimalen Kommunikationsgeschwindigkeit zwischen zwei T800-Transputern entspricht. T414-Anwender profitieren davon übrigens ebenso: zwar kann ein T414 selbst kein überlappendes Acknowledge erzeugen, wenn er Daten empfängt, jedoch sendet auch er deutlich schneller, wenn das Empfänger-Link überlappendes Acknowledge praktiziert.

Das verwendete Fifo bringt weiteren Gewinn: in Austastlücken (während horizontaler oder vertikaler Synchronimpulse) wird keine Bildinformation ausgegeben, so daß in dieser Zeit das Fifo bereits auf Vorrat gefüllt werden kann.

Pixel-Protokoll

Damit die Video-Logik des L2M übersendete Daten zu einem Monitorbild aufbereiten kann, müssen diese einer strengen Konvention folgen. Die Bits 0 bis 3 entsprechen jeweils vier auf dem Schirm aufeinanderfolgenden Pixeln (Bildpunkten). Vom Fifo gelangen diese Bilddaten zu einem Pixel-Multiplexer, der im Pixel-Takt das Videosignal auf den BAS-Mischer gibt, an dessen Ausgang das Videosignal mit etwa 1 Volt an 75 Ohm ansteht. Bit 4 bleibt ungenutzt, Bit 5 dient als Intensitäts-Steuerung für die jeweils vier zum Paket gehörigen Pixel.

Bit 6 signalisiert dem GAL LM2 zunächst nur, daß die Pixel-Zeile keine weiteren darzustellenden Informationen mehr enthält. Hardwaremäßig wird sie jedoch noch nicht beendet, sondern erst wenn der Zähler IC 5 (74HCT4040) seinen programmierten Endwert (siehe GAL-Listings) erreicht hat. So kann man schon Daten für die nächste Zeile ans Fifo übermitteln, während die Hardware die aktuelle Zeile zu Ende bringt; man spart so deutlich Übertragungskapazität.

Bit 7 schließlich generiert direkt einen Vertikal-Synchron-Impuls, der ein neues Bild einleitet. In Grenzen ist das Bildraster per Software programmierbar; weitergehende Maßnahmen erfordern Änderungen an den GAL-Gleichungen. Bevor man sich aber daran wagt, sollte man das Gesamtsystem genau verstanden haben, beispielsweise um die Timing-Grenzen des Systems hinsichtlich der Link-Transferrate und des Pixel-Taktes (standardmäßig 6,6 MHz) einzuhalten.

minpic03.jpg

Ein Link-Adapter übersetzt den seriellen Datenstrom vom Transputer `ins Parallele´. Vier Pixel, Intensität und die Synchron-Signale stekken in jedem Datenwort.

minpic02.jpg

Um die Link-Transferrate bei der TEK 4/8 auf 20 MBit/s erhöhen zu können, müssen die Anschlüsse LinkSpecial und Link123Special von Masse abgetrennt und auf Vcc gelegt werden.

minpic04.jpg

Ohne überlappendes Acknowledge (oben) läuft der Link-Transfer recht langsam ab: erst nach dem letzten Sende-Bit wird der Empfang quittiert.

Per Default sind Hardware und Betriebssoftware darauf eingerichtet, bei einem Pixeltakt von 6,6 MHz eine Auflösung von 256 × 256 Bildpunkten bei 50 Hz Bildwiederholfrequenz und 15 625 Hz Zeilenfrequenz zu liefern. Damit lassen sich vom einfachen BAS- und CGA-Monitor über alle fernseh-ähnlichen Monitore (diverse Home-Computer) bis hin zu Mehrnorm-Monitoren ein Menge Geräte anschließen. Obwohl TTL-Monitore (MDA, Hercules) an sich 18,4 kHz Zeilenfrequenz bevorzugen, laufen auch einige direkt am L2M; andere müssen eventuell ein wenig `nach unten´ abgeglichen werden. Maximal 320 × 290 Bildpunkte sind per Software-Änderung zu erreichen.

TEK-4/8-Änderungen

Die Transputer-Karte TEK 4/8, mit der L2M entwickelt und erprobt wurde, ist durch ihr Platinen-Layout auf eine Link-Datenrate von 10 MBit/s festgelegt. Die notwendige Datenrate von 20 MBit/s an den Links 1 bis 3 läßt sich leicht einstellen, indem man sowohl LinkSpecial (Pin A2 des Transputers) als auch Link123Special (Pin A4) auf Vcc (5 V) legt.

Als erstes trennt man die Verbindung der beiden Anschlüsse zu Masse (0 V) auf. Auf der Unterseite der TEK-4/8-Platine ist dazu die etwa 1 cm lange Leiterbahn, die Pin A2 und A4 verbindet, einmal in direkter Nähe von A2 und ein zweites Mal unmittelbar an A4 zu unterbrechen (siehe Foto). Danach legt man die beiden Pins mit kurzen Drähten auf einen Anschluß mit Vcc, beispielsweise Pin C2. Wenn Sie komfortabel zwischen 10 und 20 MBit/s hin- und herschalten wollen, können Sie A4 statt dessen auch auf eine Steckbrücke (Jumper) führen. Ein ideales Dreier-Lochraster (Vcc, leer, Masse) dafür findet sich zwischen dem Stecker von Link1 und Link2 (siehe Foto).

Einfach Löten

Beim Bestücken der sehr luftig layouteten Platine gibt es nichts Besonderes zu beachten. Für den Link-Anschluß wurde ein Aalener Link-Stecker vorgesehen [3], so daß man L2M auch über längere Link-Leitungen betreiben kann. Speziell bei der TEK 4/8, die nur TTL-Signale bietet, kann man dieses Interface auch überbrücken: IC 1 wird nicht bestückt, sondern Pin 2 vom IC-1-Sockel wird direkt als Link-Eingang verwendet. IC 2 muß wegen einiger Sonderaufgaben in der Schaltung bleiben; den Link-Ausgang des L2M kann man an Pin 7 von IC 2 abgreifen. notReset hingegen kann direkt mit Pin 6 des Aalener Link-Connectors verbunden werden.

LEDs zur Kontrolle

Die rote LED zeigt das Empty-Flag (EF), die grüne das Full-Flag (FF) des Fifos an; die gelbe ist nur eine Betriebsanzeige. Werden aus irgendeinem Grund die Videodaten nicht rechtzeitig zur Verfügung gestellt, leuchtet die rote LED auf, gleichzeitig gibt es eine Störung in der Bildanzeige. Bei ordnungsgemäßem Betrieb sollte die grüne LED (FF) immer leuchten oder blinken, die rote hingegen dunkel bleiben.

Nebenbei wurde auch ein stabilisiertes Netzteil bereits auf die Hauptplatine gesetzt, das lediglich noch einen externen Trafo (oder ein Steckernetzteil) mit 9 bis 12 V und 300 mA erfordert. Alternativ (über Jumper JP2 wählbar) kann die Stromversorgung auch über den 5-V-Anschluß des Aalener Link-Steckers bezogen werden.

Software

Der L2M hat keinen eigenen Bildspeicher. Um ein stehendes Bild anzeigen zu können, muß der Transputer die Bilddaten 50mal in der Sekunde an den L2M senden. Dies belastet einen Transputer allerdings nur unwesentlich, denn nennenswerte CPU-Zeit erfordern nur die Prozesse, die zu neuen Ausgabedaten führen, sei es per Kommunikation mit einem anderen Transputer, sei es zum Beispiel bei der Ermittlung eigener Statusinformationen. Das zyklische Anstoßen des Ausgabeprozesses via Link hingegen erfordert kaum CPU-Zeit, und den eigentlichen Transfer wickelt der integrierte DMA-Controller des jeweiligen Link im Hintergrund ab.

minpic05.jpg

Leider geht´s nicht allein mit Link und Logik: ein Link-Adapter, ein Fifo, ein Zähler und vier GALs sind nötig, um stabile Bilder zu erzeugen.

minpic06.jpg

Das großzügige Layout erleichtert den Aufbau der Schaltung. Zudem paßt die Europa-Karte in viele Standard-Gehäuse.

Problematisch ist nur, wenn auf dem `Video-Transputer´ hochpriorisierte Prozesse die regelmäßige Datenausgabe zu sehr behindern, wenngleich der Hardware-Zähler zumindest die horizontale Synchronisation stabil hält.

Die Betriebssoftware ist durchweg in Occam geschrieben, und zwar in erster Linie für das preiswerte OCS-System (Vertrieb durch eMedia, Hannover). Sie wurde sowohl auf T800 als auch auf T414 getestet und läuft mit geringen Modifikationen (im File-I/O) auch unter MTOOL oder Toolset. Die Programme nebst Demos sind allerdings so umfangreich, daß wir hier nur einige Routinen mit interessanten Occam-Aspekten wiedergeben (die vollständige Software gibt´s auf Sammeldiskette beziehungsweise per Mailbox).

Der Hauptprozeß (DISPLAY.L2M) auf dem `Video-Transputer´ gibt entweder Grafikdaten oder mit einem (in der Software integrierten) Zeichen-Generator erzeugte Textmeldungen auf dem Bildschirm aus. Er ist seinerseits in einen High-Level- und einen Low-Level-Interpreter unterteilt. Der High-Level-Interpreter empfängt Befehle wie L2M.CIRCLE oder L2M.STRING und sendet seinerseits Grundbefehle wie L2M.LINE oder L2M.CHAR an den Low-Level-Interpreter. So wird sichergestellt, daß die einzelnen Befehle zur Bildmanipulation kurz sind und die kontinuierliche Bildausgabe nicht behindern.

Occam-gerecht ...

Zur Ausgabe der Daten an das Interface seien zwei grundverschiedene Strategien vorgestellt. Die erste wartet in einem PRI-ALT-Konstrukt auf den Zeitpunkt, an dem wieder mit der Ausgabe eines neuen Bildes begonnen werden muß. Ist die Zeit noch nicht erreicht, werden Befehle vom HL-Prozeß entgegengenommen und im LL-Prozeß ausgeführt. Dies ist der in Occam vorgesehene `ordentliche´ Weg.

... oder schnell

Eine riskantere, der Funktionsweise einer echten Video-Karte aber ähnlichere und vor allem schnellere Variante besteht in der gemeinsamen Nutzung eines `Bildspeichers´ durch zwei parallele Prozesse, wobei der eine die Daten einträgt, der andere sie zur Anzeige transportiert. Das widerspricht aber völlig Occams strengem Lokalitätsprinzip (jeder Prozeß hat nur lokale Daten, `globale Daten´ müssen synchronisiert über vereinbarte Kanäle ausgetauscht werden).

Darüber hinaus kennt Occam kein Konstrukt wie das malloc() von C, mit dem man sich einen Speicherbereich reservieren lassen kann. So muß man mit seinem Compiler selbst `aushandeln´, wo ein solcher Speicherbereich liegen könnte, den man dann auch nur durch absolute Festlegung (PLACE AT) zwei parallelen Prozessen zugänglich machen kann. Eine solch schnelle Lösung ist zwar für allerlei zeitkritische Transputer-Programmierung nützlich, sie birgt aber diverse Gefahren: unter anderem wissen fremde Prozesse nichts von dem `mißbrauchten´ Speicherbereich und könnten damit `heftig interferieren´. (gr)

Literatur

[1] Inmos/SGS-Thomson, The Transputer Databook, 2nd Edition 1989, Bristol

[2] M. Helzle, U. Lechner, und Heinz Ebert, Transputer-Board TEK 4/8, Transputer-PC-Steckkarte im Selbstbau, c't 10 bis 12/87

[3] H. Broer, D. Emde, G. Pogrzeba, R. Schmidt-Dannert, Transputer-Bäume werden wahr, Teil 2, c't 12/88, S. 252 ff.

[4] M. Prüfer, J. Mundhenke, Transputer-Debugging mit Link-2-Monitor, Tagungsband TAT´91, Parallele Datenverarbeitung mit dem Transputer, R. Grebe, M. Baumann (Hrsg.), Springer Verlag, 1992

Kasten 1


Logik kompakt verpackt

Der größte Teil der Schaltung verbirgt sich in vier GALs. GAL LM1 (IC 7) generiert aus dem Stand des Zählers IC5 sowohl einen Reset für den Zähler (RESET_X) als auch das H-Sync-Signal. Aus Bit 5 wird das Intensitätssignal, aus Bit 7 das V-Sync-Signal abgeleitet. Das Q_ackn-Signal für den Link-Adapter wird erst dann ausgegeben, wenn das Fifo (IC 6) nicht mehr voll ist. Der C011 (IC 3) nimmt daraufhin das Q_valid selbst zurück.

TITLE     IC 7 = LM_1_GAL
CHIP      GAL3 PALCE20V8

;PINS
;1    2    3   4   5   6       7        8        9      10   11    12
 CLK  x4   x5  x6  x7  x8      /READ    BIT5     SER_IN QVAL Reset GND

;13   14   15  16  17  18      19       20       21     22   23    24
 /OE  /FF  nc  /H  /V  RESET_X HELL_BIT HELL_SER QACK   /WR  BIT7  VCC

EQUATIONS
MINIMIZE_ON

;Zaehlerstellung fuer Reset: Anfang der neuen Bildzeile ist erreicht
RESET_X := x8 * /x7 * x6 * /x5 * /x4

;Zaehlerstellungen, bei der H-Sync auszugeben ist
H := x8 * /x7 * /x6 * /x5 * x4

;V-Sync setzen, wenn beim Einlesen Bit7 des Datenbytes gesetzt ist,
; sonst Halten des Zustandes
V :=  READ * BIT7   +   /READ * V

;Merker, ob Pixel dieses Datenworts heller dargestellt werden sollen
; Hell_Bit setzen, wenn beim Einlesen Bit5 des Datenbytes gesetzt ist,
; sonst Halten des Zustandes
HELL_BIT :=  READ * BIT5   +   /READ * HELL_BIT

;Hell-Information ausgeben bei gesetztem Hell-Merker und
;  eingeschaltetem Pixel
HELL_SER = HELL_BIT * SER_IN

;Fifo-Steuerung
; Acknowledge fuer Link-Adapter
; Setzen, wenn Daten da (QVAL) und Fifo nicht ganz voll
; Halten, bis Linkadapter Ackn erkannt hat
; Write fuer Fifo generieren, solange Daten gueltig sind
QACK    := WR + /FF * QVAL
WR      = QVAL * QACK
GAL LM2 (IC 4) enthält die Ablaufsteuerung (in Form einer State-Machine) und den Videodaten-Multiplexer, der die 4 Pixel, die in einem Byte übertragen werden, nacheinander ausgibt. Ausgangssignale sind READ (liest das nächste Byte aus dem Fifo) und SER (serieller Pixelstrom zum Monitor).

TITLE     IC 4 = LM_2_GAL
CHIP      GAL3 PALCE16V8

;PINS
; 1    2        3      4      5      6     7     8     9    10
  CLK  RESET_X  BIT6   RESET  BIT3   BIT2  BIT1  BIT0  nc   GND

; 11   12       13     14     15     16    17    18    19   20
 /OE   SHIFT    /READ  ST0    H_BIT  SER   FF0   FF1   FF2  VCC

STATE
MOORE_MACHINE

;Transitions
; WARTE ist der allgemeine Ruhezustand
; WARTE wartet auf Reset_x, d.h., eine neue Zeile ist auszugeben

WARTE     := 2VORLESEN -> VORLESEN ; Warten, bis neue Zeile beginnt
          +->WARTE

VORLESEN  := VCC -> EINLESEN       ; Read fuer Fifo setzen
EINLESEN  := VCC -> SHIFT1         ; Daten vom Fifo uebernehmen
                                   ;  Bit 3 als Pixel ausgeben
SHIFT1    := VCC -> SHIFT2         ; Bit 2 als Pixel ausgeben
SHIFT2    := 2SHIFT3H -> SHIFT3_H  ; Read fuer Fifo ruecksetzen
          +->SHIFT3_NH             ; Bit 1 als Pixel ausgeben
                                   ;  Bei Hsync in Vor-Wartezustand gehen
                                   ;  sonst neues Byte aus Fifo lesen
SHIFT3_H  := VCC -> WARTE          ; Bit 0 als Pixel ausgeben
                                   ;  danach in Wartezust. auf neue Zeile
SHIFT3_NH := VCC -> EINLESEN       ; Bit 0 als Pixel ausgeben
                                   ;  Danach neu einlesen, Read fuer Fifo
                                   ;  ist wieder gesetzt
; State definition
; READ zugleich Lese-Signal fuer das Fifo

WARTE      = /READ * /SHIFT * /ST0
VORLESEN   =  READ * /SHIFT * /ST0
EINLESEN   =  READ *  SHIFT * /ST0
SHIFT1     =  READ *  SHIFT *  ST0
SHIFT2     = /READ *  SHIFT * /ST0
SHIFT3_H   = /READ *  SHIFT *  ST0
SHIFT3_NH  =  READ * /SHIFT *  ST0
Conditions

2VORLESEN   = RESET_X   ; Neue Zeile beginnt mit Reset_X
2SHIFT3H    = H_BIT     ; Ende der Aktivitaet, wenn in Byte H-Bit gesetzt

EQUATIONS
MINIMIZE_ON

; Schieberegister fuer Pixel-Daten
SER := READ * /SHIFT * BIT3 + SHIFT * FF2   ; Laden + Schieben
FF2 := READ * /SHIFT * BIT2 + SHIFT * FF1   ; Laden + Schieben
FF1 := READ * /SHIFT * BIT1 + SHIFT * FF0   ; Laden + Schieben
FF0 := READ * /SHIFT * BIT0                 ; Laden

; H-Sync setzen, wenn Daten gelesen werden, sonst Halten des Zustands
H_BIT :=  READ * BIT6  +  /READ * H_BIT
In LM3 (IC 8) sind zwei unabhängige State-Machines enthalten. Da die Syntax des verwendeten Assemblers aber nur eine State-Machine zuläßt, ist die zweite in Form von Gleichungen angegeben, die vorher übersetzt wurden. Die erste State-Machine generiert das überlappende Acknowledge, während die zweite in einem Zähler auf das Ende eines Bytes wartet. Das unterdrückt mehrere Bestätigungen für ein Byte.

TITLE     IC 8 = LM_3_GAL
CHIP      GAL3 PALCE16V8

;PINS
; 1    2           3     4    5   6   7   8   9      10
  CLK  LinkIn      Qack  /FF  nc  nc  nc  nc  Reset  GND

; 11   12          13    14   15  16  17  18  19     20
  /OE  LinkOutNew  ST0   nc   C0  C1  C2  C3  nc     VCC

STATE
MOORE_MACHINE
;Transitions
; WAIT ist der allgemeine Ruhezustand
; COUNTn Zustaende des Zaehlers für die Wartezeit bis zur Freigabe
; des vorgezogenen (ueberlappenden) Acknowledge

WAIT        := nBitsWaited  -> PRETRIGGER
            +->WAIT

PRETRIGGER  := ReadyForACK  -> ACKout
            +  Reset        -> WAIT
            +->PRETRIGGER

ACKout      := VCC          -> WAIT
DoNotUse    := VCC          -> WAIT

; State definition

WAIT       = /LinkOutNew  * /ST0
PRETRIGGER = /LinkOutNew  *  ST0
ACKout     =  LinkOutNew  *  ST0
DoNotUse   =  LinkOutNew  * /ST0

Conditions

nBitsWaited = /C3 *  C2 *  /C1 *  C0 * /Reset ;erst mal 5 Bits gewartet
ReadyForACK = /FF * /Reset

EQUATIONS
MINIMIZE_ON
;  Zaehler bis 10, der auf LinkIn startet

     C0  :=    C2 *             /C0 * /Reset
         +     C3 *       /C1 * /C0 * /Reset
         +    /C3 * /C2 * /C1 * /C0 * LinkIn
         +    /C3 *        C1 * /C0 * /Reset
     C1  :=   /C3 *        C1 * /C0 * /Reset
         +                /C1 *  C0 * /Reset
     C2  :=  /Reset *  C2 *       /C0
         +   /Reset * /C2 *  C1 *  C0
         +   /Reset *  C2 * /C1
     C3  :=  /Reset *  C2 *  C1 *  C0
         +   /Reset *  C3 * /C1
LM4 (IC 9) leitet den Pixeltakt aus dem 20-MHz-Takt-Oszillator (Q 1) ab. Es werden sowohl 6,6 (default) als auch 10 MHz erzeugt (mit JP 3 wählbar). Achtung: Damit läßt sich die Bildbreite verändern, die Zeit für eine Videozeile wird davon nicht beeinflußt. Zusätzlich stellt LM4 den 5-MHz-Takt für den Link-Adapter bereit.

TITLE     IC 9 = LM_4_GAL
CHIP      GAL3 PALCE16V8

;PINS
; 1     2      3     4     5     6     7     8     9    10
 CLK   nc     nc    nc    nc    nc    nc    nc    nc   GND

; 11   12     13    14    15    16    17    18    19    20
 /OE   C0    /C1    D1    D0    nc    nc    nc    nc   VCC

STATE
MOORE_MACHINE
; Transitions

COUNT0    := VCC -> COUNT1
COUNT1    := VCC -> COUNT2
COUNT2    := VCC -> COUNT0

; State definition

COUNT0     = /C1 * /C0
COUNT1     = /C1 *  C0
COUNT2     =  C1 * /C0

Conditions
; nix

EQUATIONS
MINIMIZE_ON

D0 := /D0                      ;D steht für Divide
D1 :=  D0 * /D1 + /D0 *  D1
Kasten 2

Stückliste

Halbleiter

IC1    AM26LS32, Diff.-Empfänger
IC2    AM26LS31, Diff.-Treiber
IC3    IMSC011, Link-Adapter
IC4    GAL 16V8 (LM2)
IC5    74HCT4040, Zähler
IC6    IDT7202, Fifo
IC7    GAL 20V8 (LM1)
IC8    GAL 16V8 (LM3)
IC9    GAL 16V8 (LM4)
UREG   7805, Spannungsregler
Q1     20-MHz-Quarz-Oszillator
TR1    BC547B (NPN)
GLEICH Brückengleichrichter
D1, D2 1N4148, Si-Diode
GELB   LED gelb, 3 mm
GRUEN  LED grün, 3 mm
ROT    LED rot, 3 mm
Kondensatoren

C1, C2, C5 1µF/35V, Tantal
C3         150pF, ker.
C4         470µF/25V
C6         100nF, ker.
Widerstände 0,25 W

R1, R2     1K0
R3, R13    100R
R4         10K
R5         100K
R6, R15    330R
R7, R8, R9 2K2
R10, R11   2K7
R12        8K2
R14        75R
R16        470R
Sonstiges

JP1, JP2,JP3 Steckpfosten 3polig
J1,J2        9pol Sub-D weiblich
J3           Cinch-Buchse (Printmontage)
J7           Fremdspannungsbuchse
             (DIN45323, Printmontage)
Platine Europa-Format

Kasten 3


In `sauberem´ Occam benutzt man brav reine Kanalkommunikation und ein PRI-ALT-Konstrukt für Bearbeitung und Ausgabe des Bildinhaltes.

      WHILE TRUE
        BYTE Befehl:
        PRI ALT
          zeit ? AFTER jetzt PLUS BEFEHLS.ZEIT
            SEQ
              to.L2M ! Bildspeicher1
              zeit ? jetzt
          Command.in ? Befehl
            BYTE Char, Farbe, Richtung:
            INT  x, y, x.Ziel, y.Ziel:
            IF
              Befehl = CLEAR.SCREEN
                Clear.screen()
              Befehl = ...
                ...
                ...
              TRUE
                SKIP
Kasten 4
Schneller, aber eigentlich `nicht statthaft´: mittels PLACE AT wird ein `Bildspeicher´ eingerichtet, auf den zwei parallele Prozesse gemeinsam zugreifen.

PROC l2m.sender(CHAN OF ANY to.L2M)

  #INCLUDE "L2M_VALS.INC"

  [((PIC.SIZE + VORSPANN) + NACHSPANN) + VSYNC.LAENGE] BYTE Bild:
  PLACE Bild AT BILDADRESSE:  -- diese Stelle ist nicht astrein

  WHILE TRUE
    to.L2M ! Bild
:

PROC LL.Interpreter(CHAN OF ANY Command.in, Response.out)

  #INCLUDE "L2M_VALS.INC"

  [((PIC.SIZE + VORSPANN) + NACHSPANN) + VSYNC.LAENGE] BYTE Bildspeicher:
  PLACE Bildspeicher AT BILDADRESSE:  -- diese Stelle ist nicht astrein

  WHILE TRUE
    SEQ
      Command.in ? Befehl
      IF
        Befehl = CLEAR.LINE
          SEQ
            Command.in ? y
            Clear.line(y)
        Befehl = ...
          ...
          ...
        TRUE
          SKIP
:

  PLACE to.L2M AT 1:
  PRI PAR
    l2m.sender(to.L2M)
    PAR
      user.program(from.link, to.link, hl.to.user, user.to.hl)
      HL.Interpreter(user.to.hl, hl.to.user, hl.to.ll, ll.to.hl)
      LL.Interpreter(hl.to.ll, ll.to.hl)
: