16-Kanal Digitalausgabe über die parallele Schnittstelle
Version 1.0
1. Grundsätzliches und Lizenz
Die Programme unteliegen der GPL (Gnu Public License) Version 2 oder später und die Dokumentation der Hardware der FDL (Free Document License). Ich übernehme ausdrücklich keinerlei Haftung fuer die Richtigkeit und Funktionsfähigket der im Projekt enthaltenen Informationen.
Alle genannten Marken sind Eigentum des jeweiligen Markeninhabers.

2. Projekt-Steckbrief
Name: parout16
Funktion: 16 digitale Ausgänge über die parallele Schnittstelle steuern.
System: Xilinx XC9536 (VHDL)
Status: stabil, einsetzbar

3. Hardware
Das Projekt realisiert 16 über die parallele Schnittstelle steuerbare Ausgänge mit einem XC9536 CPLD. Dabei kann die Ausgabe mit einem externen Signal synchronisiert werden. Eine Anpassung an vergleichbare Architekturen sollte ohne weiteres möglich 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's27/34(79%)
Globaler Takt:1/32 als IO
Globaler Tristate:0/22 als IO
Globaler Reset:1/1

Inwieweit die Belegung der PIN's des CPLD geändert werden kann, habe ich nicht untersucht, ohne die Nutzung von globalem Takt (GCK1) und globalem Reset(GSR) liess sich das Design 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 benötigt, muss in der Datei "datareg01.vhd" in Zeile 43 das "not" vor "invalue" entfernt werden. Ausserdem müssen der Bitvektor "1..." in Zeile 86 der Datei "main.vhd" in "0..." geändert werden und die INIT-werte für 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

Zusätzlich gibt es noch zwei Signale zur Steuerung. Das RESET-Signal setzt bei LOW-Pegel alle Ausgänge auf HIGH (bzw. LOW). Zwar geschieht das auch bei der Initialisierung, aber das Signal kann zum Beispiel als Zwangs-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

4. Ansteuerung
Die Ansteuerung erfolgt mit einfachen Klartext über die parallele Schnittstelle. Es werden nur 7 Bit ASCII ausgewertet.
Folgende Funktionen sind realisiert:

0...9 Übernahme in das niedrigste Nibble, vorhandene Daten-Nibbles werden zum naechsthöheren Nibble weitergeschoben. Die Daten aus dem höchstwertigen Nibble gehen verloren.
A...F
a...f
Übernahme in das niedrigste Nibble, vorhandene Daten-Nibbles werden zum naechsthöheren Nibble weitergeschoben. Die Daten aus dem höchstwertigen Nibble gehen verloren.
* Übernahme der Daten in die Ausgänge. Das Busy-Signal wird nicht aktiviert.
+ Übernahme der Daten in die Ausgänge. Das Busy-Signal wird aktiviert und erst bei steigender Flanke des TRIGGER-Signals wieder deaktiviert. Dadurch hält der steuernde PC die Ausgabe bis zur Synchronisation an. Dabei darf das Timeout für die parallele Schnittstelle nicht ueberschritten werden.

5. Beispiele
Zum Testen können die Daten mit folgendem Befehl (Konsole) an die parallele Schnittstelle gesendet werden (Voraussetzung sind natürlich Schreibrechte auf /dev/lp0):
  • echo "daten" > /dev/lp0
8001* setzt das höchstwertige (MSB) und das niederwertigste Bit (LSB)
F000+ setzt die 4 höchstwertigen Bits, danach wird auf eine steigende Flanke des TRIGGER-Signals gewartet.
3* setzt die untersten 2 Bits und schiebt die anderen um 4 Stellen nach nach links (oben).
00+ löscht die untersten 8 Bits und schiebt die anderen um 8 Stellen nach nach links (oben), danach wird auf eine steigende Flanke des TRIGGER-Signals gewartet.
  • echo "0000+0001+0002+0003+0004+0008+0010+0020+0030+0040+0080+0000*" > /dev/lp0
liegt an TRIGGER ein Taktsignal an, haben wir so ein einfaches "Lauflicht" programmiert.

6. Compilierung mit vhdl2cpld
Das Projekt besteht aus mehreren Dateien im Verzeichnis "src". Das Contraints-File plcc44.ucf enthält die PIN-Belegung für die PLCC-Version. Soll die Version im VQFP-Gehäuse benutzt werden, müssen die Datei plcc44.ucf in z.B. plc44.ucx sowie die Datei vqfp44.ucx in vqfp44.ucf umbenannt werden.
Bei der PLCC-Version reicht es aus, im "src"-Verzeichnis
  • vhdl2cpld
aufzurufen. Bei der VQFP-Version muss noch die Option für die andere Gehäuseform angegeben werden:
  • vhdl2cpld -type XC9535-5-VQFP44
7.Download