T51-Core
Der T51-Core ist ein 8051-kompatibler Prozessorcore in VHDL.
http://www.opencores.org/projects.cgi/web/t51/overview
Synthese mit Xilinx ISE/Webpack
ISE (9.1) ist nicht in der Lage, das ROM in der mitgelieferten Datei ROM52_BASIC.VHD als Block-RAM zu synthetisieren, sondern versucht daraus ein kombinatorisches Netzwerk zu bauen, was natürlich fürchterlich schief geht. Eine für ISE angepasste Version der Datei gibt es hier.
Syntheseergebnis:
- ISE 9.2, Spartan 3S1000, Speedgrade 4: maximaler Takt 40 MHz, Platzbedarf ca. 25% (2800 LUT, 600 FF, optimiert auf Speed)
Beispielprojekt für Digilent Nexys-Board
Das Nexys-Minimalbeispiel von Digilent, erweitert um den T51-Core. Nur RXD und TXD sind angeschlossen, außerdem ist RXD noch mit Port 3.0 verbunden, weil das für die Baudratenerkennung des Basic-Interpreters benötigt wird. Die RS232-Adapterplatine von Digilent muss an JA angeschlossen werden. Um den Basic-Interpreter zu verwenden mit einer beliebigen Baudrate die Verbindung herstellen und ein Leerzeichen senden um die Baudratenerkennung zu aktivieren. Dann sollte man folgende Eingabeaufforderung bekommen:
*MCS-51(tm) BASIC V1.1* READY >
Das Basic-52 Reference Manual bekommt man unter http://www.grifo.com/SOFT/uk_bas52.htm (deutsche Übersetzung: http://home.arcor.de/EDAconsult/Page3/index.html?c~3.1).
Download:
In dieser Version wurde zusätzlich ein einfaches RAM-Interface zwischen dem Prozessor und dem PSRAM auf dem Nexys-Board implementiert:
Xilinx ISE: Laden des ROMs ohne Neusynthese
Man kann den ROM-Inhalt im Bitstream ändern, ohne das Projekt neu synthetisieren zu müssen.
Dazu braucht man eine bmm-Datei, in der das Speicherlayout beschrieben wird. Dokumentation zu dem Format gibt es unter http://toolbox.xilinx.com/docsan/xilinx92/books/docs/d2m/d2m.pdf.
t51_rom.bmm:
ADDRESS_BLOCK t51_inst_rom RAMB16 [0x0000:0x1FFF]
BUS_BLOCK
T51_inst/inst_Mram_mem3 [7:6];
T51_inst/inst_Mram_mem2 [5:4];
T51_inst/inst_Mram_mem1 [3:2];
T51_inst/inst_Mram_mem [1:0];
END_BUS_BLOCK;
END_ADDRESS_BLOCK;
Die Datei zum Projekt hinzufügen und alles nochmal durchlaufen lassen (falls ein undefinierter "Error" angezeigt wird, bmm-Datei wieder entfernen und im Floorplanner überprüfen ob die Namen der BRAMs stimmen).
Jetzt sollte man eine neue Datei "t51_rom_bd.bmm" vorfinden, in der sich Informationen zum Placing der BRAMs befinden. Diese Datei wird vom Tool data2mem genutzt um den BRAM-Inhalt direkt im Bitstream zu ändern. Folgende Batch-Datei veranschaulicht den Vorgang anhand eines mit sdcc kompilierten Testprogramms:
c/make.bat:
sdcc test.c -c --model-large
sdcc test.rel --model-large
makebin -s 8192 < test.ihx > test.bin
REM get srec_cat from http://srecord.sourceforge.net/
srec_cat test.bin -bin -o rom.mem -vmem 8
data2mem -bm ../t51_rom_bd.bmm -bt ../nexysdemo.bit -bd rom.mem -o b final.bit
REM Optional: verify that data has changed:
REM data2mem -bm ../t51_rom_bd.bmm -bt ../nexysdemo.bit -d > design-before.txt
REM data2mem -bm ../t51_rom_bd.bmm -bt final.bit -d > design-after.txt
c/test.c:
#include <stdio.h>
#include <string.h>
// Define the I/O-ports
sfr at 0x80 P0;
sfr at 0x90 P1;
sfr at 0xA0 P2;
sfr at 0xB0 P3;
void main (void)
{
while(1) {
P1=0xAA;
}
}
Alternativ kann man die MEM-Datei auch ins Projekt mit aufnehmen, dann verwendet ISE sie automatisch für das Erzeugen des Bitstreams.