реклама на сайте
подробности

 
 
> Spartan6 и его PLL
zemlemer
сообщение Jun 27 2013, 14:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 10-06-08
Пользователь №: 38 190



Добрый день. У меня возникла проблема при генерации клоков внутренней pll spartan-на 6-го. Дано: входная частота на spartan - 8 МГЦ. Эта частота через BUFG подается на клоковый вход PLL_BASE. Коэфф. умножения - 6.
Из PLL_BASE выходят 3 сигнала: 2 по 48Мгц (с делением на 1) и один - 24МГц (с делением на 2). CLKFBOUT и CLKFBIN соединены напрямую. Квждый из 3-х клоковых выходов проходит через BUFG. В spartan3 такая схема вполне работала, там, правда, использовался DSM. Тут я получаю ругань MAP-а
CODE

ERROR:Place:1205 - This design contains a global buffer instance, <DSP_CLKBUF>, driving the net, <Clk48MOut_OBUF>, that is driving the following (first 30) non-clock load pins off chip. This design practice, in Spartan-6, can lead to an unroutable situation due to limitations in the global routing. If the design does route there may be excessive delay or skew on this net.

с последующим предложением использовать ODDR2. Есть ли у кого-то соображения как избавиться от этой ошибки? Если не сложно, может кто поделится примером простого умножения частоты на spartan-6. Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Bad0512
сообщение Jun 28 2013, 04:24
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650



Цитата(zemlemer @ Jun 27 2013, 21:31) *
Есть ли у кого-то соображения как избавиться от этой ошибки? Если не сложно, может кто поделится примером простого умножения частоты на spartan-6. Спасибо.

А почитать то что вам английским по белому пишет маппер - не судьба? Там же совершенно отчётливо сказано - используйте ODDR!
Потому что так правильно и потому что по-другому вывести клок наружу в этой архитектуре невозможно. PLL в данном случае ни при чём.
P.S. Ещё по вашему коду - BUFG на входе PLL нафиг не нужен. А вот в цепи обратной связи - очень даже нужен (если вы хотите соблюсти фазовые соотношения между
входным клоком и всеми сгенерёнными клоками).
Go to the top of the page
 
+Quote Post
Dr.Alex
сообщение Jun 28 2013, 19:48
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863



Вот пример. Клок сначала разгоняется DCM-ом, а затем PLLится.

