*****************************************************************
*  								*
* parout16 - 	16 digitale Ausgaenge ueber die parallele	*
*		Schnittstelle steuern.				*
*								*
* System:	Xilinx XC9536 (VHDL)				*
*								*
* Version:	1.0						*
* Status:	stabil,einsetzbar				*
* 								*
* Autor:	Joerg Wolfram (joerg@jcwolfram.de)		*
*								*
* Lizenz:	GPL und FDL					*
*****************************************************************

Die Programme unteliegen der GPL (Gnu Public License) Version 2
oder spaeter und die Dokumentation der Hardware der FDL 
(Free Document License). Ich uebernehme ausdruecklich keinerlei
Haftung fuer die Richtigkeit und Funktionsfaehigket der im
Projekt enthaltenen Informationen. 


1.Hardware
==========
Das Projekt realisiert 16 ueber die parallele Schnittstelle 
steuerbare Ausgaenge mit einem XC9536 CPLD. Dabei kann die Ausgabe
mit einem externen Signal synchronisiert werden. Eine Anpassung an
vergleichbare Architekturen sollte ohne weiteres moeglich sein.

Folgende Resourcen werden bei der realisierten Implementierung
belegt:

Makrozellen: 	36/36 	(100%)
Register:	33/36	(92%)
Produktterme:	141/180	(78%)
Signale:	66/72	(92%)
PIN's		27/34	(79%)

Globaler Takt:		1/3	2 als IO
Globaler Tristate:	0/2	2 als IO
Globaler Reset:		1/1

Inwieweit die Belegung der PIN's des CPLD geaendert werden kann,
habe ich nicht untersucht, ohne die Nutzung von globalem Takt
(GCK1) und globalem Reset(GSR) liess es sich trotz aller Optimierungen
nicht fitten.
Auf der "Eingangsseite", die direkt mit der parallelen Schnittstelle 
verbunden wird, sind folgende Signale notwendig:

+---------------------------------------------------------------+
| Signal	CPLD (PLCC44)	CPLD (TQFP44)	DSUB-Stecker	|
+---------------------------------------------------------------+
| strobe	 5	 	 43		 1	 	|
|  D0		 6	 	 44		 2		|
|  D1		 7	 	  1		 3		|
|  D2		 8	 	  2		 4		|
|  D3		 9	 	  3		 5		|
|  D4		11	 	  5		 6		|
|  D5		12	 	  6		 7		|
|  D6		13	 	  7		 8		|
| busy		18		 12		11		|
+---------------------------------------------------------------+

Die 16 Ausgangssignale sind LOW-aktiv, werden HIGH-aktive Signale
benoetigt, muss in der Datei "datareg01.vhd" in Zeile 43 das "not"
vor "invalue" entfernt werden. Ausserdem muessen der Bitvektor "1..."
in Zeile 86 der Datei "main.vhd" in "0..." geaendert werden und
die INIT-werte fuer die Ausgaenge "relais<x>" in der ucf-Datei
auf "0" gesetzt werden.  

+-----------------------------------------------+
| Signal	CPLD (PLCC44)	CPLD (TQFP44)	|
+-----------------------------------------------+
| Out  0	19	 	 13		|
| Out  1	20	 	 14		|
| Out  2	22	 	 16		|
| Out  3	24	 	 18		|
| Out  4	25	 	 19		|
| Out  5	26	 	 20		|
| Out  6	27	 	 21		|
| Out  7	28	 	 22		|
| Out  8	29	 	 23		|
| Out  9	33	 	 27		|
| Out 10	34	 	 28		|
| Out 11	35	 	 29		|
| Out 12	40	 	 34		|
| Out 13	42	 	 36		|
| Out 14	43	 	 37		|
| Out 15	44	 	 38		|
+-----------------------------------------------+

Zusaetzlich gibt es noch zwei Signale zur Steuerung. Das RESET-Signal
setzt bei LOW-Pegel alle Ausgaenge auf HIGH (bzw. LOW). 
Zwar geschieht das auch bei der Initialisierung, aber das Signal kann
zum Beispiel als Zangs-Aus Signal genutzt werden.
Um die Ausgabe mit externen Komponenten zu synchronisieren (z.B.
fuer Phasenanschnittsteuerungen), kann ein Busy-Signal auf der
parallelen Schnittstelle generiert werden, welches erst mit der
steigenden Flanke des TRIGGER-Signals wieder deaktiviert wird.

+-----------------------------------------------+
| Signal	CPLD (PLCC44)	CPLD (TQFP44)	|
+-----------------------------------------------+
| /RESET	39	 	 33		|
| TRIGGER	38	 	 32		|
+-----------------------------------------------+


2.Ansteuerung
=============
Die Ansteuerung erfolgt mit einfachen Klartext ueber die parallele
Schnittstelle. Es werden nur 7 Bit ASCII ausgewertet. 
Folgende Funktionen sind realisiert:

0...9	Uebernahme in das niedrigste Nibble, vorhandene Daten-Nibbles
	werden zum naechsthoeheren Nibble weitergeschoben. Die Daten
	aus dem hoechstwertigen Nibble gehen verloren. 

A...F	Uebernahme in das niedrigste Nibble, vorhandene Daten-Nibbles
a...f	werden zum naechsthoeheren Nibble weitergeschoben. Die Daten
	aus dem hoechstwertigen Nibble gehen verloren. 

*	Uebernahme der Daten in die Ausgaenge. Das Busy-Signal wird
	nicht aktiviert.
	
+	Uebernahme der Daten in die Ausgaenge. Das Busy-Signal wird
	aktiviert und erst bei steigender Flanke des TRIGGER-Signals
	wieder deaktiviert. Dadurch haelt der steuernde PC die Ausgabe
	bis zur Synchronisation an. Dabei darf das Timeout fuer die
	parallele Schnittstelle nicht ueberschritten werden.


3.Beispiele
===========	
Zum Testen koennen die Daten mit folgendem Befehl (Konsole) an die
parallele Schnittstelle gesendet werden (Voraussetzung sind natuerlich
Schreibrechte auf /dev/lp0)

    echo "daten" > /dev/lp0  


"8001*"	setzt das hoechstwertige (MSB) und das niederwertigste 
	Bit (LSB)

"8001+" setzt das hoechstwertige (MSB) und das niederwertigste 
	Bit (LSB), danach wird auf eine steigende Flanke des
	TRIGGER-Signals gewartet.
	
"f*"	setzt die untersten 4 Bits und schiebt die anderen um 
	4 Stellen nach nach links (oben).
	
"00*"	loescht die untersten 8 Bits und schiebt die anderen um 
	8 Stellen nach nach links (oben).
		    

"0000+0001+0002+0003+0004+0008+0010+0020+0030+0040+0080+0000*"	

liegt an TRIGGER ein Taktsignal an, haben wir so ein einfaches "Lauflicht"
programmiert.
