Forum: FPGA, VHDL & Co. Translate ERROR:NgdBuild:770; BUFG / IBUFG in series;


von Walter W. (pridy)


Lesenswert?

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

: Verschoben durch Admin
von Duke Scarring (Gast)


Lesenswert?

You are writing in the englisch section of the forum.
You can remove the mig generated clock buffer. Just edit the file 
mig_39/memc3_infrastucture.vhd and comment out the following lines:
1
  diff_input_clk : if(C_INPUT_CLK_TYPE = "DIFFERENTIAL") generate
2
    --***************************************************************
3
    -- Differential input clock input buffers
4
    --***************************************************************
5
      u_ibufg_sys_clk : IBUFGDS
6
        generic map (
7
          DIFF_TERM => TRUE
8
        )
9
        port map (
10
          I  => sys_clk_p,
11
          IB => sys_clk_n,
12
          O  => sys_clk_ibufg
13
          );
14
  end generate;
15
  
16
  
17
  se_input_clk : if(C_INPUT_CLK_TYPE = "SINGLE_ENDED") generate
18
   --***************************************************************
19
   -- SINGLE_ENDED input clock input buffers
20
   --***************************************************************
21
      u_ibufg_sys_clk : IBUFG
22
        port map (
23
          I  => sys_clk,
24
          O  => sys_clk_ibufg
25
          );
26
  end generate;
Just add the folling line instead:
1
  sys_clk_ibufg <= sys_clk;
In the Spartan6 there is not routing lines between two IBUFG, hence the 
error. And the MIG is so stupid not to allow an internal clock as 
source.

Duke

von Walter W. (Gast)


Lesenswert?

Hey there!

Oh, I didn't realize that I am in the english section, I guess I got 
kinda redirected. Is it possible to move the thread in the german 
section?

Anyway, thanks for your help!
Your suggestion helped, it works now. It is possible to synthesize and 
thanks to you it's possible to translate, map, place and route the whole 
project!

You just saved my life :) I owe you big time!

Greetings from Berlin,
Walter White

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.