Forum: FPGA, VHDL & Co. Spartan 3e lvds für TFT XAPP486 Fehler


von Jürgen D. (Firma: Student) (freacky2002)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe vor einiger Zeit angefangen einen LVDS Transmitter für ein 
10.1" TFT zu bauen. Da ich bisher nur kleinere FPGA Projekte geschrieben 
habe, habe ich mich hauptsächlich auf die Application Note von Xilinx 
(XAPP486) gehalten. Hier wird einen FPD-Link mittels LVDS für TFTs 
implementiert. Ich habe diesen dann versucht zu erweitern, aber es hackt 
schon wenn ich meinen, aus dem CDM erzeugten, Pixeltakt weitergeben 
möchte. Im RTL Schema erkennt man das zwei DCMs hintereinander 
geschalten sind und hier scheint auch der Hund für mein Problem begraben 
zu sein, den ich bekomme folgenden Fehler:

ERROR:NgdBuild:770 - IBUFG 'Inst_top4_tx/clk_ibuf' and BUFG 
'pxclock_BUFG' on
   net 'pxclock1' are lined up in series. Buffers of the same direction 
cannot
   be placed in series.

Ich verstehe den Fehler nicht ganz, denn ich habe keinen Buffer 
'pxclock_BUFG' angelegt, geschweige denn das dieser im RTL Schema 
vorkommt.

Hat da jemand von euch eine Idee?

Wäre toll wenn mir jemand eine Tipp geben könnte, habe meine bisherigen 
Daten angehängt!

Vielen Dank schon mal im Voraus.
Jürgen

von Duke Scarring (Gast)


Lesenswert?

Jürgen Dürrwang schrieb:
> Ich verstehe den Fehler nicht ganz, denn ich habe keinen Buffer
> 'pxclock_BUFG' angelegt, geschweige denn das dieser im RTL Schema
> vorkommt.
Hast Du die DCMs mit dem Clock Wizard erstellt?

Duke

von John-eric K. (mockup)


Lesenswert?

Hallo Jürgen.

Wir hatten ja schon per E-Mail geschrieben nehme ich gerade an.

Die Buffer werden meist in der DCM aktiviert. Das kann dort auch 
abgeschaltet werden meiner Meinung nach.

Wenn du 2 DCMs verwendest um den negierten Takt zu erzeugen,
dann ist das nicht notwendig. Eine DCM kann dir den normalen und den um 
180 Grad verschobenen Takt generieren.

von Jürgen D. (Firma: Student) (freacky2002)


Lesenswert?

Hallo John,

richtig wir hatten per E-Mail geschrieben. Also den zweiten DCM benutze 
ich um den Takt (70MHz) für das TFT zu erzeugen, der geht ja dann in den 
anderen DCM und wird mit 3,5 multipliziert und anschließend im DDR 
verdoppelt um den Gesamtfaktor von 7 für den Serialisierer zu bekommen.

In der XAPP486 ist ja der DCM für den Faktor 3,5 und das DDR schon 
implementiert. Ich habe dann meinen DCM, für die 70 MHz davor 
geschalten. Ich bekomme dann aber diesen Bufferfehler. Ich habe meinen 
DCM mit dem Clock Wizard erstellt und bei CLKFX den Buffer auf Local 
Routing gestellt, sodass er da keinen erzeugen sollte. Ich bekomme dann 
aber trotzdem:

ERROR:NgdBuild:770 - IBUFG 'Inst_top4_tx/clk_ibuf' and BUFG 
'pxclock_BUFG' on
   net 'pxclock1' are lined up in series. Buffers of the same direction 
cannot
   be placed in series.

Im RTL Schema ist da nichts von einem BUFG 'pxclock_BUFG' zu 
erkennen....

von John-eric K. (mockup)


Lesenswert?

Ich habe mal gegoogelt und bin auf folgendes gestoßen:
http://forums.xilinx.com/t5/Archived-ISE-issues/Error-message-Buffers-of-the-same-direction-cannot-be-placed-in/td-p/9731

>It's mostly likely that when you generated the DCMs, you selected "External"
>for "CLKIN Source" and the tool then inserted the global clock input buffer
>(IBUFG) in the generated DCM code for the both DCMs. The error message
>basically tells you that a single input can't drive two IBUFGs. You should
>go back to CoreGen and regenerate the DCM files with "Internal" for "CLKIN"
>Source.

;-)

