www.mikrocontroller.net

Forum: FPGA, VHDL & Co. RAM Update für picoBlaze ohne Neusynthese


Autor: sitzt_am_platz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich bin gerade dabei herauszufinden, wie ich bei meinem picoBlaze auf 
einem Spartan3 den Assembler Code schneller auf den FPGA bekomme. Bisher 
funktioniert es, wenn ich von pBlazeIDE ein VHDL File erstellen lasse, 
dass dann in meinem ISE Projekt eingebunden wird. Um das ganze aber auf 
den FPGA zu bekommen muss ich alle Schritte aber der Synthese wieder 
durchlaufen lassen. Was natürlich einige Zeit dauert.

Ich habe inzwischen einige Anleitungen gefunden, wie man das ganze 
machen kann mit Hilfe von data2mem. Leider bin ich da bisher noch nicht 
erfolgreich gewesen.
Auf der Command Line hat es bisher damit geendet, dass ich mein .bit 
File nicht finde :P Leider ohne Fehler, ich weiß einfach nicht was da 
passiert.

Ich habe jetzt auch schon Anleitungen gefunden, die erklären, wie ich 
direkt in der Xilinx ISE ein .bmm File einbinde und dann nur noch mit 
dem .mem File aus der pBlazeIDE das .bit File neu erstelle.
Bei mir scheint es daran zu scheitern, dass mein .bmm File ungültig ist.

NgdBuild:633 - invalid BMM file argument

Hier habe ich einen Teil meines Wissens her:
http://www.xilinx.com/support/answers/21460.htm

und hier:
http://www.fpgarelated.com/usenet/fpga/show/66323-1.php

Außerdem habe ich mir mal das data2mem pdf von Xilinx durchgelesen.

Meine Fragen sind also:
Wie binde ich das .bmm File korrekt ein?
Wie muss das .bmm File genau aufgebaut sein?
Wo bekomme ich zuverlässig die genaue Beschreibung meines BRAM her?
Welche Command Line Options muss ich setzen?

Meine Vorstellung wie es in Zuknuft funktionieren soll ist die, dass ich 
mit pBlazeIDE meinen Code überarbeite und kompiliere und dann nur noch 
über die Xilinx ISE die letzten Schritte zum .bit File ausführen muss um 
dann direkt den FPGA zu laden.

Danke schon mal
Viele Grüße

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit data2mem habe ich letztens erfolgreich gearbeitet.

Was erzeugt denn Deine pBlazeIDE als Output?
Wird der Speicher für den Picoblaze instanziiert oder inferiert?

Duke

Autor: sitzt_am_platz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aus meiner pBlazeIDE kommen zur Zeit 2 Files:

1. ein .vhd, welches ich in meinem ISE Projekt schon erfolgreich 
einbinde.
2. ein .mem File, dass ich künftig benutzen will.

Der Speicher wird wohl inferiert, wobei das alles in dem Modul 
embedded_kcpsm3 passiert und das habe ich nicht angefasst. Der 
Speicherinhalt wird im vhdl Modul mit Hilfe der Standard Vorlage von 
Mediatronix erzeugt.

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sitzt_am_platz schrieb:
> inferiert
Sehr gut.

Ich habe per Constraint im .ucf-File dafür gesorgt, das der Ram immer an 
die selbe Stelle wandert:
INST "<instanzpfad>/Mram_ram1" AREA_GROUP = "MEM1" ;
...
AREA_GROUP "MEM1" RANGE = "RAMB16_X1Y1:RAMB16_X1Y1" ;
...

Instanzpfad(e) und Locations habe ich mit PlanAhead ermittelt.

Das zugehörige .bmm-File sieht ungefähr so aus:
ADDRESS_SPACE my_memory 
    RAMB16 [0x00000000:0x00003fff]
    BUS_BLOCK 
        <instanzpfad>/Mram_ram1 [ 3: 0] PLACED = X1Y8;
        <instanzpfad>/Mram_ram2 [ 7: 4] PLACED = X1Y7;
        <instanzpfad>/Mram_ram3 [11: 8] PLACED = X1Y6;
        <instanzpfad>/Mram_ram4 [15:12] PLACED = X1Y5;
        <instanzpfad>/Mram_ram5 [19:16] PLACED = X1Y4;
        <instanzpfad>/Mram_ram6 [23:20] PLACED = X1Y3;
        <instanzpfad>/Mram_ram7 [27:24] PLACED = X1Y2;
        <instanzpfad>/Mram_ram8 [31:28] PLACED = X1Y1;
    END_BUS_BLOCK;
END_ADDRESS_SPACE;

Duke

Autor: Michael Sauron (Firma: www.das-labor.org) (laborsauron)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hatte vor einiger Zeit das selbe Problem:

Beitrag "Picoblaze - promgramm ändern ohne neue Synthese / implementierung"
Das sollte alle Fragen klären

