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.
Ü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.
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.
Ü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.
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.
Ein Link-Adapter übersetzt den seriellen Datenstrom vom Transputer `ins Parallele´. Vier Pixel, Intensität und die Synchron-Signale stekken in jedem Datenwort.
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.
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.
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).
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.
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.
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.
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)
[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
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 * QACKGAL 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_BITIn 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 * /C1LM4 (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 * D1Kasten 2
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 mmKondensatoren
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 470RSonstiges
JP1, JP2,JP3 Steckpfosten 3polig J1,J2 9pol Sub-D weiblich J3 Cinch-Buchse (Printmontage) J7 Fremdspannungsbuchse (DIN45323, Printmontage) Platine Europa-Format
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 SKIPKasten 4
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) :