Hallo, nachdem ich nun seit ein paar Tagen an der Ansteuerung des DDR2 RAM´s sitze hätte ich nun ein paar fragen zu diesem Thema. Erstmal vorweg, ich habe die Dokumente UG086 und XAPP858 schnon gelesen. Außerdem habe ich mir unter dem Thread Beitrag "Xilinx Spartan 3AN -- DDR2 SDRAM Ansteuerung" schon gue Ansätze und auch Beispielprogramme angesehen. Nun will ich die Ansteuerung auf dem Board ML507 mit dem Virtex-5 XC5VFX70T-FF1136 und dem DDR2 RAM Speicher von Micron MT4HTF3264HY-667F1 (256MB, PC2-5300) durchführen. Dafür habe ich zunächst den CoreGenerator gestartet, neues Projekt mit dem Virtex 5 und der passenden Auswahl getroffen. Anschließend habe ich den MIG gestartet und habe dem Standard entsprechend alles ausgewählt und eingestellt. Nun zu meiner Frage. Bei der Bank Section habe ich Probleme gehabt. Es gibt ja die Möglichkeit entweder "New Design:..." oder "Fixed Pin Out:..:" auszuwählen. Zunächst habe ich es mit "New Design" versucht, doch die PIN Zuweisungen in der UCF Datei sind alle vollkommen an falschen Bänken und Loc dranne gewesen. Alle händisch zu ändern in der UCF wäre nicht die Lösung hatte ich mir gedacht, da die Instanzen mit ihren Loc Einträgen nicht mehr stimmen würden (richtig oder falsch, erstmal kein Plan dazu). Dann habe ich versucht mit "Fixed..." die Locs alle selber einzugeben. hat auch für die meisten geklappt. Probleme hatte ich an folgenden Pins: ddr2_we: normalerweise laut Schematic des ML507-Boards muss der an Pin K29, doch der MIG kennt diesen Pin nicht, habe einfach deswegen irgend einen zugewiesen und manuell in der UCF nach K29 umgeändert. K29 wird, wenn ich in Plattform Studio die DDR2 Anbindung zum Prozessor mache auch eingetragen, deswegen denke ich, dass K29 ein Bug ist.(?) Wietere Pins wie sys_rst_n, phy_init_done, error, sys_clk_p, sys_clk_n, clk200_p und clk200_n waren für mich nicht ganz ersichtlich. Fakt ist, dass ich zu allem eine Verbindung machen musste, da sonst der MIG nichts generiert (oder ich einfach nicht next drücken konnte :) ). clk200_p und _n habe ich an den 200MHz differetiellen Taktpins verbunden. sys_rst_n habe ich an einem Switch verbunden. phy_init_done und error an LEDs. sys_clk_p und sys_clk_n wusste ich überhaupt garnicht wohin damit, habe sie erstmal einfach an INPUT-Ports verbunden, um die Generierung mit MIG abschließen zu können. Könnt ihr mir zu den Pins sagen, ob die richtig verbunden sind und ob die Methode mit "Fixed Pin Out:..." überhaubt der richige Ansatz ist? Der nächste Schritt für mich wäre jetzt, durch die Beispiel-Projekte (Thread-Link oben angegeben) auf die DDR2 etwas raufzuschreiben und wieder zu lesen. Würde mich über jeden Beitrag sehr freuen. mfg Cihan
Für das ML507 sollten sich doch fertige Beispiele finden lassen. Und da das Board schon existiert würde ich auch eine fertige .ucf-Datei dafür verwenden... Duke
Danke erstmal für die Anwort Duke. Habe selber viel recherchiert und habe auch Beispiele gefunden, aber das Problem ist dort das gleiche. Die Pin-Zuweisungen passen nicht zum DDR2 RAM. Abgesehen vom RAM passen nicht einmal die CLK Zuweisungen. Ist es denn verkehrt, dass ich die Zuweisungen manuell alle selber mache? und leider weiss ich nicht ob alle richtig sind, wie oben beschrieben. Cihan
Cihan Kalayci schrieb: > und habe auch Beispiele gefunden, aber das > Problem ist dort das gleiche. Die Pin-Zuweisungen passen nicht zum DDR2 > RAM. Dann sind es nicht die richtigen Beispiele gewesen. Das Board ist ja schon fertig. Und im Schaltplan steht welches Pin wie beschaltet ist. Das mußt Du letztendlich dem Coregen/MIG als Vorgabe mitgeben. Duke
Genauso habe ich es ja auch gemacht. Es geht jetzt erstmal nur um folgende Pins(wie oben erwähnt): Zitat aus Beitrag 1: Dann habe ich versucht mit "Fixed..." die Locs alle selber einzugeben. hat auch für die meisten geklappt. Probleme hatte ich an folgenden Pins: ddr2_we: normalerweise laut Schematic des ML507-Boards muss der an Pin K29, doch der MIG kennt diesen Pin nicht, habe einfach deswegen irgend einen zugewiesen und manuell in der UCF nach K29 umgeändert. K29 wird, wenn ich in Plattform Studio die DDR2 Anbindung zum Prozessor mache auch eingetragen, deswegen denke ich, dass K29 ein Bug ist.(?) Wietere Pins wie sys_rst_n, phy_init_done, error, sys_clk_p, sys_clk_n, clk200_p und clk200_n waren für mich nicht ganz ersichtlich. Fakt ist, dass ich zu allem eine Verbindung machen musste, da sonst der MIG nichts generiert (oder ich einfach nicht next drücken konnte :) ). clk200_p und _n habe ich an den 200MHz differetiellen Taktpins verbunden. sys_rst_n habe ich an einem Switch verbunden. phy_init_done und error an LEDs. sys_clk_p und sys_clk_n wusste ich überhaupt garnicht wohin damit, habe sie erstmal einfach an INPUT-Ports verbunden, um die Generierung mit MIG abschließen zu können. (Zitat Ende) K29 => ddr2_we: hatte der MIG nicht erkannt, ich habs in der UCF händisch geändert. und die Pins: sys_rst_n => wohin? phy_init_done => LED (richtig???) error => LED (richtig???) sys_clk_p = wohin? sys_clk_n => wohin? clk200_p => an CLK200 Differetial (p) clk200_n => an CLK200 Differetial (n)
Hat denn keiner schon mal den DDR2 Ram einen Virtex 5 ML507 Board in Betrieb genommen? evtl. Links mit Beispielen? gruß Cihan
Cihan Kalayci schrieb: > Links mit Beispielen? Dies? http://www.xilinx.com/products/boards/ml507/ml507_12.1/mig.htm
Danke für den Link. Den hatte ich mir auch schon angesehen. In diesem Design stimmen die Pin-Zuweisungen aber nicht (ich hoffe ich täusche mich nicht). Lege die UCF-File des Referenz-Designs und die Schematic in den Anhang. Wenn mann die Pins so vergleicht, stimmt es überhaupt garnicht überein, oder??? Cihan
Cihan Kalayci schrieb: > Lege die UCF-File des Referenz-Designs und die Schematic in den Anhang. > Wenn mann die Pins so vergleicht, stimmt es überhaupt garnicht überein, > oder??? Hast Du das PDF dazu gelesen? Nach AR#29313 muss das generierte MIG-Design mit dem ML507-UCF erneut durchlaufen werden (per "Update Design"). Danach stimmen dann die Pinzuordnungen.
Das habe ich eigentlich auch gemacht, hat aber nicht das richtige gebracht. Was ich jetzt neu sehe, das user_design (vom Coregenerator erzeugt) hat zwar die falschen Pin-Zuweisungen, aber das example_design (ebenfalls vom CoreGenerator erzeugt) hat die richtigen Pin-Zuweisungen. Nun habe ich die .vhd-Files des example_designs und die dazugehörige UCF in einem neuen leeren Projekt eingefügt und durchlaufen lassen (Generate...). Er hats bis zum Ende geschafft. War da aber nicht noch etwas mit den Instanzen in der UCF die evtl. angepasst werden müssen??? Habe nämlich jede Menge an Warnings bekommen(ca. 1300)?!?! Abgesehen davon, der nächste Schritt wäre doch nun, die Initialisierung, Write und Read State-Machine unter Verwendung von UG086 zu entwickeln? Cihan
Cihan Kalayci schrieb: > Abgesehen davon, der nächste Schritt wäre doch nun, die Initialisierung, > Write und Read State-Machine unter Verwendung von UG086 zu entwickeln? Initialisieren musst Du WIMRE nix, das macht der Core. Du kannst dich also ganz auf's Lesen und Scheiben konzentrieren, dabei sollte Dir UG086 weiterhelfen. Evtl. kann der Traffic-Generator aus dem MIG Example-Design noch hilfreich sein, das ist aber schon eher Geschmackssache.
kurz mal zu den Warnings nochmal, sind die erstmal schlimm bzw. hängt es evtl. auch mit den Instanzen des UCFs zusammen? und nochmal kurz auf die wrie und read Statemachine. Im Prinzip muss ich doch genau nach dem Schema aus UG086 (Bild im Anhang: Write_Section) die Statemachine für den Write-Vorgang programmieren. Oder?? (Read dann natürlich auch entsprechend) Cihan
Hallo nochmal, ich habe ein problem mit den Diff-Clock vom Virtex 5. Wenn ich die MIG ereuge mit differentiel Clock Input (wählbare Option), dann muss ich sys_clk_p, sys_clk_n, clk200_p und clk200_n eine Portzuweisung machen. Das Problem ist nun, dass ich nur einen differentiellen 200 MHz Quarz habe, den ich an clk200_p/_n verbunden habe. Was mache ich nun mit sys_clk_p/_n, mit was soll ich die verbinden? Die Testbench, erzeugt von MIG, läuft dann auch nicht. Bin ratlos, brauche hilfe, danke. Cihan
laut Referenz-Design muss ja sys_clk_p/_n an die SMA Connectors. "sys_clk_p" => H14 "sys_clk_n" => H15 Zum einen ist erstmal an den SMA Connectoren nicht dranne und zum anderem brauche ich sie im Projekt später für etwas anderes. Wie soll nun das System seine System-Clock erhalten? (also wo oder wie am besten sys_clk_p/_n beschalten?) Cihan
#### Module DDR2_SDRAM constraints Net fpga_0_DDR2_SDRAM_DDR2_ODT_pin<0> LOC=F31; Net fpga_0_DDR2_SDRAM_DDR2_ODT_pin<0> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_ODT_pin<1> LOC=F30; Net fpga_0_DDR2_SDRAM_DDR2_ODT_pin<1> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<0> LOC=L30; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<0> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<1> LOC=M30; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<1> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<2> LOC=N29; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<2> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<3> LOC=P29; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<3> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<4> LOC=K31; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<4> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<5> LOC=L31; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<5> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<6> LOC=P31; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<6> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<7> LOC=P30; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<7> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<8> LOC=M31; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<8> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<9> LOC=R28; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<9> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<10> LOC=J31; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<10> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<11> LOC=R29; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<11> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<12> LOC=T31; Net fpga_0_DDR2_SDRAM_DDR2_A_pin<12> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_BA_pin<0> LOC=G31; Net fpga_0_DDR2_SDRAM_DDR2_BA_pin<0> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_BA_pin<1> LOC=J30; Net fpga_0_DDR2_SDRAM_DDR2_BA_pin<1> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_CAS_N_pin LOC=E31; Net fpga_0_DDR2_SDRAM_DDR2_CAS_N_pin IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_CKE_pin<0> LOC=T28; Net fpga_0_DDR2_SDRAM_DDR2_CKE_pin<0> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_CS_N_pin<0> LOC=L29; Net fpga_0_DDR2_SDRAM_DDR2_CS_N_pin<0> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_RAS_N_pin LOC=H30; Net fpga_0_DDR2_SDRAM_DDR2_RAS_N_pin IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_WE_N_pin LOC=K29; Net fpga_0_DDR2_SDRAM_DDR2_WE_N_pin IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_CK_pin<0> LOC=AK29; Net fpga_0_DDR2_SDRAM_DDR2_CK_pin<0> IOSTANDARD = DIFF_SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_CK_pin<1> LOC=E28; Net fpga_0_DDR2_SDRAM_DDR2_CK_pin<1> IOSTANDARD = DIFF_SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_CK_N_pin<0> LOC=AJ29; Net fpga_0_DDR2_SDRAM_DDR2_CK_N_pin<0> IOSTANDARD = DIFF_SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_CK_N_pin<1> LOC=F28; Net fpga_0_DDR2_SDRAM_DDR2_CK_N_pin<1> IOSTANDARD = DIFF_SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DM_pin<0> LOC=AJ31; Net fpga_0_DDR2_SDRAM_DDR2_DM_pin<0> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DM_pin<1> LOC=AE28; Net fpga_0_DDR2_SDRAM_DDR2_DM_pin<1> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DM_pin<2> LOC=Y24; Net fpga_0_DDR2_SDRAM_DDR2_DM_pin<2> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DM_pin<3> LOC=Y31; Net fpga_0_DDR2_SDRAM_DDR2_DM_pin<3> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DM_pin<4> LOC=V25; Net fpga_0_DDR2_SDRAM_DDR2_DM_pin<4> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DM_pin<5> LOC=P24; Net fpga_0_DDR2_SDRAM_DDR2_DM_pin<5> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DM_pin<6> LOC=F26; Net fpga_0_DDR2_SDRAM_DDR2_DM_pin<6> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DM_pin<7> LOC=J25; Net fpga_0_DDR2_SDRAM_DDR2_DM_pin<7> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQS<0> LOC=AA29; Net fpga_0_DDR2_SDRAM_DDR2_DQS<0> IOSTANDARD = DIFF_SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQS<1> LOC=AK28; Net fpga_0_DDR2_SDRAM_DDR2_DQS<1> IOSTANDARD = DIFF_SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQS<2> LOC=AK26; Net fpga_0_DDR2_SDRAM_DDR2_DQS<2> IOSTANDARD = DIFF_SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQS<3> LOC=AB31; Net fpga_0_DDR2_SDRAM_DDR2_DQS<3> IOSTANDARD = DIFF_SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQS<4> LOC=Y28; Net fpga_0_DDR2_SDRAM_DDR2_DQS<4> IOSTANDARD = DIFF_SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQS<5> LOC=E26; Net fpga_0_DDR2_SDRAM_DDR2_DQS<5> IOSTANDARD = DIFF_SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQS<6> LOC=H28; Net fpga_0_DDR2_SDRAM_DDR2_DQS<6> IOSTANDARD = DIFF_SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQS<7> LOC=G27; Net fpga_0_DDR2_SDRAM_DDR2_DQS<7> IOSTANDARD = DIFF_SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQS_N<0> LOC=AA30; Net fpga_0_DDR2_SDRAM_DDR2_DQS_N<0> IOSTANDARD = DIFF_SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQS_N<1> LOC=AK27; Net fpga_0_DDR2_SDRAM_DDR2_DQS_N<1> IOSTANDARD = DIFF_SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQS_N<2> LOC=AJ27; Net fpga_0_DDR2_SDRAM_DDR2_DQS_N<2> IOSTANDARD = DIFF_SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQS_N<3> LOC=AA31; Net fpga_0_DDR2_SDRAM_DDR2_DQS_N<3> IOSTANDARD = DIFF_SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQS_N<4> LOC=Y29; Net fpga_0_DDR2_SDRAM_DDR2_DQS_N<4> IOSTANDARD = DIFF_SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQS_N<5> LOC=E27; Net fpga_0_DDR2_SDRAM_DDR2_DQS_N<5> IOSTANDARD = DIFF_SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQS_N<6> LOC=G28; Net fpga_0_DDR2_SDRAM_DDR2_DQS_N<6> IOSTANDARD = DIFF_SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQS_N<7> LOC=H27; Net fpga_0_DDR2_SDRAM_DDR2_DQS_N<7> IOSTANDARD = DIFF_SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<0> LOC=AF30; Net fpga_0_DDR2_SDRAM_DDR2_DQ<0> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<1> LOC=AK31; Net fpga_0_DDR2_SDRAM_DDR2_DQ<1> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<2> LOC=AF31; Net fpga_0_DDR2_SDRAM_DDR2_DQ<2> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<3> LOC=AD30; Net fpga_0_DDR2_SDRAM_DDR2_DQ<3> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<4> LOC=AJ30; Net fpga_0_DDR2_SDRAM_DDR2_DQ<4> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<5> LOC=AF29; Net fpga_0_DDR2_SDRAM_DDR2_DQ<5> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<6> LOC=AD29; Net fpga_0_DDR2_SDRAM_DDR2_DQ<6> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<7> LOC=AE29; Net fpga_0_DDR2_SDRAM_DDR2_DQ<7> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<8> LOC=AH27; Net fpga_0_DDR2_SDRAM_DDR2_DQ<8> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<9> LOC=AF28; Net fpga_0_DDR2_SDRAM_DDR2_DQ<9> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<10> LOC=AH28; Net fpga_0_DDR2_SDRAM_DDR2_DQ<10> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<11> LOC=AA28; Net fpga_0_DDR2_SDRAM_DDR2_DQ<11> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<12> LOC=AG25; Net fpga_0_DDR2_SDRAM_DDR2_DQ<12> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<13> LOC=AJ26; Net fpga_0_DDR2_SDRAM_DDR2_DQ<13> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<14> LOC=AG28; Net fpga_0_DDR2_SDRAM_DDR2_DQ<14> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<15> LOC=AB28; Net fpga_0_DDR2_SDRAM_DDR2_DQ<15> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<16> LOC=AC28; Net fpga_0_DDR2_SDRAM_DDR2_DQ<16> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<17> LOC=AB25; Net fpga_0_DDR2_SDRAM_DDR2_DQ<17> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<18> LOC=AC27; Net fpga_0_DDR2_SDRAM_DDR2_DQ<18> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<19> LOC=AA26; Net fpga_0_DDR2_SDRAM_DDR2_DQ<19> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<20> LOC=AB26; Net fpga_0_DDR2_SDRAM_DDR2_DQ<20> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<21> LOC=AA24; Net fpga_0_DDR2_SDRAM_DDR2_DQ<21> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<22> LOC=AB27; Net fpga_0_DDR2_SDRAM_DDR2_DQ<22> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<23> LOC=AA25; Net fpga_0_DDR2_SDRAM_DDR2_DQ<23> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<24> LOC=AC29; Net fpga_0_DDR2_SDRAM_DDR2_DQ<24> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<25> LOC=AB30; Net fpga_0_DDR2_SDRAM_DDR2_DQ<25> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<26> LOC=W31; Net fpga_0_DDR2_SDRAM_DDR2_DQ<26> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<27> LOC=V30; Net fpga_0_DDR2_SDRAM_DDR2_DQ<27> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<28> LOC=AC30; Net fpga_0_DDR2_SDRAM_DDR2_DQ<28> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<29> LOC=W29; Net fpga_0_DDR2_SDRAM_DDR2_DQ<29> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<30> LOC=V27; Net fpga_0_DDR2_SDRAM_DDR2_DQ<30> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<31> LOC=W27; Net fpga_0_DDR2_SDRAM_DDR2_DQ<31> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<32> LOC=V29; Net fpga_0_DDR2_SDRAM_DDR2_DQ<32> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<33> LOC=Y27; Net fpga_0_DDR2_SDRAM_DDR2_DQ<33> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<34> LOC=Y26; Net fpga_0_DDR2_SDRAM_DDR2_DQ<34> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<35> LOC=W24; Net fpga_0_DDR2_SDRAM_DDR2_DQ<35> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<36> LOC=V28; Net fpga_0_DDR2_SDRAM_DDR2_DQ<36> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<37> LOC=W25; Net fpga_0_DDR2_SDRAM_DDR2_DQ<37> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<38> LOC=W26; Net fpga_0_DDR2_SDRAM_DDR2_DQ<38> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<39> LOC=V24; Net fpga_0_DDR2_SDRAM_DDR2_DQ<39> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<40> LOC=R24; Net fpga_0_DDR2_SDRAM_DDR2_DQ<40> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<41> LOC=P25; Net fpga_0_DDR2_SDRAM_DDR2_DQ<41> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<42> LOC=N24; Net fpga_0_DDR2_SDRAM_DDR2_DQ<42> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<43> LOC=P26; Net fpga_0_DDR2_SDRAM_DDR2_DQ<43> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<44> LOC=T24; Net fpga_0_DDR2_SDRAM_DDR2_DQ<44> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<45> LOC=N25; Net fpga_0_DDR2_SDRAM_DDR2_DQ<45> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<46> LOC=P27; Net fpga_0_DDR2_SDRAM_DDR2_DQ<46> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<47> LOC=N28; Net fpga_0_DDR2_SDRAM_DDR2_DQ<47> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<48> LOC=M28; Net fpga_0_DDR2_SDRAM_DDR2_DQ<48> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<49> LOC=L28; Net fpga_0_DDR2_SDRAM_DDR2_DQ<49> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<50> LOC=F25; Net fpga_0_DDR2_SDRAM_DDR2_DQ<50> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<51> LOC=H25; Net fpga_0_DDR2_SDRAM_DDR2_DQ<51> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<52> LOC=K27; Net fpga_0_DDR2_SDRAM_DDR2_DQ<52> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<53> LOC=K28; Net fpga_0_DDR2_SDRAM_DDR2_DQ<53> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<54> LOC=H24; Net fpga_0_DDR2_SDRAM_DDR2_DQ<54> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<55> LOC=G26; Net fpga_0_DDR2_SDRAM_DDR2_DQ<55> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<56> LOC=G25; Net fpga_0_DDR2_SDRAM_DDR2_DQ<56> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<57> LOC=M26; Net fpga_0_DDR2_SDRAM_DDR2_DQ<57> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<58> LOC=J24; Net fpga_0_DDR2_SDRAM_DDR2_DQ<58> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<59> LOC=L26; Net fpga_0_DDR2_SDRAM_DDR2_DQ<59> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<60> LOC=J27; Net fpga_0_DDR2_SDRAM_DDR2_DQ<60> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<61> LOC=M25; Net fpga_0_DDR2_SDRAM_DDR2_DQ<61> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<62> LOC=L25; Net fpga_0_DDR2_SDRAM_DDR2_DQ<62> IOSTANDARD = SSTL18_II; Net fpga_0_DDR2_SDRAM_DDR2_DQ<63> LOC=L24; Net fpga_0_DDR2_SDRAM_DDR2_DQ<63> IOSTANDARD = SSTL18_II;
die pin connection ist mir ja schon klar, es geht mehr um die Clocks, mit wo ich die sys_clk_p und _n verbinde beispielsweise danke aber trotzdem für die Antwort Cihan
Net sys_clk_pin TNM_NET = sys_clk_pin; Net sys_clk_pin LOC = AH15; Net sys_clk_pin IOSTANDARD=LVCMOS33; #Net sys_rst_pin LOC = E9; #Net sys_rst_pin IOSTANDARD=LVCMOS33; #Net sys_rst_pin PULLUP; ## System level constraints Net sys_clk_pin TNM_NET = sys_clk_pin; TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 10000 ps; #Net sys_rst_pin TIG; ich hatte damals im projekt nur das zur system clk hat wunderbar funktioniert
Hast du mit Platform Studio den DDR 2 in Betrieb genommen? Cihan
Ich habe mit XPS das design gemacht und die ucf aber damals auch per hand angepasst hatte da auch probleme. allerdings ist das schon länger her den genauen arbeitsweg weiss ich nicht mehr
Mit XPS habe ich den DDR2 auch schon in Betrieb genommen. Nun will ich es in VHDL machen und versuche gerade die Testbench des example_designs in Betrieb zu nehmen. Nun habe ich folgendes gemacht: die sys_clk_p und _n habe ich rausgenommen und habe mir selbst über eine DCM 133 MHz kreiert, die ich anstelle der sys_clk_p und _n einsetze. Zwischenergebnis: Init funkioniert. Habe die Signale "app_wdf_wren" und "app_af_wren" auf dem Osilloskopen bertrachtet, doch leider kann ich die Signalverlaufen nicht nachvollziehen. Irgendwie passt es nicht zu den Timing-Verhalten wie im UG086 angegeben. Die Testbench ist doch eigentlich genau so entwickelt, wie im UG086 angegeben? Oder sollte ich mir eine eigene Testbench schreiben, dessen Timing-Verhalten den Verhalten aus UG086 entspricht? Bräuchte nochmal Ansätze und Hilfe. Dankend und mfg Cihan
Hallo nochmal, brauche unbedingt eure Hilfe bei der Inbetriebnahme des DDR2 Ram mit dem Vitex 5. Ich habe mir nach dem ich das Design mit dem MIG-Tool kreiert habe, die example_design näher unter die Lupe genommen. Habe es auch geschafft auf meinem Board zu laden. Die Init funktioniert auch. Nun habe ich die Signale "app_wdf_wren" und "app_af_wren" angeguckt, die ja eigentlich von dem Timingverhalten genauso wie die der im UG086 vorgegeben Timings sein müssten (siehe UG086 für Write s.384 und für Read s.386). Warum stimmen diese nicht überein? Zum anderen wenn ich meine eigenen write und read-Sections entwickele, müsste ich doch genau so wie die Timingverhalten des UG086 (für Write s.384 und für Read s.386) programmieren?!? Kann mir da jemand bitte auf die Sprünge helfen, versuche schon seit mehr als einer Woche den DDR2 in Betrieb zu nehmen. Würde mich auf jede Hilfe sehr freuen. Danke Cihan UG086: http://www.xilinx.com/support/documentation/ip_documentation/ug086.pdf
Cihan Kalayci schrieb: > versuche schon seit > mehr als einer Woche den DDR2 in Betrieb zu nehmen. Da stehst Du ja erst am Anfang. Ich habe drei Monate für ein DDR-Speichercontroller gebraucht... Duke
ja das ist mir klar, deswegen bin ich ja auch 5 Tage die Woche an der Sache dran. Und zu meinem Fragen kein Kommentar :-S Cihan
Cihan Kalayci schrieb: > ja das ist mir klar, deswegen bin ich ja auch 5 Tage die Woche an der > Sache dran. > > Und zu meinem Fragen kein Kommentar :-S > > Cihan Hallo Cihan, ist auch etwas viel verlangt, für ein kommerziell abgewickeltes Projekt kostenlosen und zeitnahen Support zu erwarten? Gibt ja auch Leute die verdienen mit genau jenem Support ihr Geld ;) Wie dem auch sei, Du schreibst Du versuchst den MIG (DDR2) in Betrieb zu nehmen. Wie groß ist denn dein Wissen im Bezug auf den MIG und DDR(2) im Speziellen? Hast Du Dir mal angeschaut, wie das Interface zum MIG hin aufgebaut ist? MIG: -> Das sind mehrere Queues welche über seperate FIFOs implementiert sind. Eine Queue für Kommandos (Lesen/Schreiben und Adresse). Und eine weitere für (Schreibdaten) DDR2: -> Ein DDR2 Memory kann nur Bursts verarbeiten. Sprich mit jedem Schreibkommando sind 4 Daten zu liefern, (welche vom MIG auf auf Forder- und Rückflanke ins RAM geschrieben werden). Zusätzlich gibt es MASK Bits mit welchen qualifiziert werden kann ob das übergebene Datum den DDR-Raminhalt überschreiben soll. Und nun Schritt 1 für Dich: Versuche die Waveform die Du vor Dir hast auf Plausibilität zu prüfen. Wenn Du hier nicht weiterkommst, dann extrahiere Die Unterschiede und gebe Sie hier zum besten. Nicht jeder hat A) die UG86 (in der von Dir benutzten Fassung) vor sich liegen und hat B) Lust sich hier beliebig Zeit zu nehmen um es Dir bequem zu machen. Versuche deine Fragen so konkret wie möglich zu stellen. Dies hilft den Lesern DEINEN Fehler nachzuvollziehen und hilft anderen welche auch auf die gleichen Probleme stossen, über die Forensuche zu finden. Viele (Fach-)leute in diesem Forum nehmen sich gerne (etwas) Zeit um die Kandidaten über die ersten Hürden zu hiefen. Aber nachdem auch diese nach Ihrer Leistung bezahlt werden und außerhalb der Arbeit nur selten die betreffenden Dokumente und Software greifbar sind, ist es ein Gebot der Fairnis das Problem so gut als möglich aufzuschlüsseln. Gruß Vanilla
Hallo Vanilla, eigentlich habe ich meine Frage schon konkret und öfters immer wieder gestellt, doch die Antwort dazu hat leider immer gefehlt. Ich bin mir schon bewusst, dass nicht jeder immer Zeit für solche Angelegenheiten hat, dafür habe ich auch Verständnis. Nochmal in Klartext und Kurzfassung: Meine Frage beläuft sich eigentlich nur darauf, ob die vom MIG erstellte example_design (mit Testbench) den Timingverhalten des UG086 für Write (Bild s.384) und Read (Bild s.386) entsprechen muss, denn dass was ich messe ist nicht richtig bzw. unterschiedlich zur doku (UG086). Ist das jetzt so oder liege ich falsch. Und für die jenigen, die es interressiert wie ich die Messung durchführe, ich habe im Prinzip nur die WREN Signale auf I/O´s rausgeführt und auf dem Oszilloskopen dargestellt. Dabei ebend festgestellt, dass die Signale nicht der Doku entsprechen. Auf Wunsch kann ich auch das Projekt mal zur Verfügung stellen. Es ist für das Board ML507 mit dem Virtex 5 FPGA. Gruß Cihan
Cihan Kalayci schrieb: > example_design (mit Testbench) den Timingverhalten des UG086 für Write > > (Bild s.384) und Read (Bild s.386) entsprechen muss, denn dass was ich > messe ist nicht richtig bzw. unterschiedlich zur doku (UG086). In der nun mittlerweile gut 10 Jahre alten Geschichte des MIG (und des damit einhergehenden Userguides gab es schon mehr als einen Druckfehler. Ich habe mir jetzt die UG086 in V3.6 auf den von Dir benannten Seiten angesehen und konnte auf den ersten Blick keine Fehler erkennen. Hilft Dir das nun weiter? Wenn Du dich bequemst dein Messergebis zu graphieren und einzustellen, schaue ich mir (und andere auch) das an. Gruß Vanilla
Danke erstmal für die Antworten. Werde denke ich mal morgen im Laufe des Tages sowohl Projekt als auch Bilder hochladen und versuchen meine Situation besser zu schildern. Gruß Cihan
> Ein DDR2 Memory kann nur Bursts verarbeiten. > Sprich mit jedem Schreibkommando sind 4 Daten zu liefern, > (welche vom MIG auf auf Forder- > und Rückflanke ins RAM geschrieben werden). > Zusätzlich gibt es MASK Bits > mit welchen qualifiziert werden kann ob das übergebene > Datum den DDR-Raminhalt überschreiben soll. Wie und mit welcher Geschwindikeit liefert man die 4 Daten? Mehrfach parallel mit dem vollen Takt oder nur alle 4 Daten ein Schreibkommando. Hättest Du einen guten link zu einem Dokument, wo die Funktionen des DDR-Speichers mal ganz genau beschrieben sind? Habe ein ähnliches Thema: Beitrag "DDR2 Design mit Eagle?"
Berndt Eggebrecht schrieb: >> Ein DDR2 Memory kann nur Bursts verarbeiten. > Wie und mit welcher Geschwindikeit liefert man die 4 Daten? Mehrfach > parallel mit dem vollen Takt oder nur alle 4 Daten ein Schreibkommando. > > > Habe ein ähnliches Thema: > Beitrag "DDR2 Design mit Eagle?" >Hier geht es speziell um den MIG Memory Controller (oder ggfls. auch den MPMC Memoryblock im Spartan6), sprich die Daten werden an den IP-Core übergeben und dieser stellt das Timing zum RAM Baustein sicher: Beim MIG muß sichergestellt werden dass der Controller nach Absetzten des Schreibcommandos ausreichend Daten seinem Datenfifo hat. Der MIG ist Userseitig so aufgebaut dass die Daten mit einfachem Clock geliefert werden, deshalb ist der Datenpfad auch doppelt so breit wie der Anschluß am RAM. Der MIG wiederum liefert die Daten zu jeder steigenden und fallenden Clockflanke (den Clock gibt der MIG selbst aus, wird um 90° geschoben, damit ausreichend Setup und Hold vorhanden ist...) ans RAM. > Hättest Du einen guten link zu einem Dokument, wo die Funktionen des > DDR-Speichers mal ganz genau beschrieben sind? Die Dokumente in denen die Funktionen GANZ genau beschrieben sind kommen von der JEDEC(.org) welche als Standardisierungs Konmmitee der DDR-SDRAM Technology fungiert. Dort sollte also alles zu finden sein, was DDR-Speicher betrifft. Meines Wissens nach ist auschliesslich eine kostenlose Registrierung notwendig. Alternativ kannst Du Dir auch ein Datenblatt eines beliebigen DDR2-Speichers (Tip: Micron) laden. Dort werden alle relevanten Timings, sowie des Configurationregisters und die Zusammenhänge zwischen RAS, CAS und Bänken ausreichend erklärt. Am besten nimmt man sich ein-, zwei Stunden mehr Zeit und schaut sich zuerst die DDR1 Technik an. Der technologische Unterschied zu DDR2 ist dann folgender: Für die Geschwindigkeitssteigerung zwischen DDR1 und DDR2 hat man einen Trick angewandt: Die internen Strukturen (Busbreite) wurden verbreitert(verdoppelt) und kann intern nun mit halben Takt (gegenüber DDR1) arbeiten. Hierfür mussten die Features der Single Access, bzw. Burst Interruption rausgekippt werden da sonst das eingesetzte Pipelining nicht funktionieren würde und voila wir sind bei DDR2 angekommen. Gruß Vanilla
Vanilla schrieb: > Der technologische Unterschied zu DDR2 ist dann folgender: > Für die Geschwindigkeitssteigerung zwischen DDR1 und DDR2 hat man einen > Trick angewandt: Das bedeutet für mich bei DDR3, dass alles nochmal halbiert ist und man intern mit dem 4-tel des Taktes arbeitet. Bekomme ich dann in derselben Zeit die gleiche Menge an Daten (bei derselben Taktrate) oder die doppelte? So wie ich das jetzt verstehe, ist der Übergang von DDR1 nach 2 und dann nach 3 einfach nur eine interne "Entspannung" der Timingreserven, sodass dieselbe Technologie mit etwas höheren Raten gefahren werden kann.
Berndt Eggebrecht schrieb: > Das bedeutet für mich bei DDR3, dass alles nochmal halbiert ist und man > intern mit dem 4-tel des Taktes arbeitet. Bekomme ich dann in derselben > Zeit die gleiche Menge an Daten (bei derselben Taktrate) oder die > > doppelte? In der gleichen Zeit, bei gleichem Takt erhällst Du effektiv weniger Daten. Der Grund ist die gestiegene RAS/CAS Latenz. Das war vor allem anfänglich ein Problem (für die PC-Industrie) beim Umstieg von DDR1 nach DDR2. DDR2 Rams (und Chipsätze) mit höheren Takt waren anfängllich noch nicht verfügbar, so dass DDR1 PCs solche mit DDR2 Rams überholten (oder soll man besser sagen vorbeischlichen)... Ziel des Umstieges war aber die weitere Erhöhung der Taktrate, so dass die CAS/RAS Zeit (absolut) in ähnlichen Bereichen wie bei DDR1/DDR2 liegt. Durch die beschleunigung der Datenphasen erhällst Du die von DDR2/DDR3 versprochenen Performanceboos... > > So wie ich das jetzt verstehe, ist der Übergang von DDR1 nach 2 und dann > nach 3 einfach nur eine interne "Entspannung" der Timingreserven, sodass > dieselbe Technologie mit etwas höheren Raten gefahren werden kann. Jein. Hauptsächlich wird Geschwindigkeit durch die Parallelisierung (Verbreiterung der internen Busstrukturen) geschlagen. Dass Du ein wenig Margin erhällst wenn Du Setup/Hold Zeiten Einsparen kannst ist zwar richtig. Würde aber nur Performance Zuwächse im ein- bis leicht zweistelligen Prozentbereich ermöglichen...
Vanilla schrieb: > erhällst Man erhäl.t. zunächst dieselbe Datenrate. Es ergibt sich aber eine Reserve/ein Potenzial, die Rate zu erhöhen.
hans schrieb: > Net fpga_0_DDR2_SDRAM_DDR2_DQ<58> IOSTANDARD = SSTL18_II; Ich glaube, da muss noch eine Definition rein, wie sich die Ausgänge differentiel verhalten sollen. Bei mir in den designs steht da was von "untuned_50" oder so.
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.