Hallo zusammen, ich möchte ein MIG Core erzeugen um einen DDR3 RAM auf einem Spartan 6 Board anzubinden. Ich hab das Trenz TE0600 mit einem Spartan xc6slx45 fgg484 -2, der hat zwei MIC Blöcke drin, sollte also eigentlich gehen. Nun klappt das leider überhaupt nicht so, wie ich mir das vorgestellt habe: Ich dachte, der MIG erzeugt mir einen komplett funktionierenden Code, den ich direkt so verwenden kann um in den Speicher zu schreiben. Stattdessen bekomme ich aber einen Code, der sich zwar (mit den miterzeugten Files) simulieren lässt, der aber beim Synthetisieren hunderte Warnings ausspuckt und beim Implementieren mehrere Fehler. Also habe ich den MIG mal separiert und nur einen VHDL Wrapper da herum geschrieben (ich programmiere eigtl. in VHDL, von Verilog hab ich kaum Ahnung), um erstmal andere Fehler auszuschließen. Der Wrapper macht quasi nix anderes als nur den MIG zu instantiieren. Könnt ihr mir da weiterhelfen den MIG an meinen FPGA anzupassen und zum Laufen zu bringen? Ich finde in den Xilinx Dokumentationen keine hilfreichen Hinweise und weiß gar nicht so genau, wo ich anfangen soll... Den Code habe ich mal mit angehängt, sonstige Infos zum Speicher sind: - FPGA wie oben - Top Level Language des Projekts: Verilog (sonst lässt sich kein AXI4 Interface hinzufügen); Breite ist 32bit - habe also nur einen einzelnen bidirektionalen 32bit Port erzeugt - Speicher: MT41J128M16XX-187E - MIC 3 - 3000ps - Calibrated Input Termination - RZQ - K7 - ZIO - Y2 - Single Ended System Clock Würde mich freuen, wenn ihr da mal drüberschauen und mir ein paar Hinweise geben könntet. Vielen Dank schon mal!
brauchst du wirklich axi4 interface reicht das normale interface nicht?? es sollte vom prinzip her identisch sein, aber ich kenn die namen der signale beim axi 4 nicht wirklich. also nur mit dem migcore passiert da nicht viel, du musst dir schon ne kleine zustandsmaschine zusammenschreiben die den migcore mit daten und steuersignalen versorgt. vorgehensweise: 1.migcore erstellen 2.template in dein modul kopieren 3.kleine fsm, steuerung.. wie auch immer du es nennen willst um den migcore schreiben 4. I/O der migcores ins hauptmodul legen und deine ucf anpassen. dazu kannst du im ordner .../"modulname"/user_design/par/ "modulname".ucf die passenden einträge rauskopieren und notfalls die namen der pins anpassen. die lage der pins is festgelegt. falls du fragen zur steuerung vom miginterface hast guck mal hier Beitrag "Xilinx MIG Userinterface Doku" ich kann leider nur verilog daher kann ich dein vhdl-txt nicht analysieren.
das AXI4 Interface brauche ich, weil ich den MIG an den Virtual FIFO Controller von Xilinx anschließen möchte. Ich habe eigentlich einen AXI4 Stream, der wird dann vom VFIFO gebuffert. Der VFIFO benutzt zum Speichern das externe RAM und wandelt dafür den Stream in einen adressbasierten AXI4 Bus um, der an den MIG angeschlossen werden kann. Dadurch spare ich mir die ganze Adressumwandlung, mit der ich mich demzufolge auch noch nicht beschäftigt habe. Und ich würde es mir wenn möglich auch weiterhin sparen wollen... So eine FSM habe ich mir schon gebaut und auch schon über Simulation überprüft (läuft ohne Fehler und Warnings). Es werden ein paar Daten geschrieben und dann beim Auslesen wieder mit den gleichen Daten verglichen und entsprechend eine LED gesetzt, wenn die Daten stimmen. Nur wenn ich jetzt alles zusammenschließe, bekomme ich ca. 3000 Warnings im VFIFO und dem MIG und dann im MIG Fehler, was für mich dann nicht mehr zu überblicken ist. Ich habe das komplette Projekt nochmal angehängt, es ist allerdings in VHDL (abgesehen von den Cores, die sind aus oben genannten Grund in Verilog). Sorry dass die Datei so groß ist, das liegt am VFIFO. Dafür habe ich aber alles sehr ausführlich kommentiert, auch die Bedeutung der AXI4 Signale.
rzq und zio sind weder zu gewiesen noch haben sie einen io-standard (zumindest in dem zip, ebenso is text deines ersten posts im ucf-file drin). also wenn ich mir die fehlermeldung angucke denke ich das ucf-file ist schuld. du musst aufpassen alle pins in einer io-bank müssen nen kompatiblen io-standard besitzen. da dein ramcontroller mit 1.5V arbeitet müssen alle pins in der bank nen 1.5V-iostandard haben. wenn du den io-standard vergisst oder weglässt wird defaultmässig 2.5V-standard verwendet. das passt nicht zusammen. den fehler hatte in anfangs auch als ich mit dem mig gearbeitet hab. desweiteren steht im report das du nur 49 von 77 io nem pin zugewiesen hast. da fehlen 28 (minus die beiden oben erwähnten also 26). wie bereits gesagt ich kann kein vhdl, aber kann es sein das die vfifo-pins kompletten fehlen in deiner ucf?? also ich seh sie net, außer du hast noch nen 2tes ucf-file was beim zip fehlt.
sorry, ich hab ein bisschen voreilig die Dateien hochgeladen, da war noch einiges auskommentiert usw. von meinen letzten Versuchen. Den Beitrag hatte ich nur reinkopiert, weil mein Rechner gerade angedeutet hat stehen zu bleiben und ich ihn noch schnell irgendwo zwischenspeichern wollte =). Als ich gemerkt habe, dass er noch drin ist, hatte ich es schon hochgeladen... Ich hab die beiden Dateien jetzt nochmal ein bisschen bereinigt und auch die letzten Pins hinzugefügt (und jetzt nochmal mit hochgeladen). In general.ucf ist nur der obere Teil mit den LEDs und Testpins von mir, der Rest ist im Prinzip wieder im Ausgangszustand vom Core Generator (hab sonst nur den Pin LOC von c3_sys_clk und c3_sys_rst_i an den clk bzw rst Pin des Boards angepasst). Vorher hatte ich einiges, was der MIG erzeugt hat, auskommentiert, weil es als Fehler angegeben wurde. Die Fehler bleiben aber. Ich vermute auch, dass noch Änderungen im ucf File gemacht werden müssen, aber ich wüsste nicht wo, hab da keinerlei Ansatzpunkt und Xilinx Dokumentationen haben mir bisher nicht weitergeholfen... Wie ist das mit den IO-Standards in den IO-Bänken? Fehlt da bei mir noch was? Macht das nicht der MIG automatisch?
D. S. schrieb: > Die Fehler bleiben aber. Poste doch mal die Fehlermeldungen. Ich habe keine Lust, mit 16 MB runterzuladen, um die Fehlermeldung zu suchen :-/ Duke
Einige Fehler habe ich schon beseitigen können. Aktuell ist gerade dieser Fehler: ERROR:Place:866 - Not enough valid sites to place the following IOBs: IO Standard: Name = LVCMOS25, VREF = NR, VCCO = 2.50, TERM = NONE, DIR = BIDIR, DRIVE_STR = 12 IO This may be due to either an insufficient number of sites available on the device, too many prohibited sites, or incompatible I/O Standards locked or range constrained to I/O Banks with valid sites. This situation could possibly be resolved by one (or all) of the following actions: a) Grouping IOBs of similar standards into a minimum amount of I/O Banks by using LOC or range constraints. b) Maximizing available I/O Banks resources for special IOBs by choosing lower capacity I/O Banks if possible. c) If applicable, decreasing the number of user prohibited sites or using a larger device. ERROR:Place:382 - The placer was unable to find a feasible solution for the IOBs in your design. This is possibly due to SelectIO banking constraints. Each Group of a specific Standard is listed. Standard LVCMOS33 (Vref=NR Vcco=3.30 Terminate=none) 11 IOs, 11 locked. (2-Inputs, 9-Outputs, 0-Bidirectional) Standard LVCMOS25 (Vref=NR Vcco=2.50 Terminate=none) 1 IOs, 0 locked. (0-Inputs, 0-Outputs, 1-Bidirectional) Standard SSTL15_II (Vref=0.75 Vcco=1.50 Terminate=none) 41 IOs, 41 locked. (0-Inputs, 24-Outputs, 17-Bidirectional) Standard DIFF_SSTL15_II (Vref=NR Vcco=1.50 Terminate=none) 6 IOs, 6 locked. (0-Inputs, 2-Outputs, 4-Bidirectional) Standard LVCMOS15 (Vref=NR Vcco=1.50 Terminate=none) 5 IOs, 5 locked. (0-Inputs, 5-Outputs, 0-Bidirectional) Ich vermute es hat etwas mit folgender Info aus dem Map-Report zu tun: IO Utilization: Number of bonded IOBs: 64 out of 316 20% Number of LOCed IOBs: 63 out of 64 98% Kann das sein, das vielleicht intern im Modul noch ein Pin ist oder so, den ich noch anschließen muss? Wie finde ich heraus, welcher das ist (denn die Meldung nennt ja nichts genaues)? (ich hab mein UCF auch nochmal angehängt)
ERROR:Place:866 - Not enough valid sites to place the following IOBs: IO Standard: Name = LVCMOS25, VREF = NR, VCCO = 2.50, TERM = NONE, DIR = BIDIR, DRIVE_STR = 12 IO Standard LVCMOS25 (Vref=NR Vcco=2.50 Terminate=none) 1 IOs, 0 locked. (0-Inputs, 0-Outputs, 1-Bidirectional) der scheint nicht zugewiesen! wenn du mit planahead arbeitest dann, kannst du mal "open elaborated design" anklicken (im flow navigator), dann gibts unten nen reiter io-ports denn mal anklicken, so und wenn du die liste durch suchst müsste ein io-pin so grau sein, alle gelockt sind gelb. denn kannst du dann sogar genau in dem feld nen pin zuweisen und nen io-standard,etc. aber aufpassen der io-standard muss zu den restlichen pins in der bank passen!
EDIT: habs vergessen du arbeitest ja mit navigator, da gehts auch über tools-> planhead - i/o pin planning usw
Danke für den Hinweis. Ich habs gleich ausprobiert, aber alle Pins sind verbunden und LOCed. Kann das sein, dass es vielleicht ein interner Pin ist? Dort in PlanAhead werden ja nur die TopLevel Pins angezeigt? Oder bin ich ganz auf dem falschen Weg und der Fehler liegt völlig woanders? Hier nochmal der Fehler in Kurzfassung aus der Konsole: ERROR:Place:866 - Not enough valid sites to place the following IOBs: IO Standard: Name = LVCMOS25, VREF = NR, VCCO = 2.50, TERM = NONE, DIR = BIDIR, DRIVE_STR = 12 IO ERROR:Place:382 - The placer was unable to find a feasible solution for the IOBs in your design. This is possibly due to SelectIO banking constraints. ERROR:Place:418 - Failed to execute IOB Placement ERROR:Pack:1654 - The timing-driven placement phase encountered an error.
da gitbs in der liste nen reiter scalar ports hast du da auch nachgeguckt? wirklich mal komplett die liste durch gehen und zähl mal alle pins die er anzeigt. d.h. also alle ports öffnen und dir JEDEN PIN von JEDEM PORT angucken
Ja, hab ich gemacht. Da ist alles verbunden. Er zeigt mir da auch nur 63 Ports an "All ports(63)", während im Map Report steht:
1 | IO Utilization: |
2 | Number of bonded IOBs: 64 out of 316 20% |
3 | Number of LOCed IOBs: 63 out of 64 98% |
Und einen Port, der "IO" heißt, habe ich ja nicht. Das scheint also irgendwie ein Buffer im MIG zu sein, der nicht bis zur Top Level Source angeschlossen ist, quasi vom Core Generator erzeugt wurde aber nicht benutzt wird. Und der scheint in der falschen Bank zu liegen oder sonst irgendwas, die nicht mit dem IOSTANDARD zusammenpasst. Oder irgendwas anderes ist faul? Ich kann nur schlecht in den unzähligen Sourcedateien nach "IO" suchen, da kommen tausende Ergebnisse...
Ja, kenne ich. Da hab ich die Pin Locations für rzq und zio her. Leider nützt mir das "Referenzprojekt" von Trenz nichts, denn: 1) Es ist eigentlich kein Referenzprojekt sondern nur ein IP Core, der erzeugt wurde, um die Pínzuweisungen beim Erstellen des Boards zu machen (siehe Trenz Forum) - es ist also in keinster Weise an irgendetwas angepasst sonder "raw" 2) Hat es kein AXI4 Interface, das ich ja für den weiteren Anschluss in meinem Projekt (an den VFIFO) brauche
D. S. schrieb: > Da hab ich die Pin Locations für rzq und zio her Der MIG hat dein Design mit ZIO erzeugt, aber du hast es später im toplevel und im ucf auskommentiert, oder? Verschwindet das Problem mit dem 64. IOB, wenn du den ZIO wieder ins Design reinnimmst und ihm eine passende LOC und IOStandard gibts?
Der MIG hat das Design ohne zio erzeugt (also auch nicht im Instantiation Template). Komischerweise hat er es dann trotzdem als Pin in das UCF platziert. Das gab dann einen Fehler. Im toplevel hatte ich es dann testweise mal in die Portliste geschrieben und bei der Mig instantiierung hinzugefügt. Das ist dort allerdings nicht verarbeitet, deshalb machte er dann einen Fehler beim Synthetisieren. Deshalb ist es dort dann wieder auskommentiert... Naja, leicht merkwürdig...
Ich habe mich auch gerade am am gleichen Board versucht. Wenn ich das Example Design ausprobiere ist die LED für Calibration an. Das ist schon sehr gut. Aber leider ist auch immer die Error LED auch an. Bleibt die bei dir aus?
D. S. schrieb: > Von welchem Exampledesign sprichst du denn? Das von Trenz? Nein. Ich habe mir mit dem Coregenerator den MCB3 generiert. Dann ist im Unterverzeichnis ipcore_dir ein Beispiel. Dann habe ich das UCF File und die PLL etwas angepasst.
Hallo René, ich hänge da immer noch dran und bekomme es einfach nicht hin... Hast du den MIG auch mit AXI4 Interface erzeugt? Hast du da jetzt überhaupt noch weiter gemacht? Bist du da jetzt weitergekommen, hast du Daten speichern und auslesen können? Das kann doch eigentlich nicht so schwer sein, ich habe das mit den IP-Cores bis jetzt eigentlich so verstanden, dass sie einem die Arbeit abnehmen und nicht dass man graue Haare deshalb bekommt... Einen IP-Core muss man doch eigentlich nur erzeugen und dann funktioniert er,oder hab ich da was falsch verstanden? Ich kann mich doch nicht durch die tausenden Zeilen Code durcharbeiten und ihn korrigieren... Die Sache ist auch die, ich brauche unbedingt das AXI4 Interface, da ich den MIG dann einfach mit dem VFIFO verbinden kann. Der soll mir dann die Arbeit abnehmen: Ich schreibe einen AXI4 Stream in den VFIFO, der wandelt es in ein adressbasiertes AXI4 um, speichert es über den MIG im DDR3 und dann kann ich es wieder als Stream aus dem VFIFO auslesen. (leider kann man das AXI4 Interface nur erzeugen, wenn der Core auf Verilog gestellt ist und ich kann eigentlich nur VHDL) (BTW: die Files oben sind längst nicht mehr aktuell)
D. S. schrieb: > Hallo René, > > ich hänge da immer noch dran und bekomme es einfach nicht hin... > > Hast du den MIG auch mit AXI4 Interface erzeugt? Hast du da jetzt > überhaupt noch weiter gemacht? Bist du da jetzt weitergekommen, hast du > Daten speichern und auslesen können? Nein ich habe noch nicht weiter gemacht. Es müssen Änderungen im Code gemacht werden. Der MIG weiß ja nicht, dass der Eingangstakt 125MHz sind. Ich muss mir erst noch was zum Validieren bauen. Hast du es bei beiden MCBs ausprobiert? Ich schreibe lieber meine Sachen in nativen VHDL. Ich nutze den AHB-lite bus für meine Sachen. Den AXI4 wollte ich immer mal anschauen, wurde noch nie konfrontiert. Ich weiss bei Xilinx wird er als neue Schnittstelle oft genutzt. Einen FiFo zu schreiben ist auch nicht schwer. Ich habe aber die Vermutung dein VFIFO macht noch etwas mehr, wie die Adressdecodierung. Läuft dein Code ohne AXI4 interface richtig?
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.