T51-Core

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

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.

Siehe auch