Inhaltsverzeichnis
b16-CPU
Der b16 ist eine kleine, von Chuck Moore's Prozessoren inspirierte Forth-CPU. Im Rahmen des Altera-DE1-Projekts der Forth-Gesellschaft läuft das Projekt in einem Subversion-Repository auf dem FG-Server.
Benutzung
Benötigt wird
- Altera DE1 Entwicklungsboard
- RS232-Schnittstelle oder USB-Wandler auf RS232
- Quartus 9.0 Web Edition (läuft leider nur unter Windows)
Auschecken des Repository mit
git clone https://github.com/forthy42/b16-small.git
oder
git clone https://gitlab.com/forthy42/b16-small.git
Das dort enthaltene Projekt b16 einfach übersetzen, und auf's FPGA hochladen - damit läuft dann auch schon das Testprogramm.
Debugger
Den Debugger starten mit
xbigforth b16.m test.asm
oder einer anderen Assembler-Datei. Das sollte dann aussehen wie folgt:
Das Debugger-Fenster teilt sich in drei Teile: Oben ist ein Tool, um den Speicher zu lesen oder zu ändern, in der Mitte ist der Debugger, der Register anzeigt und Start/Stop/Single Step (n Stück) erlaubt, und unten ist der Editor der Assembler-Datei. Dateien kann man laden/speichern/hochladen (Icons an der linken Seite). Die übersetzte Datei wird rechts mit Adressen annotiert; klickt man eine Adresse an, so setzt man einen Breakpoint (es gibt genau einen solchen Breakpoint).
Address Map
Der b16 im Projekt hat folgende Adressbelegung:
Start | Ende | Belegung |
---|---|---|
0000 | 1FFF | Externes SRAM, 1 Wait-State |
2000 | 3FFF | Internes SRAM, 0 Wait-States, vorbelegt |
4000 | FEFF | Externes SRAM, 1 Wait-State |
FF00 | FFFF | Special Function Register |
Die Reset-Adresse ist bei 3FFE.
Register Map
Adresse | Name | Bedeutung | Reset-Wert |
---|---|---|---|
FF00 | LED7 | 7-Segment-Anzeige | 0000 |
FF08 | IRQMASK | Interrupt-Maske | 01 |
FF09 | IRQACT | Interrupt-Aktiv | 01 |
FF10 | TVAL0 | Timer Compare high | 0000 |
FF12 | TVAL1 | Timer Compare low | 0000 |
FF14 | TIMERVAL0 | Timer high | 0000 |
FF16 | TIMERVAL1 | Timer low | 0000 |
FF20 | GPIO00 | GPIO0 MSB (35..32) | …0 |
FF22 | GPIO01 | GPIO0 mitte (31..16) | 0000 |
FF24 | GPIO02 | GPIO0 LSB (15..0) | 0000 |
FF28 | GPIO00t | GPIO0 dir MSB (35..32) | …0 |
FF2A | GPIO01t | GPIO0 dir mitte (31..16) | 0000 |
FF2C | GPIO02t | GPIO0 dir LSB (15..0) | 0000 |
FF30 | GPIO10 | GPIO1 MSB (35..32) | …0 |
FF32 | GPIO11 | GPIO1 mitte (31..16) | 0000 |
FF34 | GPIO12 | GPIO1 LSB (15..0) | 0000 |
FF38 | GPIO10t | GPIO1 dir MSB (35..32) | …0 |
FF3A | GPIO11t | GPIO1 dir mitte (31..16) | 0000 |
FF3C | GPIO12t | GPIO1 dir LSB (15..0) | 0000 |
GPIO Direction ist 0 für Input, 1 für Output. Der Timer wird jeden Takt um 1 erhöht, bleibt aber stehen, wenn die CPU mit dem Debugger angehalten wird. Die symbolischen Adressen lassen sich mit include regmap.asm
laden.