Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: auto reset DCM_SP, Spartan3E
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
atlantic
Имеется внешний приходящий lvds clk, который потом в DCM_SP умножается итд.
Вообщем после того, как DCM станет LOCKED, начинает работать схема.
Этот lvds clk периодически может пропадать и возобновляться, т.е. на DCM
надо подавать RST после таких "провалов". В системе, для ПЛИС больше нет
дополнительных источников clk, кроме вышеописанного. Трабл в том, что после резкого
пропадания clkin сигнал LOCKED может продолжать оставаться в еденице, и по сути
LOCKED не гарантирует наличие clkin.

Вопрос в том, как сделать надежную систему сброса DCM при пропадании clk?
Думаю не я первый этим озадачен. Ставить внешню схему, которая отслеживает clk
и выдает RST, не очень то хочется, разве что это будет небольшая(по кол-ву ног)
и недорогая микросхема. Хотелось бы это сделать внутри ПЛИС.

Погуглив, я нашел ранее обсуждаемую аналогичную тему:
http://www.fpgarelated.com/usenet/fpga/show/9713-1.php
там дядька из Xilinx рекомендует следующий алгоритм, суть которого заключается в
периодической проверке наличия CLKIN (status[1]) и при его отсутствии выдавать
RST на несколько тактов, но дело в том, чтобы переодически делать это в ПЛИС,
надо иметь дополнительный надежный clk, а его как раз и нету см. выше.
Дале, там идет дискуссия на эту тему с вопросом/предложением
о том, чтоб встроить такую ф-цию(auto RST DCM при пропадании clkin) в кристал,
на что дядька из Xilinx как бы пообещал это дело передать в отдел разработки.
Это было в мае 2004, но видимо в Xilinx ничего так и не сдалали по этому поводу.
Хотя такая ф-ция в кристалле напрашивается в первую очередь.

Кто как обходится в таких случаях?
DmitryR
Цитата(atlantic @ Aug 21 2008, 12:26) *
... суть которого заключается в
периодической проверке наличия CLKIN (status[1]) и при его отсутствии выдавать
RST на несколько тактов, но дело в том, чтобы переодически делать это в ПЛИС,
надо иметь дополнительный надежный clk, а его как раз и нету см. выше.

Надо использовать вход частоты ДО DCM. Алгоритм такой: если LOCKED или STATUS[1] пропадает, то на DCM сразу выставляется RESET и одновременно асинхронно сбрасывается счетчик, тактируемый частотой до DCM (прямо со входа). Когда этот счетчик достчитает до, например, 8 - RESET c DCM убирается. Также, когда этот счетчик досчитает до 20ms (надо сделать его соответствующей разрядности) - DCM сбрасывается опять, мало ли не залочилась по какой причине. А LOCKED и STATUS[1], когда установятся, блокируют EN этого счетчика.
atlantic
Цитата(DmitryR @ Aug 21 2008, 13:44) *
Надо использовать вход частоты ДО DCM. Алгоритм такой: если LOCKED или STATUS[1] пропадает, то на DCM сразу выставляется RESET и одновременно асинхронно сбрасывается счетчик, тактируемый частотой до DCM (прямо со входа). Когда этот счетчик достчитает до, например, 8 - RESET c DCM убирается. Также, когда этот счетчик досчитает до 20ms (надо сделать его соответствующей разрядности) - DCM сбрасывается опять, мало ли не залочилась по какой причине. А LOCKED и STATUS[1], когда установятся, блокируют EN этого счетчика.

Делал я подобное, использовал только STATUS[1] в качестве асинхронного сброса для последовательно включенных FDCPE() (см. код ниже.).
Сигнал LOCKED в данном случае вроде не подходит, так как при DCM.RST=1 after 4clkin DCM.LOCKED -> 0, получается петля и DCM будет всегда в сбросе.

Но трабл был замечен в том что если M больше D(коэфф. умножения clk в моем случае 3.5) то такая идея не работает (увеличивание числа FD не помогло), а если M==D то работает в 90% случаев.

Код
// при возобновлении clk убирать RST с задержкой в MAX_DCM_RST_DELAY тактов
localparam MAX_DCM_RST_DELAY = 4;

