You are on page 1of 14

ConvHex und Data2Mem: Konfiguration von Block-Ram-Inhalten ohne Neusynthese der Hardware

Version 0.2, 4. Dezember 2007

Project: Competence Team for Test and Verification of Dependable Systems Projektnummer: MA 27-Projekt 05-05 Dieses Projekt wird von der Magistratsabteilung 27 der Stadt Wien im Rahmen der FH-Ausschreibung Nr. 5, Stiftungsprofessuren und Kompetenzteams fr die Wiener Fachhochschul-Ausbildungen, 2005, finanziell untersttzt.

Fachhochschule Technikum Wien Fachbereich Embedded Systems Hchstdtplatz 5 1200 Wien, sterreich http://embsys.technikum-wien.at

Letzte nderungen
Author
Christoph Veigl (CV) Christoph Veigl (CV) Christoph Veigl (CV)

Datum
3.12.2007 4.12.2007 5.12.2007

nderung
V0.1 Erste Version des Dokuments erstellt. CV. V0.2 Details gendert, Abbildungen. CV. V0.3 Bug entfernt: Dateiname im Bsp. auf Seite 12 gendert: mc8051_rom_bd.bmm . CV.

Inhalt
1 Einleitung 1.1 2 Bentigte Tools / Entwicklungsumgebungen: Prerequisites 3 3 4 4 5 6 7 8 9 10 11 11 12 12 12 13 13

ConvHex: Convertierung des Intel-Hex Files in Formate fr Simulation und Synthese 2.1 2.2 Die Formate Hex, Dua, Coe und Mem Der Aufruf von convHex

Data2MEM 3.1 3.2 3.3 Struktur des .bmm-Files: Beispiel fr ein .bmm-File [XIL01]: Einbindung des .bmm Files in das Xilinx ISE - Projekt vom 8051-Sourcecode zum Download mit impact

Software Tool-Flow: 4.1 4.2 4.3 4.4 4.5 4.6

Auffinden der BlockMemory Strukturen BlockMemory Map-File: mc8051_rom.bmm Sourcode compilieren und linken Erzeugung des mem-Files: convHex Update des Bitstreams: data2MEM Aufruf von Impact im Batch-Modus:

References

Anhang A: Tabelle verwendeter Dateien

14

1 Einleitung
Das vorliegende Dokument beschreibt eine substanzielle Erleichertung des Software-Tool-Flows fr die Implementierung in unseren Xilinx-FPGAs: Das direkte Einfgen von Software in den Bit-Stream der generierten Hardware. Xilinx stellt hierfr das Programm data2MEM zur Verfgung, dessen Anwendung im folgenden beschrieben wird. Grundstzlich lsst sich die Software fr eine im FPGA laufende CPU schon bei der Synthese festegen, indem man ein entsprechendes .coe File fr die Initialisierung des CPU-ROM (abgebildet in das FPGA Block-Ram) im Xilinx Core-Generator angibt [KUT]. Das .coe - File enthlt ein Speicherabbild des Object-Codes in binrer Darstellungsform und wird durch das Tool convHex aus einem Intel-.hex-Format erzeugt [CONVHEX]. Der Nachteil dieser Vorgehensweise besteht darin, dass auch schon kleine nderungen in der Software eine Neusynthese der gesamten Hardware in der Xilinx-ISE notwendig machen, um die Softwareinhalte ins Block-Ram zu bernehmen. Eine elegante und zeitsparende Alternative besteht in der Verwendung des XilinxTools data2MEM, welches die nderung der Block-Ram-Inhalte in einem bestehenden .bit - File ermglicht. Dadurch kann die Software fr ein IP-Core direkt in den Bitstream eingefgt werden, ohne dass das Core neu synthetisiert werden muss. Ein Software Update reduziert sich auf die Neucompilerung und Erzeugung eines .hex Files mit einer beliebigen IDE, das Update des Bitstreams mittels data2mem und den Download des neuen .bit - Files auf das FPGA mittels impact. Alle diese Aufgaben lassen sich durch Kommandozeilen-Aufrufe bewerkstelligen und sind insoferne in ein Batch-File bzw. in ein Make-File integrierbar. Die folgenden praktischen Beispiele beziehen sich auf die mc8051 - Portierung fr das Virtex4-Board [mc8051], die beschriebene Vorgangsweise kann jedoch auch fr andere CPUs oder IP-Cores eingesetzt werden.

1.1 Bentigte Tools / Entwicklungsumgebungen: Prerequisites