Код
    DCM_CLKGEN_inst4 : DCM_CLKGEN
    generic map
    (
        CLKFXDV_DIVIDE  => 2,       -- CLKFXDV divide value (2, 4, 8, 16, 32)
        CLKFX_DIVIDE    => 27,      -- Divide value - D - (1-256)
        CLKFX_MD_MAX    => 0.0,     -- Specify maximum M/D ratio for timing anlysis
        CLKFX_MULTIPLY  => 50,      -- Multiply value - M - (2-256)
        CLKIN_PERIOD    => 37.0,    -- Input clock period specified in nS
        SPREAD_SPECTRUM => "NONE",  -- Spread Spectrum mode "NONE", "CENTER_LOW_SPREAD", "CENTER_HIGH_SPREAD",
                                    -- "VIDEO_LINK_M0", "VIDEO_LINK_M1" or "VIDEO_LINK_M2"
        STARTUP_WAIT    => FALSE    -- Delay config DONE until DCM_CLKGEN LOCKED (TRUE/FALSE)
    )
    port map
    (
        CLKFX       => clk_DCM4p,   -- 1-bit output: Generated clock output
        CLKFX180    => clk_DCM4n,   -- 1-bit output: Generated clock output 180 degree out of phase from CLKFX.
        CLKFXDV     => open,        -- 1-bit output: Divided clock output
        LOCKED      => open,        -- 1-bit output: Locked output
        PROGDONE    => open,        -- 1-bit output: Active high output to indicate the successful re-programming
        STATUS      => open,        -- 2-bit output: DCM_CLKGEN status
        CLKIN       => clk_27MHz,   -- 1-bit input: Input clock
        FREEZEDCM   => '0',         -- 1-bit input: Prevents frequency adjustments to input clock
        PROGCLK     => '0',         -- 1-bit input: Clock input for M/D reconfiguration
        PROGDATA    => '0',         -- 1-bit input: Serial data input for M/D reconfiguration
        PROGEN      => '0',         -- 1-bit input: Active high program enable
        RST         => '0'          -- 1-bit input: Reset input pin
    );

    ODDR2_inst4: ODDR2
    generic map
    (
        DDR_ALIGNMENT   => "NONE",  -- Sets output alignment to "NONE", "C0", "C1"
        INIT            => '0',     -- Sets initial state of the Q output to '0' or '1'
        SRTYPE          => "SYNC"   -- Specifies "SYNC" or "ASYNC" set/reset
    )
    port map
    (
        Q  => clk4,         -- 1-bit output data
        C0 => clk_DCM4p,    -- 1-bit clock input
        C1 => clk_DCM4n,    -- 1-bit clock input
        CE => '1',          -- 1-bit clock enable input
        D0 => '1',          -- 1-bit data input (associated with C0)
        D1 => '0',          -- 1-bit data input (associated with C1)
        R  => '0',          -- 1-bit reset input
        S  => '0'           -- 1-bit set input
    );

    -----------------------------------------------------------------------------------------------
    -----------------------------------------------------------------------------------------------


    PLL_BASE_inst : PLL_BASE
    generic map
    (
        BANDWIDTH => "OPTIMIZED",   -- "HIGH", "LOW" or "OPTIMIZED"
        CLKFBOUT_MULT   => 2,       -- Multiply value for all CLKOUT clock outputs (1-64)
        CLKFBOUT_PHASE  => 0.0,     -- Phase offset in degrees of the clock feedback output (0.0-360.0).
        CLKIN_PERIOD    => 20.0,    -- Input clock period in ns to ps resolution (i.e. 33.333 is 30 MHz).
        -- CLKOUT0_DIVIDE - CLKOUT5_DIVIDE: Divide amount for CLKOUT# clock output (1-128)
        CLKOUT0_DIVIDE => 1,
        CLKOUT1_DIVIDE => 1,
        CLKOUT2_DIVIDE => 1,
        CLKOUT3_DIVIDE => 1,
        CLKOUT4_DIVIDE => 1,
        CLKOUT5_DIVIDE => 1,
        -- CLKOUT0_DUTY_CYCLE - CLKOUT5_DUTY_CYCLE: Duty cycle for CLKOUT# clock output (0.01-0.99).
        CLKOUT0_DUTY_CYCLE => 0.5,
        CLKOUT1_DUTY_CYCLE => 0.5,
        CLKOUT2_DUTY_CYCLE => 0.5,
        CLKOUT3_DUTY_CYCLE => 0.5,
        CLKOUT4_DUTY_CYCLE => 0.5,
        CLKOUT5_DUTY_CYCLE => 0.5,
        -- CLKOUT0_PHASE - CLKOUT5_PHASE: Output phase relationship for CLKOUT# clock output (-360.0-360.0).
        CLKOUT0_PHASE => 0.0,
        CLKOUT1_PHASE => 45.0,
        CLKOUT2_PHASE => 90.0,
        CLKOUT3_PHASE => 180.0,
        CLKOUT4_PHASE => 0.0,
        CLKOUT5_PHASE => 0.0,
        CLK_FEEDBACK => "CLKFBOUT",           -- Clock source to drive CLKFBIN ("CLKFBOUT" or "CLKOUT0")
        COMPENSATION => "SYSTEM_SYNCHRONOUS", -- "SYSTEM_SYNCHRONOUS", "SOURCE_SYNCHRONOUS", "EXTERNAL"
        DIVCLK_DIVIDE => 1,                   -- Division value for all output clocks (1-52)
        REF_JITTER => 0.1,                    -- Reference Clock Jitter in UI (0.000-0.999).
        RESET_ON_LOSS_OF_LOCK => FALSE        -- Must be set to FALSE
    )
    port map
    (
        CLKFBOUT    => pll_fb,      -- 1-bit output: PLL_BASE feedback output
        CLKOUT0     => pll_clkout,
        CLKOUT1     => open,
        CLKOUT2     => open,
        CLKOUT3     => open,
        CLKOUT4     => open,
        CLKOUT5     => open,
        LOCKED      => open,        -- 1-bit output: PLL_BASE lock status output
        CLKFBIN     => pll_fb,      -- 1-bit input: Feedback clock input
        CLKIN       => clk_DCM4p,   -- 1-bit input: Clock input
        RST         => '0'          -- 1-bit input: Reset input
    );