genvar i;
generate
for(i=0; i<= MAX_DCM_RST_DELAY -1; i=i+1)
  begin: gen_INST
   wire D,Q;
   FDCPE #( .INIT(1'b0) )
   FDCPE_INST
            (
             .C(rxclkinta),
             .CE(1'b1),

             .D(D),
             .Q(Q),

             .CLR(DCM_status[1] | rst),  // Async clear input (Active High) (Highest priority!)
             .PRE(1'b0)            // Async set   input (Active High)
            );

  if(i>0)
   assign gen_INST[i].D = gen_INST[i-1].Q;

  end
endgenerate

// При потере clk делать сброс для DCM
assign gen_INST[0].D =1'b1;
assign DCM_RST =~gen_INST[MAX_DCM_RST_DELAY -1].Q;// ~RST_INV;
RobFPGA
Приветствую!


Почемуб не сделать внутренний генератор на задержках
и спользовать его для watchdoga внешней частоты?

Когдато я у Xilinx видел referens для Virtex4 "dcm autocalibration macro"
так там они тоже делали такой генератор для контроля неактивных DCM.

Успехов! Rob.
atlantic
Цитата(RobFPGA @ Aug 21 2008, 18:28) *
Приветствую!
Почемуб не сделать внутренний генератор на задержках
и спользовать его для watchdoga внешней частоты?

Когдато я у Xilinx видел referens для Virtex4 "dcm autocalibration macro"
так там они тоже делали такой генератор для контроля неактивных DCM.

Успехов! Rob.

в AR #21435
(вольный перевод):
про DCM_AUTOCALIBRATION написано, что по значению этого атрибута MAP'ер добавляет clock stop macro (~15 slices) для каждого DCM, который определяет остановку clk на CLKIN и CLKFB и внутри устанавливает и удерживает сигнал RST DCM'a, который переключает внутренний генератор DCM'a к линии задержки. Далее говорится, что после возобновления clk пользователь должен удерживать reset не менее 200ms, для правильной работы DCM.

И все это дело относится вроде исключительно к Virtex4.
А в ug07 написано, что использовние этого атрибута DCM_AUTOCALIBRATION=TRUE, предотвращает от эффекта Negative Bias Temperature Instability.

У меня просьба к тому, кто на ты с Virtex4(сам я еще с этим семейством не работал и толком не знаком):
Привести Technology схему(если это не займет много времени) , вообщем как-то выдрать схему(или RTL) выше названного clock stop macro, которые вставляет MAP, хотя не представляю как это сделать, да и вообще не уверен что это реально. Я бы хотел попробывать использовать такой механизм сброса(clock stop macro) для Spartan3E, хотя опять не уверен, что он может подойти к нему. Просто кажется, что раз этот макрос занимает аж 15слайсов, то может в нем есть какой-то ум или идея.

Спасибо.
RobFPGA
Приветствую!

А зачем выдирать?

http://www.xilinx.com/support/answers/21127.htm

тут ниже есть verilog и vhdl исходники всего.
В частности в module ringosc.v есть пример генератора где в качестве
элементов задержки используются тригера.
В последних ревизиях чипов V4 вроде для этого сделали специальный внутренний генератор.

Успехов! Rob.
atlantic
Спасибо Rob!
Буду пробывать.
des00
немного офттопик, но по сабжу.

Гуру ксайлинкса объясните как работает вот этот кусок кода :

файл DCM_STANDBY_Verilog22_Syn\ringosc.v

Код
  //----------------------------------------------------------------------------
  // Clock divider made with SRL and FD so that CLKWIRE drives only one slice.
  //----------------------------------------------------------------------------

  assign SHIFTSEL = OSCCLKDIV - 3;
  assign TOGGLE_CE = (OSCCLKDIV <= 2) ? 1'b1 : CE_SRL;
  assign TOGGLE_DIN = TOGGLE_CE ^ TOGGLE;
  assign CLK = TOGGLE;

  SRL16 SHIFTSRL (
               .Q(SHIFTOUT),.A0(SHIFTSEL[0]),
               .A1(SHIFTSEL[1]),.A2(SHIFTSEL[2]),
               .A3(SHIFTSEL[3]),.CLK(CLKWIRE),
               .D(CE_SRL))/* synthesis xc_uset="CLK_WIRE" xc_rloc="X2Y1" */;
  FDP SHIFTFD (.Q(CE_SRL),.C(CLKWIRE),.D(SHIFTOUT),
               .PRE(1'b0))/* synthesis xc_uset="CLK_WIRE" xc_rloc="X2Y1" */;


в делителе видно обратную связь SHIFTOUT-> CE_SRL. Но такая цепь будет работать только в случае если в ней, в момент включения в цепочке будет хотя бы одна единица.

НО, если верить v4lsc, элементы FDP и SRL16 по умолчанию инициализируются нулями. А параметры INIT как видно, в коде не переопределенны, также нет переопределения в ucf файле.

В доке DCM_STANDBY_Verilog22_Syn\readme.doc этот момент тоже не раскрывается.

Собственно вопрос как же работает такой делитель, при нулевых начальных условиях?

Спасибо.
RobFPGA
Приветствую!


Регистр FDP SHIFTFD - библиотечный элемент который имеет по умолчанию INIT=1'b1
и при загрузке FPGA инициализируется в 1


Успехов! Rob.
des00
Цитата(RobFPGA @ Aug 26 2008, 04:23) *
Регистр FDP SHIFTFD - библиотечный элемент который имеет по умолчанию INIT=1'b1
и при загрузке FPGA инициализируется в 1


да это было бы объяснением, но смотрю документ, который я уже приводил v4lcs.pdf взятый из ISE 10ки.

страница 181 приведена в атаче. И если мои глаза меня не обманывают в качестве дефолтной инициализации стоит 0, а не единица.

затем в доке v4ldl.pdf взятого там же, на странице 87 в описании основного триггера виртекса 4, видно тоже самое. по дефолту триггер встает в 0.

если же схема все же работает, значит ксайлы с исешкой дают неверные даташиты ?

Спасибо.
RobFPGA
Приветствую!

Не верь глазам своим :-)

Явный глюк в доках. Потому как в самой Xilinx-овской библиотеке unisim

module FDP (Q, C, D, PRE);

parameter INIT = 1'b1;
...

Пару раз попав на такие "перлы" я предпочитаю все указывать явно.

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