Das Mojo-Board mit einem Xilinx-FGPA Spartan 6 ist nicht nur ein preiswertes und ausgezeichnet gemachtes Stück Hardware sondern eignet sich auch hervorragend als Ergänzung für ein mobiles DGPS-System. Es verbraucht extrem wenig Strom und hat ausreichend Rechenpower, um ein eventuell nötiges Preprocessing der GNSS-Daten durchzuführen. Beispielsweise kann ein FPGA für einen Kalmen-Filter (pdf) – oder ein Complementary Filter – verwendet werden. Neben einem GPS-Receiver lässt sich gleichzeitig an den Analog-Ports auch ein Accelerometer anschliessen.
Allerdings ist der Weg zu einem ersten Programm extrem steinig. Die Xilinx-Suite ist nicht unbedingt die beste Wahl für die Entwicklung der Module. Für die meisten Entwicklungen dürfte sich das sperrige und riesige Paket schlecht in den Workflow integrieren lassen.
Nach etlichen Stunden Recherche steht jetzt eine vernünftige Umgebung: Xilinx läuft unter Linux (in unserem Falle in einer VirtualBox) und das Flashen des Boards findet unter MacOSX auf einem anderen Rechner am Arbeitsplatz statt.
Notwendig dafür war eine Anleitung eines FPGA-Experten, wie man die Xilinx-Commandline-Tools verwendet (pdf). Darin ist neben den Tools selbst auch beschrieben, wie man die notwendigen Shell-Variablen setzen muss und wie man in einem Projekt an die jeweilige Syntax kommt. Es zeigt sich jedoch, dass man eine teils erheblich längere Build-Zeit einkalkulieren muss, oder die Scripte anpassen sollte, da sie immer alle Schritte komplett durchführen auch, wenn sich bestimmte Sachen nicht geändert haben.
Die Überspielung des Bitstreams kann statt mit dem vorgegebenen Mojo-Loader (src), der eine aktuelle JVM voraussetzt auch mit einem Python-Programm erfolgen. Im Mojo-Forum war der User mogorman so nett ein Script zu veröffentlichen, das dies sowohl unter Linux als auch unter MacOSX erledigt. Unter letzterem sollte man noch den Parameter -n hinzufügen, da sich das Script andernfalls mit der Meldung “Flash is not same size as local bitstream.” verabschiedet.
Das Mojo selbst wird von OSX als USB-Modem eingehängt und der serielle Port findet sich immer als /dev/tty.usbmodem*. Wobei der Stern eine dreistellige Ziffer ist. Wer schonmal mit einem Arduino unter OSX gearbeitet hat kennt das bereits. Leider ist nicht klar, wie man das System dazu bringt immer den gleichen Device-Namen zu verwenden. Für den Fall, dass man nur ein entsprechendes Gerät an seinem Rechner hat, kann man folgenden Befehl zum Flashen verwenden:
./mojo.py -v -n -d `ls /dev/tty.usb*` mojo_top.bin
Auf der Mojo-Seite findet sich unter anderem ein Beispielprogramm für die serielle Kommunikation über den AVR auf dem Board. Damit liessen sich die berechneten Daten eines GPS-Recievers und eines Accelerometers problemlos an einen Controller (z.B. RaspberryPi) weitergeben. Auf diesem könnte dann die RTKLIB laufen, die die Daten nicht noch selbst bereinigen müsste.
Wem Verilog als Synthesesprache nicht liegt, der kann das Mojo auch mit VHDL benutzen. Ebenfalls im Forum findet sich ein schöner Beispiel-Code von User Xark, das auch gleich noch verdeutlicht, wie die Analogports benutzt werden können.
Ein Beispiel, wie ein FPGA (hier ein etwas älteres Basys 2 von Diligent für ~€50) mit einem GPS-Receiver zusammenspielen kann hat grade All Programmable Planet beschrieben. In nächster Zeit sollen noch weitere Artikel und Beschreibungen zu dem Projekt kommen.