Servus zusammen,
ich versuche ein 13 MHz Signal in 500 ps Schritten zu verzögern, und das
ganze einstellbar.
Derzeit experimentiere ich mit einem Spartan-3E Starter Kit und möchte
die im Spartan verfügbaren DCMs nutzen. Diese bieten zwei
Delay-Funktionen:
- Fixed Delay
- Variable Delay
Leider bekomme das variable Delay nicht sinnvoll simuliert :-(
Zum erstellen benutze ich den Clock Wizard von ISE 10.1 (mit SP 2) und
den auf dem Board vorhandenen 50 MHz Takt. Den Phaseshift Wert habe ich
frei Schnauze mal auf 20 gesetzt.
Der spuckt mir folgenden Code 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 | entity Phaseshift is
|
8 | port ( CLKIN_IN : in std_logic;
|
9 | PSCLK_IN : in std_logic;
|
10 | PSEN_IN : in std_logic;
|
11 | PSINCDEC_IN : in std_logic;
|
12 | RST_IN : in std_logic;
|
13 | CLKIN_IBUFG_OUT : out std_logic;
|
14 | CLK0_OUT : out std_logic;
|
15 | LOCKED_OUT : out std_logic;
|
16 | PSDONE_OUT : out std_logic);
|
17 | end Phaseshift;
|
18 |
|
19 | architecture BEHAVIORAL of Phaseshift is
|
20 | signal CLKFB_IN : std_logic;
|
21 | signal CLKIN_IBUFG : std_logic;
|
22 | signal CLK0_BUF : std_logic;
|
23 | signal GND_BIT : std_logic;
|
24 | begin
|
25 | GND_BIT <= '0';
|
26 | CLKIN_IBUFG_OUT <= CLKIN_IBUFG;
|
27 | CLK0_OUT <= CLKFB_IN;
|
28 | CLKIN_IBUFG_INST : IBUFG
|
29 | port map (I=>CLKIN_IN,
|
30 | O=>CLKIN_IBUFG);
|
31 |
|
32 | CLK0_BUFG_INST : BUFG
|
33 | port map (I=>CLK0_BUF,
|
34 | O=>CLKFB_IN);
|
35 |
|
36 | DCM_SP_INST : DCM_SP
|
37 | generic map( CLK_FEEDBACK => "1X",
|
38 | CLKDV_DIVIDE => 2.0,
|
39 | CLKFX_DIVIDE => 1,
|
40 | CLKFX_MULTIPLY => 4,
|
41 | CLKIN_DIVIDE_BY_2 => FALSE,
|
42 | CLKIN_PERIOD => 20.000,
|
43 | CLKOUT_PHASE_SHIFT => "VARIABLE",
|
44 | DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS",
|
45 | DFS_FREQUENCY_MODE => "LOW",
|
46 | DLL_FREQUENCY_MODE => "LOW",
|
47 | DUTY_CYCLE_CORRECTION => TRUE,
|
48 | FACTORY_JF => x"C080",
|
49 | PHASE_SHIFT => 20,
|
50 | STARTUP_WAIT => FALSE)
|
51 | port map (CLKFB=>CLKFB_IN,
|
52 | CLKIN=>CLKIN_IBUFG,
|
53 | DSSEN=>GND_BIT,
|
54 | PSCLK=>PSCLK_IN,
|
55 | PSEN=>PSEN_IN,
|
56 | PSINCDEC=>PSINCDEC_IN,
|
57 | RST=>RST_IN,
|
58 | CLKDV=>open,
|
59 | CLKFX=>open,
|
60 | CLKFX180=>open,
|
61 | CLK0=>CLK0_BUF,
|
62 | CLK2X=>open,
|
63 | CLK2X180=>open,
|
64 | CLK90=>open,
|
65 | CLK180=>open,
|
66 | CLK270=>open,
|
67 | LOCKED=>LOCKED_OUT,
|
68 | PSDONE=>PSDONE_OUT,
|
69 | STATUS=>open);
|
70 |
|
71 | end BEHAVIORAL;
|
Wenn ich mir dazu nun eine Waveform Testbench erstelle, und das ganze
simuliere, bekomme ich keine Sinnvollen Ergebnisse.
Sprich - ich erable den Phaseshift-Increment für einen Takt, warte auf
das PSdone Signal, erhöhe um einen weiteren Wert und so weiter. Gemessen
zeigt sich jedoch KEIN Laufzeitunterschied zwischen den Signalen am
Eigang und nach dem DCM.
Habt ihr Erfahrungen mit dem DCM und evtl Tipps zur Simulation?
Wäre über jeden Hinweis sehr dankbar!
Grüße Peter