Forum: FPGA, VHDL & Co. MIG mit AXI4 Interfacenauf Spartan 6


von D. S. (des)


Angehängte Dateien:

Lesenswert?

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!

von G.A. (Gast)


Lesenswert?

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.

von D. S. (des)


Angehängte Dateien:

Lesenswert?

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.

von G.A. (Gast)


Lesenswert?

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.

von D. S. (des)


Angehängte Dateien:

Lesenswert?

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?

von Duke Scarring (Gast)


Lesenswert?

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

von D. S. (des)


Angehängte Dateien:

Lesenswert?

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)

von Trundle T. (shaheed)


Lesenswert?

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!

von Trundle T. (shaheed)


Lesenswert?

EDIT: habs vergessen du arbeitest ja mit navigator, da gehts auch über 
tools-> planhead - i/o pin planning usw

von D. S. (des)


Lesenswert?

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.

von Trundle T. (shaheed)


Lesenswert?

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

von D. S. (des)


Lesenswert?

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

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?


von D. S. (des)


Lesenswert?

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

von Achim S. (Gast)


Lesenswert?

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?

von D. S. (des)


Lesenswert?

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

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

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?

von D. S. (des)


Lesenswert?

Von welchem Exampledesign sprichst du denn? Das von Trenz?

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

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.

von D. S. (des)


Lesenswert?

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)

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

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
Noch kein Account? Hier anmelden.