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_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 * 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
SKIP
Kasten 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)
: