Полная версия этой страницы:
DCM в XC3S400
stalko
Nov 22 2005, 10:55
Проблема такая:
описываю на Verilog такой модуль
module my_dcm(CLKIN_IN,
CLKFX_OUT,
CLKIN_IBUFG_OUT,
CLK0_OUT);
input CLKIN_IN;
output CLKFX_OUT;
output CLKIN_IBUFG_OUT;
output CLK0_OUT;
wire CLKFB_IN;
wire CLKFX_BUF;
wire CLKIN_IBUFG;
wire CLK0_BUF;
wire GND;
assign GND = 0;
assign CLKIN_IBUFG_OUT = CLKIN_IBUFG;
assign CLK0_OUT = CLKFB_IN;
BUFG CLKFX_BUFG_INST (.I(CLKFX_BUF),
.O(CLKFX_OUT));
IBUFG CLKIN_IBUFG_INST (.I(CLKIN_IN),
.O(CLKIN_IBUFG));
BUFG CLK0_BUFG_INST (.I(CLK0_BUF),
.O(CLKFB_IN));
// Period Jitter (unit interval) for block DCM_INST = 0.04 UI
// Period Jitter (Peak-to-Peak) for block DCM_INST = 0.13 ns
DCM DCM_INST (.CLKFB(CLKFB_IN),
.CLKIN(CLKIN_IBUFG),
.DSSEN(GND),
.PSCLK(GND),
.PSEN(GND),
.PSINCDEC(GND),
.RST(GND),
.CLKDV(),
.CLKFX(CLKFX_BUF),
.CLKFX180(),
.CLK0(CLK0_BUF),
.CLK2X(),
.CLK2X180(),
.CLK90(),
.CLK180(),
.CLK270(),
.LOCKED(),
.PSDONE(),
.STATUS())/* synthesis xc_props="CLK_FEEDBACK=1X, \
CLKDV_DIVIDE=2.000000, \
CLKFX_DIVIDE=1, \
CLKFX_MULTIPLY=10, \
CLKIN_DIVIDE_BY_2=FALSE, \
CLKIN_PERIOD=100.000000, \
CLKOUT_PHASE_SHIFT=NONE, \
DESKEW_ADJUST=SYSTEM_SYNCHRONOUS, \
DFS_FREQUENCY_MODE=LOW, \
DLL_FREQUENCY_MODE=LOW, \
DUTY_CYCLE_CORRECTION=TRUE, \
FACTORY_JF=C080, \
PHASE_SHIFT=0, \
STARTUP_WAIT=TRUE" */;
// synopsys translate_off
defparam DCM_INST.CLK_FEEDBACK = "1X";
defparam DCM_INST.CLKDV_DIVIDE = 2.000000;
defparam DCM_INST.CLKFX_DIVIDE = 1;
defparam DCM_INST.CLKFX_MULTIPLY = 10;
defparam DCM_INST.CLKIN_DIVIDE_BY_2 = "FALSE";
defparam DCM_INST.CLKIN_PERIOD = 100.000000;
defparam DCM_INST.CLKOUT_PHASE_SHIFT = "NONE";
defparam DCM_INST.DESKEW_ADJUST = "SYSTEM_SYNCHRONOUS";
// defparam DCM_INST.DFS_FREQUENCY_MODE = "HIGH";
defparam DCM_INST.DFS_FREQUENCY_MODE = "LOW";
defparam DCM_INST.DLL_FREQUENCY_MODE = "LOW";
defparam DCM_INST.DUTY_CYCLE_CORRECTION = "TRUE";
defparam DCM_INST.FACTORY_JF = 16'hC080;
defparam DCM_INST.PHASE_SHIFT = 0;
defparam DCM_INST.STARTUP_WAIT = "TRUE";
// synopsys translate_on
endmodule
На входе - 10МГц, на выходе, как видно, д.б. 100МГц.
Симулирую его - все великолепно...
Синтезирую (Sinplify Pro), заливаю в кристалл... на выходе... 10МГц!!!
Причем, как бы я ни менял коэффициенты деления/умножения все одно и то же: 10МГц...
Может кто сталкивался?
tegumay
Nov 22 2005, 18:23
Если в DCM задействован как DFS и DLL то мин вх частота 18 Мгц
лучше всего зайдите на сайт Xilinxa и скачайте доки по Spartan 3
DFS - когда задействованы выходы CLKFX и CLKFX180 (1-280 MHZ)
DLL - когда зайдействованы остальные выходы
если поставить обратную связь то будет уже не DFS а DLL и частота мин станет 18Мгц а не 1 МГц по ходу так
stalko
Nov 22 2005, 19:56
Цитата(tegumay @ Nov 22 2005, 21:23)