Prinzipiell ist der Einsatz von convHex und data2MEM auf Windows und Linux Plattformen mglich. Data2MEM befindet sich im Lieferumfang der Xilinx Tools, die hier in der Version 9.1.03i verwendet wurde (Verzeichnis der exe-Datei bei der Windows Version: Xilinx91\bin\nt). ConvHex ist eine Eigenentwicklung des Fachbereich Embedded Systems und kann ber das CVS am Server esshare (TW intern: 10.128.203.5, TW extern: 195.245.255.110) bezogen werden. Im CVS befindet sich der GCC-compilierbare Sourcecode und eine Windows .exe-Datei, die ohne Cygwin lauffhig ist. Zum Nachvollziehen des Anwendungsbeispiels wird davon ausgegangen, dass eine Software-Entwicklungsumgebung fr den mc8051 vorhanden ist (zB. KeiluVision3 oder der freie SDCC-Compiler/ Linker), welche die Erzeugung von IntelHex-Files [IHEX] ermglicht. Zur Synthese des mc8051 im Virtex4-FPGA wird Xilinx ISE 9.1.03i verwendet, der Download erfolgt mit dem Xilinx Tool Impact.

2 ConvHex: Convertierung des Intel-Hex Files in Formate fr Simulation und Synthese


Das Programm convHex.exe (erstellt von Roland Hller, Christoph Kutschera und Christoph Veigl) dient dazu, das gebruchliche Intel-Hex Format in eine Reihe von anderen Dateiformaten zu konvertieren, die zur Initialisierung von Block-RamInhalten, fr die Simulation der IP-Cores sowie fr das Einfgen neu compilierter Software fr ein bestehendes FPGA Design ntzlich sind.

2.1 Die Formate hex, dua, coe und mem


Das Intel .hex Format [IHEX] ist meist Ergebins eines Compilier- und Linkvorganges von Source-Code fr eine bestimmte CPU. Es beschreibt (ASCII-lesbar) Adressen und zugehrige Speicherinhalte fr die ausfhrbare Firmware, wobei die Adressen je nach Version nicht sequentiell geordnet sein mssen. .hex-File:
:03000000020025D6 :1000230001B8787FE4F6D8FD75810902006C0200FF (...)

Das .dua Format ist eine ASCII-lesbare Binrdarstellung des .hex Files, bei der die Adressen sequentiell geordnet und unbelegte Speicherbereiche mit 0 gefllt wurden. Das .dua File wird zB. bei der Simulation verwednet. Beispiel: .dua-File:
00000010 00000000 00100101 00000000 00000000 (...)

Das .coe Format ist eine Erweiterung des .dua - Formates um zwei HeaderZeilen. Dieses File kann vom Xilinx Core-Generator zur Initialisierung von ROMSpeicher verwendet werden, dient also dazu, das bersetzte Programm als ausfhrbaren Code ins FPGA-Design (in den Bitstream) aufzunehmen: .coe-File:
memory_initialization_radix = 2; memory_initialization_vector = 00000010, 00000000, 00100101, 00000000, 00000000, (...)

Das .mem - Format ist eine hexadezimale Darstellung der Speicherinhalte, wobei fr jeden Speicherinhalt auch die Adresse angegeben wird. Das .mem - File kann vom Xilinx-Utility data2MEM eingelesen werden, um den Inhalt eines Bitstreams zu modifizieren. .mem-File:
@0000 @0001 @0002 @0003 @0004 (...) 02 00 25 00 00

2.2 Der Aufruf von convHex


convhex <Hexfile.hex> Die Extension .hex ist anzugeben, als Ausgabe erhlt man die Aufschlsselung der Speicherinhalte und die erzeugten .dua, .coe und .mem Dateien. Es empfiehlt sich, convHex in einen Folder zu kopieren, der im Systempfad liegt, damit das Tool leicht fr Projekte in beliebigen Verzeichnissen verwendet werden kann.

Abb1: Aufruf von convhex

3 Data2MEM
Das Data2MEM Utility ermglicht das Einfgen von sequentiellen Speicherinhalten in FPGA Block-Rams, und zwar durch direkte Manipulation eines bestehenden Bitstreams (.bit-File). So kann Software vor dem Download einer CPU ins FPGA in den (ansonsten unvernderten) Bitstream eingefgt werden. Dies stellt eine Kombination des CPU- und des FPGA -Tool-Flows dar, welche die beiden Flows selbst unverndert lsst. Grundstzlich kann Data2MEM verschiedene Datenformate verarbeiten und ausgeben. Fr das Einlesen des Bitstreams stehen neben dem MEM-Format auch das ELF- und das DWARFFormat zur Verfgung. Mgliche Ausgabeformate sind neben dem aktualisierten .bit - File auch Verilog, VHDL- oder MEM-Files fr die Simulation (post-PAR simulation).