Go to the top of the page
 
+Quote Post
zemlemer
сообщение Jun 30 2013, 16:29
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 10-06-08
Пользователь №: 38 190



Цитата(Dr.Alex @ Jun 28 2013, 22:48) *
Вот пример. Клок сначала разгоняется DCM-ом, а затем PLLится.
........


Спасибо.
Я сотворил нечто похожее. Единственное что: Я побоялся подключать DCM на PLL и сделал следующее: 20Мгц подал на PLL и для трех клоков 24, 48 и 8Мгц вывел на 3 ODDR2 через BUFG прямой и сдвинутый на 180 градусов клок.
48 и 8 МГц используются далее в автоматах spartan-а. Счастье было недолгим. Получил ругань ERROR:Pack:2531 и ERROR:Pack:2530 на ODDR2 клоков для 48 и 8 Мгц: failed to join the "OLOGIC2" component as required. и failed to join the OLOGIC component as required.
Чего ей опять для счастья не хватает - не понимаю.
Go to the top of the page
 
+Quote Post
akorud
сообщение Jul 1 2013, 21:34
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 203
Регистрация: 12-11-10
Из: Poland
Пользователь №: 60 842



Цитата(zemlemer @ Jun 30 2013, 18:29) *
Я побоялся подключать DCM на PLL и сделал следующее

Вполне официальная комбинация - не надо боятся. В некоторых случаях - единственная возможная, т.к. на вход DCM можно подать сигнал из "просто логики", а на вход PLL - нет.
А изначальное сообщение
Цитата
RROR:Place:1205 - This design contains a global buffer instance, <DSP_CLKBUF>, driving the net, <Clk48MOut_OBUF>, that is driving the following...

говорит что вы пробуете использовать клок в не-клоковых цепях (например вывести на IO). Так нельзя.
И наоборот - выход ODDR нельзя завести обратно в FPGA - только на IO pin.
Go to the top of the page
 
+Quote Post
zemlemer
сообщение Jul 2 2013, 11:29
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 10-06-08
Пользователь №: 38 190



Цитата(akorud @ Jul 2 2013, 00:34) *
Вполне официальная комбинация - не надо боятся. В некоторых случаях - единственная возможная, т.к. на вход DCM можно подать сигнал из "просто логики", а на вход PLL - нет.

Я испугался возможного джиттера. Быть может напрасно, но просто перестраховка.

Цитата(akorud @ Jul 2 2013, 00:34) *
А изначальное сообщение
говорит что вы пробуете использовать клок в не-клоковых цепях (например вывести на IO). Так нельзя.
И наоборот - выход ODDR нельзя завести обратно в FPGA - только на IO pin.

Стоп. Изначально стояла Следующая задача: есть входной клок 8 или 20 МГц. Внутри FPGA я делаю клоки частотой 8, 24 и 48МГц. 24 и 48 МГц торчат наружу. В свою очередь
те-же 48 и 8Мгц используются для клоков внутри FPGA. Правильно ли я понимаю, что для вывода клока наружу необходимо использовать ODDR2, а для внутреннего клока - брать
его от PLL через BUFG?
Go to the top of the page
 
+Quote Post
akorud
сообщение Jul 3 2013, 08:03
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 203
Регистрация: 12-11-10
Из: Poland
Пользователь №: 60 842



Цитата(zemlemer @ Jul 2 2013, 13:29) *
Я испугался возможного джиттера. Быть может напрасно, но просто перестраховка.

PLL его как раз немного и отфильтрует но честно говоря в S6 PLL так себе. Например для 20Msps DAC уже не то. Но для чисто цифровых схем - вполне хватает.

Цитата(zemlemer @ Jul 2 2013, 13:29) *
Стоп. Изначально стояла Следующая задача: есть входной клок 8 или 20 МГц. Внутри FPGA я делаю клоки частотой 8, 24 и 48МГц. 24 и 48 МГц торчат наружу. В свою очередь
те-же 48 и 8Мгц используются для клоков внутри FPGA. Правильно ли я понимаю, что для вывода клока наружу необходимо использовать ODDR2, а для внутреннего клока - брать его от PLL через BUFG?

Код
           +-> логика
PLL->BUFG->|
           +-> ODDR2->pin
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 18:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01467 секунд с 7
ELECTRONIX ©2004-2016