Data2mem brauchst du dafür nicht. Auch die Xilinx ISE braucht man dafür 
nicht. Bei meiner Lösung klickst du einfach auf Compile (Picoblaze IDE) 
und sekunden später ist das Programm im FPGA.

Wenn da noch allgemeines Interesse besteht, kann ich ja mal einen Wiki 
Artikel machen.

Michael Sauron

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Sauron schrieb:
> ich ja mal einen Wiki
> Artikel machen
Das wäre ein feiner Zug :-)

Allerdings verwendes Du einen anderen Weg:

elf/hex -> svf -> xsvf -> jtag -> BRAM

Die Variante hab ich auch schonmal verwendet, aber playxsvf will unter 
Linux immer root-Rechte haben :-(
Außerdem muß man sich gut überlegen, was alles vom Reset (noch dem 
Upload) erfasst werden muß.

Jetzt habe ich einen USB-Programmer zur Verfügung, da dauert die 
Prozedur (inklusive compile, data2mem, impact) ca. 10 Sekunden.

Duke

Autor: sitzt_am_platz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

nach langem suchen muss ich leider sagen, es funktioniert immer noch 
nicht. Ich befürchte es liegt weiterhin an diesem .bmm File.

Ich habe auch ein Skript, dass das ganze außerhalb der ISE machen 
sollte, dass auch schon sicher getestet ist und funktioniert, aber auch 
da liefert data2mem einen Fehler, weil das .bmm File nicht passt.

@Duke: Danke für deine Anleitung. Kann es sein, dass da noch 
entscheidende Änderungen dazu kommen, wenn ich im BUS_BLOCK nur eine 
Zeile stehen habe? Ich verwende einen picoBlaze, der hat wohl nur einen 
Block.

In meinem Projekt ist noch ein BRAM vorhanden, der mit CoreGen erzeugt 
wurde. Kann das Probleme machen?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Duke Scarring (Gast)

>Mit data2mem habe ich letztens erfolgreich gearbeitet.

Mit welchem Picoblaze auf welchem FPGA? Bei Spartan3 und Picoblaze mit 
18 Bit Programmspeicherbreite geht das nämlich nicht! Das zensiert 
Programm ist dort buggy!! Es kann nur 16 Bit BRAM korrekt 
initialisieren!

Bei Spartan3 muss man also mit dem JTAG "Bootloader" arbeiten, geht aber 
auch sehr gut.

MFG
Falk

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> Mit welchem Picoblaze auf welchem FPGA?

Äähm, mit einer ZPU auf einem Spartan 3E. Die hat 32bit Speicherbreite. 
Da fällt mir der data2mem Fehler natürlich nicht auf.

Duke

Autor: sitzt_am_platz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für den Moment habe ich es mit data2mem aufgegeben und versuche Saurons 
Variante zum laufen zu bringen.

Das ganze tut auch so, als ob alles erfolgreich läuft, bis auf, dass auf 
dem FPGA keine Veränderung stattfindet. Da ich ein Display ansteuere 
müssten da ja gleich Änderungen zu sehen sein, wenn ich entsprechende 
Codezeilen ändere.

Wie muss ich das JTAG_Loader_ROM_form.vhd richtig einbinden?

Im Quicktutorial stand etwas von proc_reset mit dem reset von kcpsm3 
verbinden, was aber nicht ging. Ich gehe mal davon aus, dass man das 
ganze in der embedded_kcpsm3.vhd ändern muss. Aber dann bekomme ich den 
Fehler, dass ich nicht in und out Ports in unzulässiger Weise verbinden 
darf. reset in "embedded_kcpsm3" ist in und im ROM File ist es out. Ein 
neues Signal hizuzufügen, dass nur die proc_reset mit reset am kcpsm3 
verbindet hat bei mir zu sehr abstrusen Fehlern geführt. FATAL_ERROR ... 
Call hotline... data corrupted... etc.

Vielleicht habe ich auch das xsvfsetup noch nicht ganz korrekt. In der 
Impact GUI in ISE kann ich 2 Bausteine sehen auf dem Weg von TDI zu TDO. 
Der zweite ist mein spartan3. Der erste ist wohl ein Dummy. Ich habe 
schon ein bisschen damit herumexperiementiert, aber noch keine 
erfolgreiche Idee gehabt.

Viele Grüße

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist schon 'ne Weile her, das ich KCPSM3 verwendet habe. Vom Prinzip 
her ist es so, das Du wahrscheinlich von außen einen Reset hast und aus 
dem BSCAN-Modul ein weiterer Reset generiert wird. Die beiden müssten 
verodert werden und an die KCPSM ran. Beliebte Stolperfalle: Die 
Reset-Polarität. Ich benenne meine low-aktiven Signale alle mit 
<signalname>_n.

Duke

Autor: sitzt_am_platz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es sieht so aus, als ob Saurons Methode für mich komplett ausfällt. Wenn 
ich die nötigen Änderungen vornehme um den Reset beim neuladen des BRAM 
Inhalts zu erreichen synthetisiert die ISE nicht mehr. Ein neues Projekt 
und Projekt aufräumen habe ich beides schon probiert.
Der Fehler ist dann auch nicht bei meinen Änderungen, sondern mehrere 
Ebenen darüber, wo nichts geändert wurde, in der Top-Level Entity. Und 
dort auch noch laut ISE an der Stelle "end Structural". Dazu ein 
FATAL_ERROR etc.
Damit werde ich wohl doch den data2mem weg zum laufen bringen müssen, 
wenn das bei mir funktionieren soll.

An dieser Stelle behauptet zumindest Xilinx, dass das auch mit picoBlaze 
funktionieren sollte:
http://www.xilinx.com/support/answers/21460.htm

Grüße
sitzt_am_platz

Autor: sitzt_am_platz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein neuester Versuch das Programm direkt auf den picoBlaze zu bekommen, 
war mit Hilfe der Data2MEM_assistance Dateien, die zusammen mit dem 
picoBlaze runter zu laden sind. Leider führt das auch noch nicht zum 
Erfolg.

Es kommt folgendes:
ERROR:Data2MEM:33 - Matching ADDRESS_SPACE for code segment #16 not 
found in 'meine_datei.bmm'
Code Segment #16 occupies [0x00000400:0x0000043F]
Aber eigentlich sollte sich der Speicher des picoblaze hier befinden, 
laut
[0x00000000:0x000003FF]

Das .bmm file wird jedesmal beim Ausführen des Compilens neu erzeugt. 
Ich verstehe einfach nicht, was da passiert.Warum kommen da falsche 
Daten zwischen 2 Schritten rein, die eigentlich nicht da sein dürften.

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sitzt_am_platz schrieb:
> 'meine_datei.bmm'

> Code Segment #16 occupies [0x00000400:0x0000043F]
Ist Dein Code zu groß? Du hast ja nur bis 0x3ff Platz, aber Dein Segment 
16 geht von 0x400 bis 0x43f. Wieviele Segmente hast Du denn?

Duke

Autor: sitzt_am_platz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Code hat ungefähr 200 Befehle.
Ich habe dazu einfach das change_pb_bits.bat das von Ken Chapman ist 
verwendet. unverändert.

Ich habe allerdings keinen SourceCode für den Standardcompiler, sondern 
nur für pBlazeIDE. Daher lasse ich mir von pBlaze ein MEM File 
generieren und übergebe dieses.
______________________________
echo Running Assembler
kcpsm3 %1
if exist .\%1.mem goto make_bmm:
  echo ERROR - Unable to assemble program - Check PSM file
  goto end
:make_bmm
echo Creating BMM file
echo Select a BRAM from the list provided
pb_bmm %1.bmm %2.ncd
if exist .\%1.bmm goto make_bit:
  echo ERROR - Unable to create BMM file - Check design name
  goto end
:make_bit
echo Generating new BIT file
data2mem -bm %1.bmm -bd %1.mem -bt %2.bit -o b new_%2.bit
:end
pause
____________________________________

So sieht das Skript aus. Beim ausführen von pb_bmm muss man dann den 
richtigen Speicher auswählen und damit ein entsprechendes .bmm File 
erzeugen. Danach wird alles an data2mem übergeben und das gibt nur einen 
Fehler aus.

Es ist durchaus ziemlich komisch, dass der im .bmm File angegebene BRAM 
bereich nicht [0x00000000:0x000003FF] ist. Der im .bmm angegebene 
Bereich hat nur 0x3F, also 63 Stellen. Dabei sollten es eigentlich 1024 
sein. Es werden auch nur 2 BRAM Blöcke genutzt, einer für den picoBlaze 
und noch ein zweiter, der doppelt so groß sein sollte von weiteren weiß 
ich nichts und die Design Summary auch nicht.

Autor: Michael Sauron (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wie muss ich das JTAG_Loader_ROM_form.vhd richtig einbinden?
Ich habe der umgebung des Picoblaze eine eigene Entity gegönnt. In 
dieser werden kcpsm3.vhd und JTAG_loader_Rom_form.vhd als component 
eingebunden.

Zeig doch mal deine einbindung und deine Reset anbindung.

>embedded_kcpsm3.vhd
bei mir heißt die kcpsm3.vhd. In dieser Datei darfst du auf keinen Fall 
was ändern.


>Im Quicktutorial stand etwas von proc_reset mit dem reset von kcpsm3
>verbinden, was aber nicht ging.

Ohne den Reset läuft der Picoblaze einfach weiter, ohne den 
Programmcounter zu ändern. Dadurch wird dann unkontrolliert irgendetwas 
im neuen Programm ausgeführt.

>synthetisiert die ISE nicht mehr.
Willkommen in der Welt von Xilinx, manchmal haben hier schon kleine 
Fehler sehr merkwürdige folgen. Poste mal Code

Ich verwende diese Methode jetzt schon seit Jahren. Anfänglich hatte ich 
es auch mit Mem und Bmm erfolglos versucht.

Michael Sauron

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.