Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с DCM
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Strijar
Коллеги, дайте направление куда копать!

Дано Spartan-3E, снаружи приходит клок 50мгц (через обычную ногу) и выходит на sdram (тоже через обычную). Все работало пока не захотелось умножить частоту - до 80 (Синтезатор говорит можно до 95). При роутинге вылазит предупреждение

WARNING:Route:455 - CLK Net:sdram_clk_OBUF may have excessive skew because
0 CLK pins and 2 NON_CLK pins failed to route using a CLK template.

Естественно память глючит. Даже если умножать на 1. А если на sdram подать родной клок (не умноженый на 1) - работает. DCM сгенерил через coregen:

Код
library ieee;
use ieee.std_logic_1164.ALL;
use ieee.numeric_std.ALL;
library UNISIM;
use UNISIM.Vcomponents.ALL;

entity dcm is
   port ( CLKIN_IN        : in    std_logic;
          RST_IN          : in    std_logic;
          CLKFX_OUT       : out   std_logic;
          CLKIN_IBUFG_OUT : out   std_logic;
          CLK0_OUT        : out   std_logic;
          CLK2X_OUT       : out   std_logic;
          LOCKED_OUT      : out   std_logic);
end dcm;

architecture BEHAVIORAL of dcm is
   signal CLKFB_IN        : std_logic;
   signal CLKFX_BUF       : std_logic;
   signal CLKIN_IBUFG     : std_logic;
   signal CLK0_BUF        : std_logic;
   signal CLK2X_BUF       : std_logic;
   signal GND_BIT         : std_logic;
begin
   GND_BIT <= '0';
   CLKIN_IBUFG_OUT <= CLKIN_IBUFG;
   CLK0_OUT <= CLKFB_IN;

   CLKFX_BUFG_INST : BUFG
      port map (I=>CLKFX_BUF,
                O=>CLKFX_OUT);
  
   CLKIN_IBUFG_INST : IBUF
      port map (I=>CLKIN_IN,
                O=>CLKIN_IBUFG);
  
   CLK0_BUFG_INST : BUFG
      port map (I=>CLK0_BUF,
                O=>CLKFB_IN);
  
   CLK2X_BUFG_INST : BUFG
      port map (I=>CLK2X_BUF,
                O=>CLK2X_OUT);
  
   DCM_SP_INST : DCM_SP
   generic map( CLK_FEEDBACK => "1X",
            CLKDV_DIVIDE => 2.0,
            CLKFX_DIVIDE => 5,
            CLKFX_MULTIPLY => 5,
            CLKIN_DIVIDE_BY_2 => FALSE,
            CLKIN_PERIOD => 20.000,
            CLKOUT_PHASE_SHIFT => "NONE",
            DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS",
            DFS_FREQUENCY_MODE => "LOW",
            DLL_FREQUENCY_MODE => "LOW",
            DUTY_CYCLE_CORRECTION => TRUE,
            FACTORY_JF => x"C080",
            PHASE_SHIFT => 0,
            STARTUP_WAIT => FALSE)
      port map (CLKFB=>CLKFB_IN,
                CLKIN=>CLKIN_IBUFG,
                DSSEN=>GND_BIT,
                PSCLK=>GND_BIT,
                PSEN=>GND_BIT,
                PSINCDEC=>GND_BIT,
                RST=>RST_IN,
                CLKDV=>open,
                CLKFX=>CLKFX_BUF,
                CLKFX180=>open,
                CLK0=>CLK0_BUF,
                CLK2X=>CLK2X_BUF,
                CLK2X180=>open,
                CLK90=>open,
                CLK180=>open,
                CLK270=>open,
                LOCKED=>LOCKED_OUT,
                PSDONE=>open,
                STATUS=>open);
  
end BEHAVIORAL;


Констрейны:

Код
NET "clk" LOC = "p54";
NET "clk" TNM_NET = "clk";
TIMESPEC "ts_clkin" = PERIOD "clk" 50 MHz HIGH 50 %;

NET sdram* SLEW = fast;
NET sdram_clk SLEW = slow;


В top:

Код
    dcm_scm : entity dcm
        port map(
            clkin_in => clk,
            rst_in => '0',
            clkfx_out => clk_int,
            locked_out => clk_lock
        );

    int_res <= not clk_lock;
    sdram_clk <= clk_int;


Подскажите где чего смотреть и куда копать.
RobFPGA
Приветствую!

Проблема не в DCM а в задержках на роутинге клоков.

Я бы выходной клок на SDRAM сделал через выходной DDR регистр. Выход DCM через bufg подал на clk DDR, а на D-входы которых соответственно 1 и 0. Ну и наверное надо добавить CLKOUT_PHASE_SHIFT ="FIXED" и подобрать PHASE_SHIFT для корректной работы.

Успехов! Rob.
Strijar
Цитата(RobFPGA @ Feb 3 2009, 02:25) *
Проблема не в DCM а в задержках на роутинге клоков.


Спасибо за совет, но сами мы не местные из програмистов я в ПЛИС-ы подался. С задержками и тригерами только вот сейчас начал бодаться... Можно пример попросить? А еще лучше наводку - где почитать.

И не понятно - без DCM работает стабильно.
RobFPGA
Приветствую!

Нужно правильно учитывать задержки распространения сигнала от входной ноги Clk_In к DCM, и от DCM к выходной ноге.
Если делать просто Clk_In => Clk_Out то задержка от DCM к выходу будет большой и меняется от разводки к разводке, так как прямого соединения нет, только через логику. В варианте с DDR задержка предсказуемая и постоянная так как используются соединения для глобального клока. Изменения задержки от входа к DCM компенсируется самим DCM хотя лучше привязать положение DCM поближе к входной ноге. Ну и подбирая значения PHASE_SHIFT можно получить требуемые временные параметры сигналов для SDRAM.

Если на скорую руку - то вот так. Я в VHDL не шибко писатель поэтому набросал в графике.

Для выхода Clk2x_Out лучше ставить NET Clk2x_Out SLEW = FAST | DRIVE = 16 или 24;
DDR регистр надо разместить в блоке IO.

По использованию DCM у Хilinx есть куча апнотов, поищите на сайте Xilinx.

Успехов! Rob.
Strijar
Еще раз спасибо! Оказалось достаточно если вместо sdram_clk => clk_int зацепить через BUFG - заработало! Предупреждение никуда не делось, но работает.
RobFPGA
Приветствую!

В варианте с DDR и предупреждений не будет rolleyes.gif

Успехов! Rob.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.