von Jürgen D. (Firma: Student) (freacky2002)


Lesenswert?

Den Eintrag habe ich schon gelesen und auf Internal umgestellt. Wenn ich 
dann Translate mache, bekomme ich:

ERROR:NgdBuild:770 - IBUFG 'Inst_top4_tx/clk_ibuf' and BUFG 
'pxclock_BUFG' on
   net 'pxclock1' are lined up in series. Buffers of the same direction 
cannot
   be placed in series.

:-) Irgendwie steckt da der Teufel drin...

von Duke Scarring (Gast)


Lesenswert?

Ich instanziiere die DCMs per Hand. Da weiß ich, was für Buffer drin 
sind.
Die Teilerfaktoren etc. kann man sich ja vom Clocking-Wizard ausrechnen 
lassen. Wenn man das drei Mal gemacht hat, kommt man auch ohne aus.

Duke

von Jürgen D. (Firma: Student) (freacky2002)


Lesenswert?

Danke Duke für den Tipp, dann werde ich das mal versuchen.

von Jürgen D. (Firma: Student) (freacky2002)


Lesenswert?

SO ich habe jetzt den DCM mit Hand gemacht, der sieht jetzt 
folgendermaßen aus:
1
library ieee;
2
use ieee.std_logic_1164.ALL;
3
use ieee.numeric_std.ALL;
4
library UNISIM;
5
use UNISIM.Vcomponents.ALL;
6
7
8
entity pixel_clk2 is
9
   port ( CLKIN_IN        : in    std_logic; 
10
          RST_IN          : in    std_logic; 
11
          CLKFX_OUT       : out   std_logic; 
12
          CLK0_OUT        : out   std_logic; 
13
          LOCKED_OUT      : out   std_logic);
14
end pixel_clk2;
15
16
architecture BEHAVIORAL of pixel_clk2 is
17
   signal CLKFB_IN        : std_logic;
18
   signal CLKIN_IBUFG     : std_logic;
19
   signal GND_BIT         : std_logic;
20
  signal CLKFX_BUF      : std_logic;
21
begin
22
   GND_BIT <= '0';
23
   CLK0_OUT <= CLKFB_IN;
24
  CLKFX_OUT <= CLKFX_BUF;
25
   
26
   CLKIN_IBUFG_INST : IBUFG
27
      port map (I=>CLKIN_IN,
28
                O=>CLKIN_IBUFG);
29
   DCM_SP_inst : DCM_SP
30
   generic map (
31
      CLKDV_DIVIDE => 2.0, --  Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5
32
                           --     7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0
33
      CLKFX_DIVIDE => 5,   --  Can be any interger from 1 to 32
34
      CLKFX_MULTIPLY => 7, --  Can be any integer from 1 to 32
35
      CLKIN_DIVIDE_BY_2 => FALSE, --  TRUE/FALSE to enable CLKIN divide by two feature
36
      CLKIN_PERIOD => 20.000, --  Specify period of input clock
37
      CLKOUT_PHASE_SHIFT => "NONE", --  Specify phase shift of "NONE", "FIXED" or "VARIABLE" 
38
      CLK_FEEDBACK => "1X",         --  Specify clock feedback of "NONE", "1X" or "2X" 
39
      DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", -- "SOURCE_SYNCHRONOUS", "SYSTEM_SYNCHRONOUS" or
40
                                             --     an integer from 0 to 15
41
      DLL_FREQUENCY_MODE => "LOW",     -- "HIGH" or "LOW" frequency mode for DLL
42
      DUTY_CYCLE_CORRECTION => TRUE, --  Duty cycle correction, TRUE or FALSE
43
      PHASE_SHIFT => 0,        --  Amount of fixed phase shift from -255 to 255
44
      STARTUP_WAIT => TRUE) --  Delay configuration DONE until DCM_SP LOCK, TRUE/FALSE
