3. Erweiterung Morse De- und Encoder um eine SD-Karten Schnittstelle mittels SPI in VHDL

Autoren: Vesa Halili, Alex Apt

Einführung

Der folgend vorgestellte Code wurde im Rahmen einer Projektarbeit des Moduls Entwurf digitaler Systeme bei Herrn Prof. Dr. Udo Jorczyk erarbeitet und basiert ebenfalls auf dem Projekt Morse De- und Encoder mittels FPGA von Herrn Nessitt. Hierbei wurde eine SD-Karten-Schnittstelle mittels Spi realisiert. Als Vorlage diente das Projekt „SimpleSDHC“ von ibm2030 aus Github (https://github.com/ibm2030/SimpleSDHC.git). Das Ziel des Projekts war es die über eine Tastatur eingegeben Zeichen in ASCII-Zeichenformat auf die SD-Karte zu schreiben und diese auszulesen und als morsedecodiertes Signal über die Soundausgabe auszugeben.
Die Realisierung erfolgt hauptsächlich in drei Dateien. Die sd_spi Datei aus dem Projekt SimpleSDHC enthält das Protokoll zur Kommunikation mit der SD-Karte. Mithilfe der sd_card Datei erfolgt die Synchronisation und Kommunikation zwischen der Keyboard_Encoder Datei und der sd_spi Datei. Über die Keyboard_Encoder Datei erfolgt, für das Schreiben in die SD-Karte, das Übersetzen der Eingabe des Anwenders in das ASCII-Zeichenformat und für das Auslesen der SD-Karte, die Umwandlung der ASCII-Zeichen in das morsecodierte Signal.

sd_spi Datei

Für unser Projekt haben wir einige Veränderung an der Datei vorgenommen die wir hier kurz erläutern.

Ursprünglich wurde in der Datei mit einem 25 MHz Takt gearbeitet. Da wir jedoch mit einem 50 MHz Takt arbeiten, muss der Parameter slowClockDivider dementsprechend angepasst werden.

Quellcode - Anpassung 25 MHz auf 50 MHz

In dem Projekt wurde ausschließlich mit einem asynchronen Reset gearbeitet, da dieser Taktunabhängig gesetzt werden kann. Dementsprechend haben wir den Prozess nach diesem Kriterium angepasst.

Quellcode - Anpassungen der sd_spi Datei

sd_card Datei

Wie bereits erwähnt, dient diese Datei zur Synchronisation zwischen der sd_spi und der keyboard_encoder Datei. Mithilfe einer Finite-state maschine (FSM) werden je nach Zustand die entsprechenden Flags gesetzt. Von hier aus kann ein Initialisierungs-, Lese- oder Schreibprozess gestartet werden. Zudem wird der keyboard_encoder-Datei unter anderem mitgeteilt, wann ein Byte zu Ende gelesen wurde.

Quellcode - sd-card Datei

Keyboard_Encoder Datei

Die eingegeben Zeichen sollen in jeweils einer Speicherzelle der SD-Karte abgelegt werden. Dafür müssen die Keyboard-Eingaben in ASCII-Zeichen umgewandelt werden. Dies erfolgt im Prozess „token_generation“.

Quellcode - token generation

In dem Prozess Audio wurde zusätzlich zum Buchstaben- und Wortmodus ein SD-Karten Modus eingebaut. In den SD-Karten Modus gelangt man, indem man Switch 15 betätigt (Switch oben). Daraufhin erfolgt die Initialisierung, die erfolgreich ist, sobald die LED über den Switch aufleuchtet. Im Anschluss kann zwischen dem Modus Lesen und Schreiben mithilfe von Switch 16 gewechselt werden. Ist der Switch oben, kann gelesen werden und die Tonausgabe erfolgt. Diese kann durch das Betätigen der Enter-Taste wiederholt werden. Ist der Switch unten, kann das Schreiben über das Keyboard erfolgen und mit Enter bestätigt werden. Ist der Lese bzw. der Schreibprozess erfolgreich gewesen, so leuchtet die LED über den Switch auf.

Quellcode - Audio Prozess

Da der Prozess „setState“ in sd_card mit einem anderen Takt als der Prozess „audio“ in keyboard_encoder läuft, wurde die Sensitivitylist um die Signale sensitivityFlag, writeFinish und readFinish2 erweitert. Durch diese wird das kontinuierliche Lesen/ Schreiben aus/in die SD-Karte vermieden.

Quellcode - Erweiterung der Sensitivitylist

Fazit und Ausblick

Im Rahmen der Projektarbeit ist es uns gelungen, über die Tastatur in die SD-Karte schreiben zu können, ohne den internen RAM des Boards als Zwischenspeicher zu verwenden. Das Auslesen der Zeichen sowie die morsecodierte Soundausgabe funktioniert für drei Bytes, also drei Zeichen. Das Problem, dass beim Auslesen der darauf folgenden Bytes auftritt, konnte aufgrund mangelnder Zeit nicht behoben werden. Jedoch stellen wir einen möglichen Lösungsansatz zur Verfügung.

Zwischen dem Auslesen von zwei Bytes darf maximal die Zeit, die für das Auslesen von einem Byte benötigt wird, liegen. In dieser Zeit erfolgt parallel die Soundausgabe, die abgeschlossen werden muss, bevor das nächste Byte gelesen wird. Diese überschreitet jedoch die Dauer für das Auslesen von einem Byte. Um das Problem zu beheben, muss der Parameter slowClockDivider für den Leseprozess angepasst werden, sodass die SD-Karte mit einem langsameren Takt ausgelesen wird. 

Downloads

Projektdokumentation