Если в DCM задействован как DFS и DLL то мин вх частота 18 Мгц
лучше всего зайдите на сайт Xilinxa и скачайте доки по Spartan 3
DFS - когда задействованы выходы CLKFX и CLKFX180 (1-280 MHZ)
DLL - когда зайдействованы остальные выходы
если поставить обратную связь то будет уже не DFS а DLL и частота мин станет 18Мгц а не 1 МГц по ходу так
Дело в том, что я не сам создавал сей чудный код, а доверил его архитектурному визарду от Ксайлинкса...
И он сказал, что минимальная входная частота от 1 МГц для данной конфигурации... по крайней мере, как я его понял...
stalko
Nov 23 2005, 13:29
Сейчас вот попробовал сделать DCM-ку на ките. Входная частота 50МГц.
Заодно для очистки совести все синтезировал не в Sinplify, а в XST.
На выходе CLK2X вижу удвоенную частоту, фазы 90-180-270 нормально подвинутые.
Но это я все видел и на своей плате с 10МГц входа (разве что с CLK2X там полз сигнал 10МГц, но со скважностью 4).
Но с выхода CLKFX прет какой-то бред, постоянная со слабыми колыханиями, которые по сути своей вероятно наводки...
Напомню, что на своей плате с 10МГц-ами, я видел те же 10МГц сквозняком.
Какие будут идеи? А то у меня уже своих вариантов и не осталось...
Пробовал обойтись, как тут звучало, без связи CLK0-CLKFB. Эффект нулевой.
tegumay
Nov 23 2005, 20:28
На 50 Мгц коэффициенты MUL и DIV какие? не те же самые?
не 10 : 1? а на вход RST подано что? почему то когда он в воздухе DCM не работает
рекомендую загдянуть в доки, там объъяснены все параметры блока DCM и когда в каких режимах он работает иначе придеться долго танцевать из-за того что некоторые параметры не сходятся
- параметр CLKFEEDBACK стоит в 1X, а для режима DFS он должен быть в NONE и feedbacka е должно быть иначе он будет DLL. я режим DFS не использовал, в пятницу попробую... но не на Spartan'e
stalko
Nov 23 2005, 20:41
Цитата(tegumay @ Nov 23 2005, 23:28)

На 50 Мгц коэффициенты MUL и DIV какие? не те же самые?
не 10 : 1?
Пытался 50МГц умножить на 2.
Цитата(tegumay @ Nov 23 2005, 23:28)

а на вход RST подано что? почему то когда он в воздухе DCM не работает
Пробовал с "0" и заводил на кнопку: жму, вижу сигнал падает в ноль, отпускаю, проскакивает 50МГц, потом якобы входит в режим и опять муть...
Цитата(tegumay @ Nov 23 2005, 23:28)

рекомендую загдянуть в доки, там объъяснены все параметры блока DCM и когда в каких режимах он работает иначе придеться долго танцевать из-за того что некоторые параметры не сходятся
- параметр CLKFEEDBACK стоит в 1X, а для режима DFS он должен быть в NONE и feedbacka е должно быть иначе он будет DLL. я режим DFS не использовал, в пятницу попробую... но не на Spartan'e
Проверял в DFS-режиме с feedback-ом = NONE, на входе только CLKIN, сигнал снимаю только с CLKFX, остальные входы в "0", выходы - в воздухе... То же самое...
Grumbler_2002
Nov 23 2005, 21:51
Посмотреть STATUS на предмет захвата или срыва частоты, проверить джиттер входного сигнала.
stalko
Nov 24 2005, 06:52
Цитата(Grumbler_2002 @ Nov 24 2005, 00:51)

Посмотреть STATUS на предмет захвата или срыва частоты, проверить джиттер входного сигнала.
STATUS[2:0]=3'b111;
Входной сигнал устойчивый, явного джиттера не наблюдается...
Зато обнаружил, что нет захвата...
tegumay
Nov 24 2005, 09:51
а как 2X он же работал? если он есть то и захват должен быть...
stalko
Nov 24 2005, 11:25
Цитата(tegumay @ Nov 24 2005, 12:51)

а как 2X он же работал? если он есть то и захват должен быть...
Более того, он и сейчас работает!!
Может, у меня крыша уже едет? LOCKED встает в "0" (это на случай, если я активный уровень перепутал

)
Почитал xapp462, скачал пример с
http://www.xilinx.com/bvdocs/appnotes/xapp462_verilog.zipПопробовал BUFG_DFS_SUBM и BUFG_DFS_FB_SUBM. Результат в общем тот-же:
10,3мкс на CLKFX стоит 50МГц, а потом все рушится...
P.S.
Оппппа!!! Вот так накололся!!!! У кита светодиоды горят по "0".
Прошу прощения у всех, кого заблудил... Мне очень стыдно

Получается все наоборот: LOCKED=1, а все статусы = 0...
stalko
Nov 24 2005, 16:59
Всё!! Всем спасибо!!!
Проблема найдена:
// synopsys translate_off и
// synopsys translate_on
тут явно лишние. Только вот интересно, а почему данные директивы присутствуют в коде Architecter Wizard-а? Кстати, в примере xapp264, тоже...
Правда, есть оговорка: у меня все это заработало только после того, как я поделил сигнал, входящий на DCM на 2... Возможно, проблема еще в джиттере...
stalko
Nov 24 2005, 17:22
Вдогонку подумалось...
Все хорошо, но это я все пробовал под XST, а как отреагирует Synplify на это?
И еще... непонятно, почему у меня тогда параметр DCM_INST.CLKIN_DIVIDE_BY_2 тогда работал?
stalko
Nov 25 2005, 10:11
Чего боялся, то и произошло...
Вернулся к основному проекту от тестового... и под Synplify DCM, прекрасно работавший под XST, перестал работать: на выходе CLKFX всегда то же самое, что на входе
stalko
Nov 25 2005, 18:14
Все, закрываю тему. Synplify оказалась ни при чем, на ките все заработало. На моей плате не было захвата. Дело было в поганом сигнале CLKIN. Сделал так: на первом DCM сделал CLKIN xor CLK90 (CLK2X не работает), потом это сигнал подал на второй с предделителем. Стало умножать, достиг 100МГц, но сигнал с поганой скважностью и джиттером. Остановился на 60МГц-ах, все все удовлетворительно.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.