Instructions
The circuit shown below can be used to deskew a system clock between
multiple Spartan-II chips on the same board. While designing the
board level route, ensure that the return net delay to the source
equals the delay to the other chips involved. Do not use the DLL
output clock signals until after activation of the LOCKED signal.
Prior to the activation of the LOCKED signal, the DLL output clocks
are not valid and can exhibit glitches, spikes, or other spurious
movement.
VHDL
-- Requires external connection
of CLK0_ext to CLKFB on the board.
--
library ieee;
use ieee.std_logic_1164.all;
library unisim;
use unisim.vcomponents.all;
entity dll_mirror_2 is
port (CLKIN : in std_logic;
CLKFB : in std_logic;
CLK0_ext : out std_logic;
CLK0_int : out std_logic;
NOT_LOCKED : out std_logic);
end DLL_mirror_2;
architecture structural of DLL_mirror_2 is
signal CLKIN_w, CLKFB_w, CLK0_int_DLL, CLK0_int_g, CLK0_ext_DLL :
std_logic;
signal LOCKED_ext_DLL, NOT_LOCKED_w : std_logic;
signal logic0 : std_logic;
begin
logic0 <= '0';
clkpad : IBUFG port map (I=>CLKIN, O=>CLKIN_w);
clkfbpad : IBUFG port map (I=>CLKFB, O=>CLKFB_w);
dllint : CLKDLL port map (CLKIN=>CLKIN_w, CLKFB=>CLK0_int_g, RST=>logic0,
CLK0=>CLK0_int_DLL, CLK90=>open, CLK180=>open, CLK270=>open, CLK2X=>open,
CLKDV=>open, LOCKED=>open);
dllext : CLKDLL port map (CLKIN=>CLKIN_w, CLKFB=>CLKFB_w, RST=>logic0,
CLK0=>CLK0_ext_DLL, CLK90=>open, CLK180=>open, CLK270=>open, CLK2X=>open,
CLKDV=>open, LOCKED=>LOCKED_ext_DLL);
clkg : BUFG port map (I=>CLK0_int_DLL, O=>CLK0_int_g);
clkextpad : OBUF port map (I=>CLK0_ext_DLL, O=>CLK0_ext);
CLK0_int <= CLK0_int_g;
NOT_LOCKED_w <= not LOCKED_ext_DLL;
notlckpad : OBUF port map (I=>NOT_LOCKED_w, O=>NOT_LOCKED);
end structural;
Verilog
// Requires external connection
of CLK0_ext to CLKFB on the board.
//
module DLL_mirror_2 (CLKIN, CLKFB, CLK0_ext, CLK0_int, NOT_LOCKED);
input CLKIN, CLKFB;
output CLK0_ext, CLK0_int, NOT_LOCKED;
wire CLKIN_w, CLKFB_w, CLK0_int_DLL, CLK0_ext_DLL;
wire LOCKED_ext_DLL, NOT_LOCKED_w;
wire logic0;
assign logic0 = 1'b0;
IBUFG clkpad (.I(CLKIN), .O(CLKIN_w));
IBUFG clkfbpad (.I(CLKFB), .O(CLKFB_w));
CLKDLL dllint (.CLKIN(CLKIN_w), .CLKFB(CLK0_int), .RST(logic0),
.CLK0(CLK0_int_DLL), .CLK90(), .CLK180(), .CLK270(),
.CLK2X(), .CLKDV(), .LOCKED());
CLKDLL dllext (.CLKIN(CLKIN_w), .CLKFB(CLKFB_w), .RST(logic0),
.CLK0(CLK0_ext_DLL), .CLK90(), .CLK180(), .CLK270(),
.CLK2X(), .CLKDV(), .LOCKED(LOCKED_ext_DLL));
BUFG clkg (.I(CLK0_int_DLL), .O(CLK0_int));
OBUF clkextpad (.I(CLK0_ext_DLL), .O(CLK0_ext));
assign NOT_LOCKED_w = ! LOCKED_ext_DLL;
OBUF notlckpad (.I(NOT_LOCKED_w), .O(NOT_LOCKED));
endmodule
|