Hallo liebe Forumsmitglieder!
Ich habe viel nach meinem Problem gesucht, aber weder im Forum noch
außerhalb die richtigen Hinweise gefunden. Deshalb mache ich einfach mal
ein neuen Post.
Grundlegende Infos:
Ich arbeite mit einem Spartan 6 FPGA (xc6slx45-3csg324), das FPGA sitzt
auf dem Atlys Board von Digilent. Ich möchte den DDR2-Speicher auf dem
Board verwenden.
Das aktuelle Projekt soll bei Taster 1 einen Wert an eine bestimmte
Speicherstelle schreiben und bei Taster 2 von der gleichen Adresse
lesen. Soweit die Theorie.
Ich habe mir den Core Generator genommen und ein DDR2-Memory-Interface
vom Memory Interface Generator erstellen lassen.
Dazu habe ich dann ein nettes Top-Modul gebastelt, in dem ich das
generierte Modul (Memory Interface) als "component" einbinde.
Nun möchte dieses Memory Interface Modul 400MHz als Arbeitstakt
(c3_sys_clk). Also habe ich mir wieder den Core Generator genommen und
mir ein Modul erzeugen lassen, welches mir die gewünschten Taktsignale
(100 MHz und 400 MHz) gibt.
Zum besseren Schreiben: Das Memory Interface Modul nenne ich
"mig_39.vhd" und das Modul für die Taktsignale nenne ich
"clk_wiz_v3_3.vhd".
Das Modul clk_wiz_v3_3 besitzt 3 Ausgänge:
- clkWizOUT_100
- clkWizOUT_400
- clkWizLOCKED
Der Ausgang clkWiz_400 geht auf ein internes Signal namens
"clkintern400". Dieses Signal wird an den Eingang "c3_sys_clk" des
Memory Interface Moduls "mig_39" angeschlossen.
Synthetisiert wird das ganze mit einigen Warnungen. Die meisten der
Warnungen beziehen sich auf das vom Core Generator erstellte Modul
"mig_39.vhd".
Bei der Implementierung, genauer beim Übersetzen (Translate) tritt
folgender Fehler auf:
1 | ERROR:NgdBuild:770 - IBUFG
|
2 | 'mig_39_inst/memc3_infrastructure_inst/se_input_clk.u_ibufg_sys_clk' and BUFG
|
3 | 'clknetwork/clkout2_buf' on net 'internclk400' are lined up in series.
|
4 | Buffers of the same direction cannot be placed in series.
|
5 | ERROR:NgdBuild:924 - input pad net 'internclk400' is driving non-buffer
|
6 | primitives:
|
7 | pin O on block clknetwork/clkout2_buf with type BUFG
|
Ich verstehe die Fehlermeldung 770 so, dass das Modul clk_wiz_v3_3 einen
Buffer am Ausgang clkWizOUT_400 besitzt und das Modul mig_39 einen
Buffer am Eingang c3_sys_clk hat. Diese beiden Buffer können nicht in
Reihe geschaltet werden. Richtig? Oder ist die Meldung anders zu
interpretieren?
*Hat jemand eine Idee, wie man das Problem lösen kann?*
----
Mein erster vergeblicher Lösungsansatz war folgendes...
Xilinx hat zu diesem Problem die folgende Information:
http://www.xilinx.com/support/answers/34771.htm
Bei mir trifft 2. zu, da ich nicht direkt auf einen Top-Level-Port gehe.
>2. Selectively disable IBUF/OBUF insertion on the input/output ports
>that are NOT connected to the top module ports directly.
>
> For XST, use "buffer_type" constraint. Please refer to XST User Guide.
Diesen "Workaround" habe ich probiert, aber entweder ist es nicht das
Richtige oder ich habe es falsch gemacht.
Aus dem XST User Guide habe ich rausgelesen, dass ich per Constraint
angeben kann, welcher Buffer verwendet werden soll. Folgender Befehl
macht das:
1 | attribute buffer_type of signal_name : signal is " {bufgdll | ibufg | bufgp | ibuf | bufr | none}";
|
Um keinen Buffer BUFG zu erhalten, habe ich die Zeile in der User
Constraint modifiziert zu:
1 | attribute buffer_type of internclk400 : signal is "none";
|
Keine Veränderung, der Fehler 770 bleibt bestehen.
*Hat jemand das gleiche Problem (770, Buffer in Reihe) schon einmal
gehabt?*
Ich bin langsam am Verzweifeln, ich bin für jeden Tipp dankbar!
Auch Hinweise zu BUFG, IBUFG etc. nehme ich gerne an, genau so wie Links
auf denen verständlich erklärt worum es sich dabei handelt und wie sie
verwendet werden. Xilinx Datenblätter habe ich zwar gelesen, aber
verständlich ist etwas anderes.
Vielen Dank!
Grüße
-Walter White