Abb. 2: Data2MEM I/O-Files

Data2MEM fhrt bei der Integration von Speicherinhalten in den Bitstream eine geeignete Umordnung der Daten durch, damit ein kontinuierlicher Adressraum erhalten bleibt. Dies ist ntig, weil der CPU-Adress- und Datenraum fr gewhnlich grer sind als die Architektur der Block-Rams und die Inhalte auf unterschiedliche BRAMs aufgeteilt werden mssen, um einen linearen Zugriff aufrechtzuerhalten:

Abb. 3 : Beispiel fr die Anordung des BRAM Adressraumes fr einen 64-bit Datenzugriff [XIL01]

Die Gre und Anordnung der Block-Rams ist technologie- bzw. designabhngig und muss in einem BlockRam Memory-Map (.bmm) File angegeben werden. Hier bestehen Unterschiede zwischen den Xilinx FPGA-Familien, derzeit sind folgenden Block-Ram-Typen verfgbar: RAMB4 (4kBit, Virtex, Virtex-E) RAMB16 (16-Kbit, Spartan-3, Virtex-II) RAMB18 (18-Kbit, Virtex-4) RAMB36 (36-Kbit BRAM, Virtex-5) Neben der Anordnung und Breite der Block RAMs (Bitlane interleave) wird im .bmm - File auch die Anzahl der ntigen Bus-Blcke angegeben. Im Beispiel aus Abb.4 wurde eine Bitlane-Breite von 8 Bit gewhlt (dieser Wert muss vom Xilinx-BlockRamTyp untersttzt werden), dies bewirkt eine Aufteilung des 64-Bit Datenwortes auf 8 BlockRams. Aus der gewhlten Bitlane-Breite ergeben sich die Datentiefe eines Block-Rams und die ntige Anzahl von Bus-Blcken fr den gewnschten Adressraum. Fr den BlockRam-Typ RAMB4 wren folgende Bitlane-Breiten bzw. Datentiefen mglich: RAMB4_S1: 1 Bit x RAMB4_S2: 2 Bit x RAMB4_S4: 4 Bit x RAMB4_S8: 8 Bit x RAMB4_S16: 16 Bit 4096 2048 1024 512 x 256

3.1 Struktur des .bmm - Files:


Im .bmm-File wird das zu verwendende Speicher-Mapping durch eine Reihe von Keywords festgelegt:
ADDRESS_SPACE <adr_space_name> <memory_devicetype> [start_addr:end_addr] END_ADDRESS_SPACE;

<memory_devicetype> gibt den verfgbaren Block-Ram-Typ an zB. RAMB4 oder RAMB16 <start_addr> und <end_addr> geben den gewnschten Adressraum an Ein Address_Space beinhaltet einen oder mehrere Bus-Blcke.
BUS_BLOCK <Bit_lane_definition> <Bit_lane_definition> (...) END_BUS_BLOCK;

Ein Bus-Block ist aus einer oder mehreren Bitlanes aufgebaut. Die Bitlanes definieren die Aufteilung eines CPU-Bus-Zugriff auf verschiedene BlockRams. Die Reihenfolge und Anzahl der Bus-Blcke bestimmt die Zuordnung und Gre des adressierbaren Speicherbereichs.

3.2 Beispiel fr ein .bmm - File [XIL01]:


ADDRESS_SPACE ram_cntlr RAMB4 [0xFFFFC000:0xFFFFFFFF] // Bus access map for the lower 4k, CPU address 0xFFFFC000 - 0xFFFFCFFF BUS_BLOCK top/ram_cntlr/ram7 [63:56] LOC = R3C5; top/ram_cntlr/ram6 [55:48] LOC = R3C6; top/ram_cntlr/ram5 [47:40] LOC = R3C7; top/ram_cntlr/ram4 [39:32] LOC = R3C8; top/ram_cntlr/ram3 [31:24] LOC = R4C5; top/ram_cntlr/ram2 [23:16] LOC = R4C6; top/ram_cntlr/ram1 [15:8] LOC = R4C7; top/ram_cntlr/ram0 [7:0] LOC = R4C8; END_BUS_BLOCK; // Bus access map for next higher 4k, CPU address 0xFFFFD000 - 0xFFFFDFFF BUS_BLOCK top/ram_cntlr/ram15 [63:56] OUTPUT = ram15.mem; top/ram_cntlr/ram14 [55:48] OUTPUT = ram14.mem; top/ram_cntlr/ram13 [47:40] OUTPUT = ram13.mem; top/ram_cntlr/ram12 [39:32] OUTPUT = ram12.mem; top/ram_cntlr/ram11 [31:24] OUTPUT = ram11.mem; top/ram_cntlr/ram10 [23:16] OUTPUT = ram10.mem; top/ram_cntlr/ram9 [15:8] OUTPUT = ram9.mem; top/ram_cntlr/ram8 [7:0] OUTPUT = ram8.mem; END_BUS_BLOCK; // Bus access map for BUS_BLOCK top/ram_cntlr/ram23 top/ram_cntlr/ram22 top/ram_cntlr/ram21 top/ram_cntlr/ram20 top/ram_cntlr/ram19 top/ram_cntlr/ram18 top/ram_cntlr/ram17 top/ram_cntlr/ram16 END_BUS_BLOCK; // Bus access map for BUS_BLOCK top/ram_cntlr/ram31 top/ram_cntlr/ram30 top/ram_cntlr/ram29 top/ram_cntlr/ram28 top/ram_cntlr/ram27 top/ram_cntlr/ram26 top/ram_cntlr/ram25 top/ram_cntlr/ram24 END_BUS_BLOCK;
END_ADDRESS_SPACE;

next higher 4k, CPU address 0xFFFFE000 - 0xFFFFEFFF [63:56]; [55:48]; [47:40]; [39:32]; [31:24]; [23:16]; [15:8]; [7:0]; next higher 4k, CPU address 0xFFFFF000 - 0xFFFFFFFF [63:56]; [55:48]; [47:40]; [39:32]; [31:24]; [23:16]; [15:8]; [7:0];

Abb. 4: Resultierender Bus-Zugriff auf die Bitlanes

3.3 Einbindung des .bmm Files in das Xilinx ISE - Projekt


Um die .bmm Datei mit den aktuellen Placement-Informationen der BlockRams zu ergnzen, muss die Datei zum Xilinx-Projekt hinzugefgt und eine Neusysnthese gestartet werden. Verluft die Synthese nicht erfolgreich, so sollten die Namen bzw. das Layout der BRAMs mithilfe des Floorplanners / FPGA Editors in der Xilinx ISE berprft und mit der .bmm-Datei verglichen werden. Nach erfolgreicher Synthese sollte sich die erweiterte .bmm - Datei ( <name>_bd.bmm ) im Projektverzeichnis befinden, welche von data2MEM verwendet werden kann.

Abb. 5: Einfgen des .bmm-Files in das Xilinx ISE Projekt

4 Software Tool-Flow: vom 8051-Sourcecode zum Download mit impact


Das folgende Anwendugnsbeispiel zeigt ein Firmware-Update fr einen im FPGA implementierten mc8051-Prozessor. Dazu wurde das OpenSource IP-Core der Firma Oregano Systems [ORE] fr den Einsatz im Virtex4 - FPGA modifiziert. Es wird angenommen, dass die Synthese und Implementierung des Bitstreams prinzipiell funktioniert. Abb. 6 zeigt die prinzipiellen Tool-Flows fr Software und Hardware, mit der angestrebten Verbindung von .elf bzw .hex File zum Bitstream fr die FPGA-Implementierung. Wir verwenden anstatt des .elf - Formates das .mem - Format als Eingabe fr Bitgen bzw. impact, da weder Keil noch SDCC eine Ausgabe im .elf - Format untersttzen)

Abb. 6: Verbindung der Tool Flows fr Software und FPGA Design

10

4.1 Auffinden der BlockMemory Strukturen


Um die Breite bzw. Tiefe des ROM-Speichers zu verifizieren, empfiehlt sich ein Blick in das Placement mithilfe des FPGA-Editors:

Abb. 7: Placement der ROM-Blcke im FPGA-Editor, Daten- und Adressleitungen

Hier finden sich sowohl die zugewiesenen Namen fr die BlockMemory Instanzen (hier BU5 und BU8 ) als auch die verwendeten Adress- und Datenanbindungen (die ja schon aus dem VHDL-Design heraus klar sein sollten)

4.2 BlockMemory Map-File: mc8051_rom.bmm


Hieraus ergibt sich das Block-Memory Map File mc8051_rom.bmm fr die Implementierung des mc8051 - Programmspeichers:
ADDRESS_SPACE i_mc8051_rom RAMB16 [0x0000:0x0fff] BUS_BLOCK i_mc8051_rom/BU8 [7:4]; i_mc8051_rom/BU5 [3:0]; END_BUS_BLOCK; END_ADDRESS_SPACE;

