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
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
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.
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
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
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?
@ 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
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
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
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
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
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.
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
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.
>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