Forum: FPGA, VHDL & Co. Problem mit DCM beim Placen


von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Hallo,

habe ein Problem beim Placen eines DCM:

"Component <DCM_inst> of type DCM is not placeable because it has locked 
loads placed in regions: CLOCKREGION_X0Y7."

und weiter

"There is a restriction that the clock loads of a DCM must be in a 
horizontally adjacent clock region to the DCM. It is recommended that a 
BUFG be used for this clock signal so that the clock loads can be placed 
anywhere on the device. If the clock driver or clock loads are locked or 
area grouped, please ensure that they are constrained to horizontally 
adjacent clock regions."

Nur blöderweise habe ich keine Ahnung wie ich das beheben soll, sowohl 
mit aktivierten Buffern vom DCM (CLKIN_BUF, CLK0_BUF, CLKDV_BUF) als 
auch mit manuell vorgeschalteten (BUFG) bekomme ich ihn nicht weg.

Achja, Device ist ein Spartan6 (XC6SLX45).

Minimal Beispiel:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
entity TOP is
5
 Port (
6
  CLK         : in  STD_LOGIC;
7
    
8
  TMDSp_clock : out STD_LOGIC;
9
  TMDSn_clock : out STD_LOGIC
10
 );
11
end TOP;
12
13
architecture Behavioral of TOP is
14
  
15
 signal RST    : STD_LOGIC;
16
 signal CLK25  : STD_LOGIC;
17
 signal CLK100 : STD_LOGIC;
18
19
 component OBUFDS
20
  generic (
21
   IOSTANDARD : string := "LVDS_25"
22
  );
23
  port (
24
   I  : in  STD_LOGIC;
25
   O  : out STD_LOGIC;
26
   OB : out STD_LOGIC
27
  );
28
 end component;
29
  
30
 component DCM
31
  generic (
32
   DFS_FREQUENCY_MODE : string := "LOW";
33
   DLL_FREQUENCY_MODE : string := "LOW";
34
   DUTY_CYCLE_CORRECTION : boolean := TRUE;
35
   CLKIN_DIVIDE_BY_2 : boolean := FALSE;
36
   CLK_FEEDBACK : string := "1X";
37
   CLKOUT_PHASE_SHIFT : string := "NONE";
38
   DSS_MODE : string := "NONE";
39
   STARTUP_WAIT : boolean := FALSE;
40
   PHASE_SHIFT : integer := 0;
41
   CLKFX_MULTIPLY : integer := 4;
42
   CLKFX_DIVIDE : integer := 1;
43
   CLKDV_DIVIDE : real := 2.0;
44
   CLKIN_PERIOD : real := 41.66666;
45
   DESKEW_ADJUST : string := "SYSTEM_SYNCHRONOUS";
46
   CLKIN_BUF : boolean := FALSE;
47
   CLKFB_BUF : boolean := FALSE;
48
   CLK0_BUF : boolean := FALSE;
49
   CLK90_BUF : boolean := FALSE;
50
   CLK180_BUF : boolean := FALSE;
51
   CLK270_BUF : boolean := FALSE;
52
   CLKDV_BUF : boolean := FALSE;
53
   CLK2X_BUF : boolean := FALSE;
54
   CLK2X180_BUF : boolean := FALSE;
55
   CLKFX_BUF : boolean := FALSE;
56
   CLKFX180_BUF : boolean := FALSE;
57
   EXT_RESET_HIGH : integer := 1
58
  );
59
  port ( 
60
   CLKIN     : in  std_logic;
61
   CLKFB     : in  std_logic;
62
   DSSEN     : in  std_logic;
63
   PSINCDEC  : in  std_logic;
64
   PSEN      : in  std_logic;
65
   PSCLK     : in  std_logic;
66
   RST       : in  std_logic;
67
   CLK0      : out std_logic;
68
   CLK90     : out std_logic;
69
   CLK180    : out std_logic;
70
   CLK270    : out std_logic;
71
   CLK2X     : out std_logic;
72
   CLK2X180  : out std_logic;
73
   CLKDV     : out std_logic;
74
   CLKFX     : out std_logic;
75
   CLKFX180  : out std_logic;
76
   LOCKED    : out std_logic;
77
   PSDONE    : out std_logic;
78
   STATUS    : out std_logic_vector(7 downto 0)
79
  );
80
 end component;
81
82
begin
83
84
 DCM_inst : DCM
85
  generic map (
86
   CLKDV_DIVIDE => 4.0,
87
   CLKIN_PERIOD => 10.0,
88
   CLKIN_BUF => TRUE,
89
   CLK0_BUF => TRUE,
90
   CLKDV_BUF => TRUE
91
  )
