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.
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:
1 | INST "<instanzpfad>/Mram_ram1" AREA_GROUP = "MEM1" ; |
2 | ... |
3 | AREA_GROUP "MEM1" RANGE = "RAMB16_X1Y1:RAMB16_X1Y1" ; |
4 | ... |
Instanzpfad(e) und Locations habe ich mit PlanAhead ermittelt. Das zugehörige .bmm-File sieht ungefähr so aus:
1 | ADDRESS_SPACE my_memory |
2 | RAMB16 [0x00000000:0x00003fff] |
3 | BUS_BLOCK |
4 | <instanzpfad>/Mram_ram1 [ 3: 0] PLACED = X1Y8; |
5 | <instanzpfad>/Mram_ram2 [ 7: 4] PLACED = X1Y7; |
6 | <instanzpfad>/Mram_ram3 [11: 8] PLACED = X1Y6; |
7 | <instanzpfad>/Mram_ram4 [15:12] PLACED = X1Y5; |
8 | <instanzpfad>/Mram_ram5 [19:16] PLACED = X1Y4; |
9 | <instanzpfad>/Mram_ram6 [23:20] PLACED = X1Y3; |
10 | <instanzpfad>/Mram_ram7 [27:24] PLACED = X1Y2; |
11 | <instanzpfad>/Mram_ram8 [31:28] PLACED = X1Y1; |
12 | END_BUS_BLOCK; |
13 | END_ADDRESS_SPACE; |
Duke
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.