11

Nach dem Einfgen ins Xilinx-Projekt und der Neusynthese erhlt man u.a. das Bitfile mc8051_top.bit und die Datei mc8051_rom_bd.bmm mit folgendem Inhalt:
ADDRESS_SPACE i_mc8051_rom RAMB16 [0x00000000:0x00000FFF] BUS_BLOCK i_mc8051_rom/BU8 [7:4] PLACED = X0Y6; i_mc8051_rom/BU5 [3:0] PLACED = X0Y7; END_BUS_BLOCK; END_ADDRESS_SPACE;

4.3 Sourcode compilieren und linken


Hier dient als Beispiel der SDCC-Compiler, eine Compilierung von C-Code fr den mc8051 ist aber zB. auch mit der Keil-Entwicklungsumgebung mglich.
sdcc test.c -c -model-small sdcc test.rel model-small // compilieren // linken

Das Ergebnis des Linkens ist die Datei test.hex.

4.4 Erzeugung des mem-Files: convHex


Nun wird das entstandene .hex-File ins .mem-Format konvertiert:
convhex test.hex

Dies liefert die Dateien test.dua, test.coe und test.mem.

4.5 Update des Bitstreams: data2MEM


Das .mem - File, das <name>_bd.bmm-File und das .bit - File dienen als Eingabe fr data2MEM. Nach dem erfolgreichen Durchlauf exisiert ein neues Bitfile mit dem angegebenen Namen final.bit, das den aktuellen Programmcode enthlt:
data2mem -bm ../mc8051_rom_bd.bmm -bt ../mc8051_top.bit -bd test.mem -o b ../final.bit REM Optional: verify that data has changed: REM data2mem -bm ../mc8051_rom_bd.bmm -bt ../mc8051_top.bit -d REM > design-before.txt REM data2mem -bm ../mc8051_rom_bd.bmm -bt ../final.bit -d REM > design-after.txt

12

4.6 Aufruf von Impact im Batch-Modus:


Das entstandene Bitfile kann mittels impact ins FPGA berspielt werden. Mithilfe des Batchmodus von impact ist dies von der Kommandozeile aus mglich:
impact -batch < impact_batch.txt

Inhalt der Datei impact_batch.txt:


setmode -bs setcable -p auto identify assignFile -p 1 -file final.bit program -p 1 -defaultVersion 0 quit

Weiterfhrende Dokumentation und Optionen von impact siehe [XIL02].

5 References
[CONVHEX] ConvHex: Konvertierungs-Tool. Roland Hoeller, Christoph Kutschera, Christoph Veigl. CVS-Checkout auf esshare: mc8051/sw/convHex/ [IHEX] [KUT] Das Intel Hex Format: http://www.keil.com/support/docs/1584.htm Christof Kutschera: MC8051-Virtex_howto: es@esshare//ResearchProjects/CompetenceTeam/project_docs/mc80 51_virtex4_howto.doc MC8051 OpenSource IP-Core von Oregano Systems, modifiziert fr den XG-Modus des Syopsys Design Compilers. CVS Checkout auf esshare: mc8051 Xilinx ISE: Laden des Roms ohne Neusynthese http://www.mikrocontroller.net/articles/T51-Core Oregano mc8051 Core: http://www.oregano.at/ip/8051.htm Xilinx Data2Mem User Guide, 04/07: http://toolbox.xilinx.com/docsan/xilinx92/books/docs/d2m/d2m.pdf Xilinx Impact User Guide, 02/07 http://toolbox.xilinx.com/docsan/xilinx4/pdf/docs/pac/pac.pdf

[MC8051]

[MCN] [ORE] [XIL01] [XIL02]

13

Anhang A: Tabelle verwendeter Dateien


Die folgende Tabelle fasst einige Files zusammen, die fr das Anwendungsbeispiel 8051 Firmware verwendet wurden (ohne die mc8051 Source und SyntheseDateien) :

Dateiname
mc8051_top.vhd mc8051_rom.bmm mc8051_rom_bd.bmm mc8051_top.bit final.bit sdcc.exe convhex.exe data2MEM.exe

Bemerkung
Top-Level mc8051 Design BlockMemory Map (hndisch generiert) BlockMemory Map mit Placemnet Info (von Xilinx ISE generiert) Original Bitstream File Upgedateter Bitstream incl. neuer Firmware Small Device C-Compiler, http://sdcc.sourceforge.net/ iHEX - Konverter [CONVHEX] Xilinx Tool [XIL01]

14

You might also like