wiki:FPGABasic

BASIC Terminal im FPGA

FPGA-Modul als autarker Steuerrechner für das c't-Lab

Siehe hierzu auch:

Für viele Anwendungen des c't-Lab ist ein "autarker", das heißt nicht PC-verbundener Betrieb wünschenswert, beispielsweise als Datenlogger oder als SPS (Speicherprogrammierbare Steuerung). Obwohl sich einige Aufgaben bereits mit dem auf dem FPGA-Modul implementierten LabScript lösen lassen, ist dieses doch recht langsam und oft nicht flexibel genug. Deshalb hier mein Vorschlag, das FPGA als eigenständigen Steuerrechner einzusetzen: In das Spartan-3-FPGA des c't-Lab-FPGA-Moduls passt ohne weiteres ein kompletter "Heimcomputer" wie ein Apple II oder ein C64 (eigentlich sogar drei, belegt im FPGA nur ein Drittel der Ressourcen).

Sinn und Zweck

Warum der betagte 6502, und warum BASIC? Nun, ein zuverlässiger, sehr platzsparender 6502-Rechenkern für FPGAs ist bereits vorhanden, in BASIC kann (noch) fast jeder programmieren -- und außerdem gestattet es der Interpreter, ein Programm interaktiv -- auch ohne Zuhilfenahme einer PC-gestützten Entwicklungsumgebung (Compiler) zu erstellen, als säße man vor einem klassischen Heimcomputer. Ein Konverter (EHBC.EXE) erlaubt aber auch die BASIC-Programmerstellung am PC. Es sind keinerlei über BASIC hinausreichenden Programmierkenntnisse nötig.

Schnellstart

Für den Einsatz des ct-BASIC sind keine FPGA-Programmierkenntnisse nötig (für eigene Anpassungen aber hilfreich). Gehen Sie wie folgt vor:

Firmware ab #2.6 oder neuer auf FPGA-Modul programmieren. Kompletten Inhalt des Archivs "sdcard.zip" auf die SD-Karte kopieren. BASIC.INI mit dem Panel auswählen und starten (ab Firmware 2.61 ist als Startup-INI bereits "BASIC.INI" eingetragen, sollte nach dem Einschalten also automatisch starten). Auf dem VGA-Bildschirm sollte das Startmenü erscheinen. Nach Kaltstart kann mit LOAD beispielsweise die BASIC-Datei "IOTEST0.BAS" geladen werden, die die Echtzeituhr-Register des AVR ausliest. Beachten Sie auch die Demo-BASIC-Programme und Makros in sdcard.zip (Endung .BAS und .MAC).

Latest News

Der jeweils aktuellste Build von ct-BASIC ist jetzt im Repo-Browser in einem eigenen Ordner zu finden (Konfiguration und Programme in sdcard.zip, Sourcen in basic_sourcen.zip). Beachten Sie beim Kopieren des Inhalts von sdcard auf eine SD-Karte, dass diese FAT(16)- und nicht FAT32-formatiert ist. Zum c't-BASIC habe ich nun auch eine FAQ-Seite mit Tips & Tricks angelegt. Die ct-BASIC-Referenz ist unter Dokumentation zu finden. Bitte immer die zugehörige main.bit-Datei auf Aktualität überprüfen, am besten immer zusammen mit ehbasic.dat aus dem sdcard- bzw. sdcard-LCD-Verzeichnis verwenden. Unter Umständen hinkt die ZIP-Datei mit den FPGA-Sourcen zum ct-BASIC (dort ist ebenfalls ein main.bit enthalten) einige Tage hinterher. Die früher hier aufgeführte Versionsgeschichte finden Sie jetzt auf der Seite Versionen und Neuerungen.

browser:Bilder/basic4.jpg

Bild: zusammen mit einem Steckernetzteil und einer PS/2-Tastatur entsteht aus dem FPGA-Modul ein eigenständiger BASIC-Rechner für Steuerungsaufgaben und für die Visualisierung von Messwerten.

Das Video auf YouTube zeigt das laufende BASIC-Programm GTEST.BAS. Die Geschwindigkeit des Bildaufbaus wird größtenteils vom BASIC-Interpreter bestimmt (z.B. durch die Sinus-Berechnung), das Zeichnen selbst ist fast "trägheitslos".

Notwendige Hardware: c't-Lab-FPGA-Modul, CORERAM-Karte c't 22/2009 S. 182 sowie PS/2-Tastatur und ein VGA-fähiger Monitor. Alternativ kann die DACRAM-Karte mit 512 KByte SRAM verwendet werden, wenn ein PS/2-Tastatur-Interface aus 4 Widerständen anhand schem_FPGA-CORERAM separat aufgebaut wird.

