FPGA-basiertes DMX512-Interface

Seit ein paar Jahren beschäftige ich mich mit FPGAs, was die Kurzform für Field-Programmable-Gate-Array ist. Während Mikrocontroller fest aus in Silizium gegossenen Schaltkreisen bestehen, können FPGAs so ziemlich alles sein, was man sich digital vorstellen kann: ein einfaches Logikgatter (UND, OR, XOR, NOR, etc.), über etwas komplexere Lookup-Tabellen bishin zu höchstkomplexen digitalen Filtern wie FIR- und IIR-Filter für die Audiosignalverarbeitung mit einer kürzestmöglichen Latenz.

Auch für die Lichttechnik kann man FPGAs gut einsetzen. So habe ich vor einiger Zeit einen DMX512-Sender in VHDL entwickelt, der nahezu beliebig oft in einen günstigen FPGA eingesetzt werden kann. Die Logik gibt dabei ein USITT-kompatibles DMX512-Signal aus. Die DMX512-Timings können über die generischen Parameter angepasst werden. Die Standard-Timing-Parameter lauten dabei gemäß der USITT-Vorgaben wie folgt:

DescriptionParameter
Breaktime (t_min)88 µs
Mark after Break8 µs
Inter-Byte-Time0 µs
Mark before break time0 µs
Refresh-Rate44 Hz

Da einige Geräte nicht mit der kurzen Inter-Byte-Zeit oder anderen schnellen Parametern kompatibel sind, gibt es eine Reihe von Parametern, die kompatibler und weniger anspruchsvoll sind:

DescriptionParameter
Breaktime (t_min)242 µs
Mark after Break100 µs
Inter-Byte-Time40 µs
Mark before break time12 µs
Refresh-Rate23 Hz

Bei mir haben die folgenden Einstellungen auf allen Geräten sehr gut funktioniert:

DescriptionParameter
Breaktime (t_min)96 µs
Mark after Break9 µs
Inter-Byte-Time0 µs
Mark before break time21 µs
Refresh-Rate44 Hz

VHDL-Logik und Realisierung im FPGA

Hier findet ihr den gesamten VHDL-Teil zum Download: DMX512 Transmitter

Bislang habe ich gern das Arduino MKR Vidor 4000 Board als Grundlage verwendet. Hier hat das Arduino-Team einen FPGA von Intel (Cyclone 10LP) zusammen mit einem ESP32 und einem Microchip/Atmel SAMD21 Cortex-M0-Prozessor auf einem Board vereint. Das hat die ganze Sache recht einfach gemacht. Leider wurde das Board abgekündigt und kann wohl in naher Zukunft nicht mehr bezogen werden. Es gibt aber Alternativen von Trentz-Electronics (das CYC1000) oder andere Boards mit einem Lattice FPGA (z.B. das Lattice iCE40UP5K FPGA Development Board).

Die eigentliche Elektronik ist dabei unglaublich einfach umzusetzen: es braucht lediglich einen SN75176 RS485-Treiber-IC, drei Widerstände und eine XLR-Buchse – das wars. Die gesamte Magie, das RAM für die einzelnen Kanalwerte und die Timingerzeugung geschieht dabei im FPGA.

Wer Interesse an diesem Projekt hat, kann auf meiner GitHub-Seite zum X/FBAPE-Projekt mehr Informationen finden: X/FBAPE