AR# 8144

SYNPLIFY - HDL (VHDL/Verilog) 内の CLKDLL をインスタンシエーションする方法

説明

キーワード : CLKDLL, clock, divider, Virtex, Synplicity, BUFGDLL, クロック, 分周器

重要度 : 標準

概要 :
CLKDLL は、クロック スキューを最小限にするために使用される DLL (Delay-Locked Loop) です。 clockdll (BUFGDLL) の最も簡単なコンフィギュレーションは、Synplify のザイリンクス専用属性から判断できます。(Xilinx Answer 688)

または、次のように CLKDLL をインスタンシエートする必要があります。 CLKDLL に関する詳細は、ザイリンクス アプリケーション ノート XAPP132 を参照してください。

CLKDLL に属性を渡す方法は、(Xilinx Answer 11095) を参照してください。 このアンサーでは、DCM のインスタンシエーションについて説明していますが、属性を受け渡す方法も同様です。

メモ : 次の例は、Synplify 5.2.2a でテストされています。

ここではデフォルトの I/O 標準 (LVTTL) が使用されています。 ほかの I/O 標準を使用する場合は、適切な IBUFG_selectIO をインスタンシエートしてください。

ソリューション

1


Verilog の例

この例では ACLK の周波数は 2 倍にされ、チップの内部と外部の両方で使用されています。 BCLK と OUTBCLK はチップの外側のボードで接続されています。

`include "<path_to>/unisim.v"

module clock_test(ACLK, DIN, QOUT, BCLK, OUTBCLK, BCLK_LOCK, RESET);
input ACLK, BCLK;
input RESET;
input [1:0] DIN;
output [1:0] QOUT;
output OUTBCLK, BCLK_LOCK;

reg [1:0] QOUT;

IBUFG CLK_ibufg_A
(.I (ACLK),
.O(ACLK_ibufg)
);

BUFG ACLK_bufg
(.I (ACLK_2x),
.O (ACLK_2x_design)
);


IBUFG CLK_ibufg_B
(.I (BCLK), // connected to OUTBCLK outside
.O(BCLK_ibufg)
);

CLKDLL ACLK_dll_2x // 2x clock
(.CLKIN(ACLK_ibufg),
.CLKFB(ACLK_2x_design),
.RST(1'b0),
.CLK2X(ACLK_2x),
.CLK0(),
.CLK90(),
.CLK180(),
.CLK270(),
.CLKDV(),
.LOCKED(ACLK_lock)
);

CLKDLL BCLK_dll_OUT // off-chip synchronization
(.CLKIN(ACLK_ibufg),
.CLKFB(BCLK_ibufg), // BCLK and OUTBCLK is connected outside the chip.
.RST(1'b0),
.CLK2X(OUTBCLK), //connected to BCLK outside
.CLK0(),
.CLK90(),
.CLK180(),
.CLK270(),
.CLKDV(),
.LOCKED(BCLK_LOCK)
);

always @(posedge ACLK_2x_design or posedge RESET)
begin
if (RESET)
QOUT[1:0] <= 2'b00;
else if (ACLK_lock)
QOUT[1:0] <= DIN[1:0];
end

endmodule

2


VHDL の例

library IEEE;
use IEEE.std_logic_1164.all;

library unisim;
use unisim.vcomponents.all;

entity CLOCK_TEST is
port(
ACLK : in std_logic;

-- off chip feedback, connected to OUTBCLK on the board.
BCLK : in std_logic;

--OUT CLOCK
OUTBCLK : out std_logic;

DIN : in std_logic_vector(1 downto 0);
RESET : in std_logic;
QOUT : out std_logic_vector (1 downto 0);

-- CLKDLL lock signal
BCLK_LOCK : out std_logic
);
end CLOCK_TEST;

architecture RTL of CLOCK_TEST is

component IBUFG
port (
I : in std_logic;
O : out std_logic);
end component;

component BUFG
port (
I : in std_logic;
O : out std_logic);
end component;

component CLKDLL
port (
CLKIN : in std_logic;
CLKFB : in std_logic;
RST : in std_logic;
CLK0 : out std_logic;
CLK90 : out std_logic;
CLK180 : out std_logic;
CLK270 : out std_logic;
CLKDV : out std_logic;
CLK2X : out std_logic;
LOCKED : out std_logic);
end component;

-- Glock signals
signal ACLK_ibufg : std_logic;
signal BCLK_ibufg : std_logic;
signal ACLK_2x : std_logic;
signal ACLK_2x_design : std_logic;
signal ACLK_lock : std_logic;

begin

ACLK_ibufg : IBUFG
port map (
I => ACLK,
O => ACLK_ibufg
);

BCLK_ibufg : IBUFG
port map (
I => BCLK,
O => BCLK_ibufg
);

ACLK_bufg : BUFG
port map (
I => ACLK_2x,
O => ACLK_2x_design
);

ACLK_dll : CLKDLL
port map (
CLKIN => ACLK_ibufg,
CLKFB => ACLK_2x_design,
RST => '0',
CLK2X => ACLK_2x,
CLK0 => OPEN,
CLK90 => OPEN,
CLK180 => OPEN,
CLK270 => OPEN,
CLKDV => OPEN,
LOCKED => ACLK_lock
);


BCLK_dll_out : CLKDLL
port map (
CLKIN => ACLK_ibufg,
CLKFB => BCLK_ibufg,
RST => '0',
CLK2X => OUTBCLK,
CLK0 => OPEN,
CLK90 => OPEN,
CLK180 => OPEN,
CLK270 => OPEN,
CLKDV => OPEN,
LOCKED => BCLK_lock
);


process (ACLK_2x_design, RESET)
begin
if RESET = '1' then
QOUT <= "00";
elsif ACLK_2x_design'event and ACLK_2x_design = '1' then
if ACLK_lock = '1' then
QOUT <= DIN;
end if;
end if;
end process;

END RTL;
AR# 8144
日付 12/15/2012
ステータス アクティブ
種類 一般