browser:Bilder/basic1.jpg

Verwendet wurde als CPU der T65-Core von Daniel Wallner und Mike Johnson, der auch schon in der Asteroids-Implementation zu finden war, hier aber mit 12,5 MHz getaktet wird, womit sich die zwölffache Geschwindigkeit eines Apple II oder Commodore C64 ergibt. Der Core würde sogar mit 60 MHz laufen, wird aber vom relativ langsamen SRAM auf der DACRAM-Karte (das als ROM und Programmspeicher dient) ausgebremst. Als Video-Interface kommt das VGA-80x40-Makro von Javier Valcarce zum Einsatz, das ich um Farb- und Inversdarstellung erweitert habe. Das Tastatur-Interface für PS/2-Tastaturen stammt wiederum von Daniel Wallner. Zur Entwicklung diente mir der ältere, aber sehr brauchbare 6502 Simulator/Assembler von Michal Kowalski.

Enhanced BASIC

Als gut dokumentierte und im Sourcecode vorliegene Grundlage für das BASIC verwende ich das Enhanced BASIC von Lee Davison, das ich mit Treibern für das Video-Interface, LOAD/SAVE-Routinen, einem Monitor-Programm und einigen c't-Lab-Syntaxelementen erweitert habe. Das BASIC lehnt sich stark an die Microsoft-Implementation für Apple II (Applesoft) und Commodore PET an, ist aber durch die Erweiterungen nicht direkt Token-kompatibel. Zur direkten Kommunikation mit dem c't-Lab dient ein einfaches Terminal-Programm, das wie der Monitor beim Start ausgewählt werden kann. Es verhält sich wie ein serielles Terminal an der IFP-Karte.

BASIC-Programme können direkt von SD-Karte geladen und dort gespeichert werden; dies übernimmt der ATmega-Controller auf dem FPGA-Modul, der vom BASIC nur die AutoIncrement-Parameter (Start- und ggf. Endadresse, Dateiname, Byte-Modus) übergeben bekommt. Während des Ladens/Speicherns? - sozusagen per DMA - wird der 6502-Kern kurz angehalten, was überraschend gut funktioniert. Auch das initiale Laden des BASIC-Interpreters und des Monitors erledigt der AVR per AutoIncrement-Upload.

Zum Editieren des BASIC-Programms wird das Bildschirm-Listing genutzt, ähnlich wie beim Apple II. Um eine Zeile zu editieren, bewegt man den Cursor mit den Pfeiltasten der PS/2-Tastatur zur gewünschten Zeile; mit der TAB-Taste kopiert man den Teil, der übernommen werden soll, in den Eingangspuffer. Leerzeichen lassen sich mit "EINFG" einfügen, Überflüssiges mit "ENTF" entfernen. Eine Autorepeat-Funktion erleichtert das Editieren, womit das ganze deutlich bequemer vonstatten geht als dereinst 1980. Eine Möglichkeit, nicht-tokenisierte (also etwa auf dem PC mit einem Text-Editor erstellte) BASIC-Quelltexte zu laden, besteht mit dem MACRO-Befehl, der eine Textdatei an den Interpreter schickt, als wäre sie auf dem PS/2-Keyboard eingegeben worden.

Der bisherige QVGA-Treiber im FPGA-Modul ist daher entfallen; eine Messdaten-Visualisierung kann ebenso das BASIC-Terminal übernehmen. Die vorliegende Implementation des BASIC-Terminals einschließlich CPU, VGA-Interface, Grafik und PS/2-Adapter benötigt nur 40 Prozent der FPGA-Ressourcen, für Anwendungen oder Erweiterungen bleibt also noch reichlich Platz.

Die BASIC-Terminal-Anwendung benötigt derzeit mindestens die Beta-Version 2.4 der FPGA-Modul-Firmware, die aus Platzgründen die alten QVGA-Grafikroutinen schon nicht mehr enthält, dafür aber um einige Kommunikationsroutinen erweitert wurde, etwa einem XMODEM-Upload. Unter Version 2.33 ist wegen fehlender Routinen keine Kommunikation zwischen BASIC und c't-Lab möglich, obwohl der Interpreter selbst laufen sollte.

browser:Bilder/basic2.jpg

