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
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
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.
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....
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. ;-)
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...
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
Danke Duke für den Tipp, dann werde ich das mal versuchen.
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.