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

 
 
 
Reply to this topicStart new topic
> auto reset DCM_SP, Spartan3E
atlantic
сообщение Aug 21 2008, 08:26
Сообщение #1


участник
****

Группа: Свой
Сообщений: 573
Регистрация: 16-02-06
Пользователь №: 14 402



Имеется внешний приходящий 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 ничего так и не сдалали по этому поводу.
Хотя такая ф-ция в кристалле напрашивается в первую очередь.

Кто как обходится в таких случаях?
Go to the top of the page
 
+Quote Post
DmitryR
сообщение Aug 21 2008, 10:44
Сообщение #2


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

Группа: Свой
Сообщений: 1 535
Регистрация: 20-02-05
Из: Siegen
Пользователь №: 2 770



Цитата(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 этого счетчика.
Go to the top of the page
 
+Quote Post
atlantic
сообщение Aug 21 2008, 12:52
Сообщение #3


участник
****

Группа: Свой
Сообщений: 573
Регистрация: 16-02-06
Пользователь №: 14 402



Цитата(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;
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Aug 21 2008, 15:28
Сообщение #4


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

Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643



Приветствую!


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

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

Успехов! Rob.
Go to the top of the page
 
+Quote Post
atlantic
сообщение Aug 22 2008, 12:38
Сообщение #5


участник
****

Группа: Свой
Сообщений: 573
Регистрация: 16-02-06
Пользователь №: 14 402



Цитата(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слайсов, то может в нем есть какой-то ум или идея.

Спасибо.
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Aug 22 2008, 22:16
Сообщение #6


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

Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643



Приветствую!

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

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

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

Успехов! Rob.
Go to the top of the page
 
+Quote Post
atlantic
сообщение Aug 23 2008, 14:35
Сообщение #7


участник
****

Группа: Свой
Сообщений: 573
Регистрация: 16-02-06
Пользователь №: 14 402



Спасибо Rob!
Буду пробывать.
Go to the top of the page
 
+Quote Post
des00
сообщение Aug 26 2008, 03:20
Сообщение #8


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



немного офттопик, но по сабжу.

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

файл 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 этот момент тоже не раскрывается.

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

Спасибо.


--------------------
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Aug 26 2008, 09:23
Сообщение #9


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

Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643



Приветствую!


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


Успехов! Rob.
Go to the top of the page
 
+Quote Post
des00
сообщение Aug 26 2008, 13:04
Сообщение #10


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



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


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

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

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

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

Спасибо.
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 


--------------------
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Aug 26 2008, 13:37
Сообщение #11


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

Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643



Приветствую!

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

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

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

parameter INIT = 1'b1;
...

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

Успехов! Rob.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 17th August 2025 - 20:05
Рейтинг@Mail.ru


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