====== b16-CPU ====== Der [[http://www.bernd-paysan.de/b16.html|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 [[http://subversion.tigris.org/|Subversion]]-[[http://www.forth-ev.de/repos/b16-small/|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: {{ :projects:b16:b16-debugger.png }} 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.