Autoren: Lukas van Buer, Alexander Kramer
Einleitung
Im Rahmen unserer Projektarbeit im Fach „Entwurf digitaler Systeme“ sollte auf einem FPGA Entwicklungsboard ein Morse De- sowie Encoder umgesetzt werden. Hierzu wurde eine Ausarbeitung als Vorlage aus einer Abschlussarbeit zur Verfügung gestellt (Morse De- und Encoder mittels FPGA Nessit). Auf Grundlage dieser Vorlage sowie mit Integration von bereits bestehender Teilprojekten von Kommilitonen (insbesondere Tim Michalek und Nina Häselhoff) wurden weitere Morsefunktionen umgesetzt. Von Kommilitonen wurde zum Beispiel bereits VGA, SD-Karte, UART sowie ein Mikrofoneingabe integriert und somit große Teile der Schnittstellenanbindungen des FPGAs abgedeckt.
Das folgende Bild stellt eine Übersicht über die Funktionen des Morsecoders dar.

Laserintegration
Der herkömmliche Morsecode wird über viele verschiedene Medien übertragen. Hierbei spielte auch das Lichtmorsen eine größere Rolle in der Schifffahrt. Zu der Übertragung auf See wurden hierbei Scheinwerfer mit Blenden verwendet, um kurze und lange Signale zu übertragen. In unserem ersten Projektteil wird das Morsesignal neben der Audioausgabe auch über ein Laser ausgegeben, der mit einem Photoresistor am Empfänger-Arduino interagiert. Die Ausgabe des Signals erfolgt über den GPIO AB22. An diesem Pin liegen 3.3V an. Diese Spannung ist für unser Lasermodul KY-008 ausreichend um Lichtsignale durch den gesamten Raum zu senden.

Zum Senden des Morsesignals wird das im morse_codec definierte Signal sound an die light-Entity übergeben. Hier geht das Signal am Pin encoded_signal ein und wird, bei aktiviertem Lasermodus an den GPIO-Output übergeben.
Quellcode - ENTITY light-IS
Das ausgehende Lasersignal kann anschließend von einem am Arduino geschalteten Photoresistor empfangen und durch eine pyramidenförmig aufgebaute Tabelle ausgewertet werden. Der Aufbau des Morsecodes lässt sich wie folgt darstellen und verarbeiten.

Im Arduino-Code lässt sich dies wie folgt beschreiben.
Quellcode - Morsetree
Hierbei verändert ein einkommendes Dit den codePointer um codePointer = (2*CodePointer) + 1 und jedes eingehende Dah resultiert in einer Änderung von codePointer = (2*codePointer*) + 2. Durch eine lange Pause ergibt sich ein Wortende und es wird der Buchstabe innerhalb des MorseTrees mit dem codePointer definiert und ausgegeben. Neben dem Empfangen des Laser-Morsesignals wurde auch das Senden von Morse-Code implementiert. Hierbei wurde auf die Library cww_MorseTx.h zurückgegriffen. Hierfür werden die Eingaben im Seriellen Monitor zunächst im Char-Typen verarbeitet und in einer Case-Struktur ausgegeben.
Quellcode - Case Struktur
Diese einfache Möglichkeit Morsecode zu senden ermöglicht es auch, das FPGA in schnelleren WPM Modis zu testen, ohne auf seine eigenen Morsefähigkeiten vertrauen zu müssen. Die Detektion des vom Arduino ausgesendeten Lasersignals erfolgt ebenfalls in der light.vhd. Hierfür wird das aktuell am GPIO AB21 anliegende Signal des Photoresistors an das Signal laser_val übergeben. Dieses wird in der Entitiy morse_signal_decoder im clockWPM Takt abgetastet und auf das Shiftregister übertragen.
Quellcode - Übertragung in das Schriftregister
Dieses Shiftregister wird in einem gleichzeitig zum Prozess umgesetzten Abfrage in entsprechende DAH, DIT oder Pausen umgewandelt.
Quellcode - Umsetzung des Schriftrgisters
Diese Tokens können anschließend von dem Entity morse_codec.vhd weiterverarbeitet werden. Auf diese Umwandlung des eigentlichen Symbols wird im zweiten Projektteil eingegangen.
Zur Simulation der light.vhd wurde eine Testbench tb_light.vhd erstellt und die resultierenden Waveforms in Modelsim analysiert. Es ergibt sich für den Testprozess („ABC“).

Integration des Klopfcodes
Neben der Codierung über den Morsecode gibt es auch noch weitere Kodierungsmöglichkeiten mit anderen Alphabet-Verschlüsselungen. Der Klopfcode ist hierbei eine Möglichkeit Textnachrichten Buchstabe für Buchstabe zu codieren. Anders als im Morse Code wird ein Buchstabe aus zwei Abfolgen von Klopftönen zusammengesetzt. Diese Klopftöne müssen erfasst und anschließend in einer Tabelle ausgewertet werden. Im römischen Alphabet des Klopfcodes sind 25 Zeichen definiert. Das C und K teilen sich hierbei das Signal mit den Werten 1 , 3.

Zur Detektion dieser Klopfmuster wurde ein Klopfmodus integriert, der über einen Switch am FPGA eingeschaltet werden kann. Dieser Switch ändert die Programmabläufe massiv, um die Detektion von zweier Klopfabfolgen zu kombinieren und diese anschließend als ein einzelner Buchstabe auszugeben. Zur Ausgabe dieser Zeichen wurde ein Klopftoken-System (nachfolgender Code) entwickelt, dass es ermöglicht, möglichst nahe am Morsecode zu bleiben, um die Länge des Programms und auch den Hardwareaufwand gering zu halten. In diesem Tokensystem setzt sich jeder Buchstabe aus zwei Token zusammen, die jeweils Zeilen oder Spaltenwert repräsentieren. Diese werden anschließend nacheinander abgefragt und ausgegeben. Die Umsetzung dieser Ausgabe ist im folgenden Flussdiagramm beschrieben.

Quellcode - Klopfmodus
Zum Empfangen des Klopfcodes wird ebenfalls die bereits bestehenden Auswertungen des Morsecodecs verwendet. Somit erzeugt das Shift-Register aus den eingehenden Signalen die Token-Signale: dah_low, dit_high, dah_high und word_end. Diese werden, wie in Abbildung 7 dargestellt verarbeitet, um beide Klopfsignal nacheinander zur LCD-Entity weiterzugeben. Die LCD-Entity detektiert die eingehenden Klopfsignale und gibt nach dem Erhalt von Zeilen- und Spaltenwert den Datenbereich an das LCD weiter.

Fazit und Ausblick
Das bereits bestehende Morseprogramm von Herr Nessit konnte erfolgreich erweitert werden. Hierbei ist es uns in der von uns erstellten Erweiterung des VHDL-Programms gelungen Lichtsignale vollständig einzubinden und einen Modus für eine alternative Klopfverschlüsselung zu integrieren. Schwierigkeiten, die nacheinander eingehenden Klopfsignale in einem getakteten Prozess zu bündeln und auszugeben konnten erfolgreich gelöst werden. Als Ausblick für diese Umsetzung des Klopfmodus ist eine weitere Verschlüsselungsstufe denkbar. So könnte die gegebene Klopftabelle je nach „Passwort“ veränderlich sein, um eine noch stärker codierte Übertragung zu ermöglichen.