45
   port map (
46
      CLK0 => open,     -- 0 degree DCM CLK ouptput
47
      CLK180 => open, -- 180 degree DCM CLK output
48
      CLK270 => open, -- 270 degree DCM CLK output
49
      CLK2X => open,   -- 2X DCM CLK output
50
      CLK2X180 => open, -- 2X, 180 degree DCM CLK out
51
      CLK90 => open,   -- 90 degree DCM CLK output
52
      CLKDV => open,   -- Divided DCM CLK out (CLKDV_DIVIDE)
53
      CLKFX => CLKFX_BUF,   -- DCM CLK synthesis out (M/D)
54
      CLKFX180 => open, -- 180 degree CLK synthesis out
55
      LOCKED => LOCKED_OUT, -- DCM LOCK status output
56
      PSDONE => open, -- Dynamic phase adjust done output
57
      STATUS => open, -- 8-bit DCM status bits output
58
      CLKFB => GND_BIT,   -- DCM clock feedback
59
      CLKIN => CLKIN_IBUFG,   -- Clock input (from IBUFG, BUFG or DCM)
60
      PSCLK => GND_BIT,   -- Dynamic phase adjust clock input
61
      PSEN => GND_BIT,     -- Dynamic phase adjust enable input
62
      PSINCDEC => GND_BIT, -- Dynamic phase adjust increment/decrement
63
      RST => RST_IN        -- DCM asynchronous reset input
64
   );
65
66
   -- End of DCM_SP_inst instantiation
67
68
69
        
70
end Behavioral;

Leider habe ich immer noch den  Bufferfehler:

ERROR:NgdBuild:770 - IBUFG 'Inst_top4_tx/clk_ibuf' and BUFG 
'pxclock_BUFG' on
   net 'pxclock1' are lined up in series. Buffers of the same direction 
cannot
   be placed in series.

von John-eric K. (mockup)


Angehängte Dateien:

Lesenswert?

Hallo Jürgen,

das ist mein Projekt von damals.
Ich hatte eine DCM verwendet.

Es ist alles in VHDL geschrieben.

Die Monitoransteuerung kann leicht für die ersten Tests an ein anderes 
Display angepasst werden.

Viel Spaß damit.

von Duke Scarring (Gast)


Lesenswert?

Jürgen Dürrwang schrieb:
Alles, was man nicht braucht, schmeiße ich der Übersichtlichkeit halber 
raus:
1
    DCM_SP_inst : DCM_SP
2
    generic map (
3
       CLKDV_DIVIDE      => 2.0, 
4
       CLKFX_DIVIDE      => 5,
5
       CLKFX_MULTIPLY    => 7,
6
       CLKIN_DIVIDE_BY_2 => FALSE,
7
       CLKIN_PERIOD      => 20.000,
8
       CLK_FEEDBACK      => "1X",
9
       DESKEW_ADJUST     => "SYSTEM_SYNCHRONOUS",
10
       STARTUP_WAIT      => TRUE
11
    )
12
    port map (
13
       CLK0     => open,
14
       CLKFX    => CLKFX_BUF,  -- DCM CLK synthesis out (M/D)
15
       LOCKED   => LOCKED_OUT, -- DCM LOCK status output
16
       CLKFB    => '0',        -- DCM clock feedback
17
       CLKIN    => CLKIN_IBUFG,
18
       PSCLK    => '0',  
19
       PSEN     => '0',  
20
       PSINCDEC => '0', 
21
       RST      => RST_IN      -- DCM asynchronous reset input
22
    );

Du hast bei CLK_FEEDBACK "1X" angegeben. Daher mußt Du moch eine Leitung 
von CLK0 zu CLKFB ziehen.

Jürgen Dürrwang schrieb:
> ERROR:NgdBuild:770 - IBUFG 'Inst_top4_tx/clk_ibuf' and BUFG
> 'pxclock_BUFG'
Das passt nicht zu Deinem Code. Dort heißt es
1
   CLKIN_IBUFG_INST : IBUFG
und
1
   DCM_SP_inst : DCM_SP

Bist Du sicher, das Deine neue Datei richtig im Projekt eingebunden ist?
Ggf. auch mal ein "Cleanup Project" durchführen.

Duke

von Jürgen D. (Firma: Student) (freacky2002)


Lesenswert?

Erst mal danke für eure Hilfe!

John-eric: Ich danke dir vielmals für deine Implementierung, ich werde 
mich gleich mal daran machen und versuchen einen Testbench zum Laufen zu 
bekommen.

Duke: Also ich habe den DCM genauso wie du ihn gepostet hast. Um weitere 
Fehler aus zuschließen habe ich einfach eines ISE Projekt erstellt und 
nur die VHDL Daten reinkopiert, aber das bringt diesen Bufferfehler. 
Habe dann in allen Dateien nach diesem ominösen Buffer gesucht aber 
nichts zu finden. Der wird wohl durch ISE erzeugt, obwohl ich das 
eigentlich abgestellt hatte...

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.