Вечер добрый. Возникла необходимость написать проект для Spartan-3 (xc3s1500-4fg676). Как всегда неожиданно и срочно ((. В проекте необходимо подстроить фазу входного сигнала под данные. Стандартное решение - DCM. Но что то забуксовал. Для частот ниже 120 МГц все работает. Вижу выходную частоту равную входной и с изменяемым фазовым сдвигом. А вот для частоты 150 МГц проблема - нет выходного сигнала (причем на симуляторе тоже).
В тоже время в проекте для 6-го spartana все ок.
Ниже код (собственно задание DCM):
`timescale 1ns / 1ps
module dcm_proba (
input tx_in_clk,
output tx_out_clk
);
//--------------------------------------------------------------------------//
//------------------------- Буфер входной частоты. -------------------------//
//--------------------------------------------------------------------------//
wire w_tx_in_clk;
BUFG BUFG_tx_in_clk (
.I (tx_in_clk),
.O (w_tx_in_clk)
);
//--------------------------------------------------------------------------//
//----------------------- DCM модуль сдвига частоты. -----------------------//
//--------------------------------------------------------------------------//
wire w_clk0_out;
wire bufg_clk0_out;
DCM #(
.CLKDV_DIVIDE (2.0),
.CLKFX_DIVIDE (2),
.CLKFX_MULTIPLY (2),
.CLKIN_DIVIDE_BY_2 ("FALSE"),
.CLKIN_PERIOD (6.7),
.CLKOUT_PHASE_SHIFT ("FIXED"),
.CLK_FEEDBACK ("1X"),
.DESKEW_ADJUST ("SYSTEM_SYNCHRONOUS"),
.DLL_FREQUENCY_MODE ("LOW"),
.DUTY_CYCLE_CORRECTION ("TRUE"),
.PHASE_SHIFT (-90),
.STARTUP_WAIT ("FALSE")
) DCM_SP_Clk_118_shift (
.CLK0 (bufg_clk0_out),
.CLK180 (),
.CLK270 (),
.CLK2X (),
.CLK2X180 (),
.CLK90 (),
.CLKDV (),
.CLKFX (),
.CLKFX180 (),
.LOCKED (),
.PSDONE (),
.STATUS (),
.CLKFB (w_clk0_out),
.CLKIN (w_tx_in_clk),
.PSCLK (),
.PSEN (1'b0),
.DSSEN (),
.PSINCDEC (),
.RST (1'b0)
);
BUFG BUFG_118_shist (
.I (bufg_clk0_out),
.O (w_clk0_out)
);
wire w_tx_out_clk;
//spartan 3
OFDDRCPE OFDDRCPE_out (
.Q (w_tx_out_clk),
.C0 (w_clk0_out),
.C1 (~w_clk0_out),
.CE (1'b1),
.CLR (1'b0),
.D0 (1'b1),
.D1 (1'b0),
.PRE (1'b0)
);
/*
// spartan 6
ODDR2 #(
.DDR_ALIGNMENT ("NONE"),
.INIT (1'b0),
.SRTYPE ("SYNC")
) ODDR2_inst (
.Q (w_tx_out_clk),
.C0 (w_clk0_out),
.C1 (~w_clk0_out),
.CE (1'b1),
.D0 (1'b1),
.D1 (1'b0),
.R (1'b0),
.S (1'b0)
);
*/
assign tx_out_clk = w_tx_out_clk;
endmodule
В констрейнах прописываю лишь:
NET "tx_in_clk" CLOCK_DEDICATED_ROUTE = FALSE;
Гуру по 3-им спартанам не подскажите в чем загвоздка??