92
  port map (
93
   CLKIN => CLK,     -- Clock input (from IBUFG, BUFG or DCM)
94
   CLKFB => CLK100,  -- DCM clock feedback
95
   DSSEN => '0',     -- ?
96
   PSINCDEC => '0',  -- Dynamic phase adjust increment/decrement
97
   PSEN => '0',      -- Dynamic phase adjust enable input
98
   PSCLK => '0',     -- Dynamic phase adjust clock input
99
   RST => '0',       -- DCM asynchronous reset input
100
   CLK0 => CLK100,   -- 0 degree DCM CLK ouptput
101
   CLK90 => open,    -- 90 degree DCM CLK output
102
   CLK180 => open,   -- 180 degree DCM CLK output
103
   CLK270 => open,   -- 270 degree DCM CLK output
104
   CLK2X => open,    -- 2X DCM CLK output
105
   CLK2X180 => open, -- 2X, 180 degree DCM CLK out
106
   CLKDV => CLK25,   -- Divided DCM CLK out (CLKDV_DIVIDE)
107
   CLKFX => open,    -- DCM CLK synthesis out (M/D)
108
   CLKFX180 => open, -- 180 degree CLK synthesis out
109
   LOCKED => open,   -- DCM LOCK status output
110
   PSDONE => open,   -- Dynamic phase adjust done output
111
   STATUS => open    -- 8-bit DCM status bits output
112
  );
113
114
 OBUFDS_TMDSCLK: OBUFDS
115
  port map (
116
   I => CLK25,
117
   O => TMDSp_clock,
118
   OB => TMDSn_clock
119
  );
120
121
end Behavioral;

Jemand eine Idee wie das Problem zu lösen ist?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tim T. schrieb:
> Minimal Beispiel
Ergebnis:
"Process "Generate Programming File" completed successfully"
Das Problem liegt offenbar ausserhalb dieses Minimalbeispiels. Ich 
kann es mit der ISE abgesehen von minderen Warnungen problemlos 
implementieren...

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Hmpf, hattest Du auch mit dem gleichen Device XC6SLX45 Laufen lassen?

Ansonsten habe ich mittlerweile
https://forums.xilinx.com/t5/Spartan-Family-FPGAs/the-PLL-output/td-p/191552
gefunden wo gesagt wird das man einen OBUF wohl nicht an eine PLL hängen 
soll da die Ausgänge der PLL wohl nur äusserst schlecht zu routen sind.

Hab den Output jetzt durch einen ODDR2 geschoben und alles geht 
fehlerfrei durchs Place&Route, trotzdem würde mich interessieren warum 
es bei dir geht...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tim T. schrieb:
> Hmpf, hattest Du auch mit dem gleichen Device XC6SLX45 Laufen lassen?
Hmmm, ich meinte schon. Aber ich kann das leider vorerst nicht mehr 
kontrollieren...

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Lothar M. schrieb:
> Tim T. schrieb:
>> Hmpf, hattest Du auch mit dem gleichen Device XC6SLX45 Laufen lassen?
> Hmmm, ich meinte schon. Aber ich kann das leider vorerst nicht mehr
> kontrollieren...

Naja, werde da bei Gelegenheit nochmal nachforschen.

Der Vollständigkeit halber falls ein Anderer das hier Findet:
1
library UNISIM;
2
use UNISIM.VComponents.all; -- Damit man nicht alles selber machen muss
3
4
...
5
6
nCLKDV => not CLKDV;
7
8
ODDR2_CLK25 : ODDR2
9
 generic map (
10
  DDR_ALIGNMENT => "NONE", -- Sets output alignment to "NONE", "C0", "C1" 
11
  INIT => '0',             -- Sets initial state of the Q output to '0' or '1'
12
  SRTYPE => "SYNC"         -- Specifies "SYNC" or "ASYNC" set/reset
13
 )
14
 port map (
15
  Q => CLK25,              -- 1-bit output data
16
  C0 => CLKDV,             -- 1-bit clock input
17
  C1 => nCLKDV,            -- 1-bit clock input
18
  CE => '1',               -- 1-bit clock enable input
19
  D0 => '1',               -- 1-bit data input (associated with C0)
20
  D1 => '0',               -- 1-bit data input (associated with C1)
21
  R => '0',                -- 1-bit reset input
22
  S => '0'                 -- 1-bit set input
23
 );

von J. S. (engineer) Benutzerseite


Lesenswert?

Tim T. schrieb:
> nCLKDV => not CLKDV;

Buffer vor CLKDV implementiert?

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.