Der Zeilen-Editor des ct-BASIC gestattet das Eingeben und Editieren kleinerer Programme direkt mit der PS/2-Tastatur am CORERAM/FPGA-Modul, die dann direkt aus dem BASIC heraus auf SD-Karte gespeichert werden können (binäres Token-Format). Mit dem MACRO-Befehl lassen sich auch längere, als Text-Datei vorliegende Programme ins BASIC laden, die man vorher am PC vorbereitet hat.

browser:Bilder/basic3.jpg

Das Monitor-Programm zum Debugging von 6502-Programmen, eine abgespeckte und auf 6502 umgeschriebene Version von Daryl Rictor's 65C02-SBC-Monitor, kann von BASIC aus mit CALL-9 oder mit dem Kaltstart-Menü aufgerufen werden. Die Befehle werden Ihnen (möglicherweise) vom Apple-II-Monitor bekannt vorkommen.

Installation

Für den Einsatz als Steuerrechner können LCD-Monitor und Tastatur übrigens auch weggelassen werden; BASIC-Programme lassen sich auch per INI-Script nach dem Einschalten automatisch laden.

Schaltbild siehe FPGA-CORERAM unter "Schematics", hier sind auch ein zusätzlicher OptoBus- und ein serieller Anschluss mit drauf, die der BASIC-Core als Master direkt bedienen kann, und ein 512 KByte großer RAM-Baustein. Der enthaltene RTC-Uhrenchip wird ab FW-Version 2.5 unterstützt.

Basic-Befehlserweiterung für EhBASIC

Als Erweiterungen zur EhBASIC Online Reference wurden die in der c't-BASIC-Referenz enthaltenen Befehle implementiert (unter "Browser/Dokumentation?"). Hier finden Sie auch Hinweise zur Tastenbelegung und zum Zeileneditor.

In Arbeit

  • Fast abgeschlossen (siehe Schematics/Layout?): IOCORE-Steckkarte, Port-Karte für den Memory-mapped I/O-Bereich des ct-BASIC ($6xx) mit 1x 8-Bit-, 1x 12-Bit-Outports und 2x 8-Bit-Inports
  • Großschrift 40 x 20 oder 20 x 10 Zeichen

Interna

Die neue Firmware ab 2.5 unterstützt erstmals die F_INT-Leitung, mit der das FPGA einen Interrupt des AVR auslöst. Die Interrupt-Routine des AVR holt daraufhin ein Zeichen (Byte!) vom mit dem "COM"-Parameter 0 eingestellten SPI-Register (default ab FW 2.51 Register/SubCh? 67, vorher 3) im FPGA ab, das bis zum nächsten CR (0Dh) gesammelt und schließlich als Befehlszeile interpretiert wird, als wäre dieser Befehl über den OptoBus zum Modul-Controller gelangt. Auf diese Weise lassen sich nun aus dem FPGA-Core heraus Befehle und Abfragen in c't-Lab-Syntax an den AVR-Controller absetzen. Die Antwort des Controllers (z.B. "#0:255=0 [OK]") erfolgt in diesem Fall nicht an den OptoBus, sondern an das mit dem Modul-Parameter von "COM 1" ausgewählte SPI-Register (default ab FW 2.51 Register/SubCh? 65, vorher 1!). Da der Core möglicherweise nicht die hardwaremäßig eingestellte Moduladresse (Jumper) kennt, ist hier der MainCh 9 vorgesehen, der unabhängig von der Moduladresse immer entgegengenommen wird. Die Antwort des FPGA-Modulcontrollers (auf das mit COM 0 bestimmte SPI-Register) enthält aber immer die hardwaremäßig eingestellte Moduladresse als MainCh.

Zur Absicherung der Kommunikation zwischen FPGA-Core und AVR-Controller dient ab FPGA-Firmware 2.50 ein einfaches Handshake-Protokoll. Nach jedem einen Befehl abschließenden <CR> (oder jeder Textzeile) antwortet der AVR dem Core mit einem ACK ($06), sobald er wieder aufnahmebereit ist. Jede Textzeile (etwa zum Abspeichern auf SD-Karte) darf max. 255 Zeichen lang sein. Der Core sollte mit weiteren Befehlen/Daten? warten, bis ein ACK eingetroffen ist und, um den Controller nicht zu blockieren, maximal 10.000 Zeichen/Sekunde? auf SPI-Register 67 schreiben. Nach jedem Zeichen ist die F_INT-Leitung für etwa 1µs auf "1" zu setzen, danach ist eine Pause von 100 µs einzulegen.

Last modified 7 years ago Last modified on Feb 23, 2010, 5:24:46 PM