|
|
  |
auto reset DCM_SP, Spartan3E |
|
|
|
Aug 21 2008, 08:26
|
участник
   
Группа: Свой
Сообщений: 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 ничего так и не сдалали по этому поводу. Хотя такая ф-ция в кристалле напрашивается в первую очередь. Кто как обходится в таких случаях?
|
|
|
|
|
Aug 21 2008, 10:44
|
Профессионал
    
Группа: Свой
Сообщений: 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 этого счетчика.
|
|
|
|
|
Aug 21 2008, 12:52
|
участник
   
Группа: Свой
Сообщений: 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;
|
|
|
|
|
Aug 22 2008, 12:38
|
участник
   
Группа: Свой
Сообщений: 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слайсов, то может в нем есть какой-то ум или идея. Спасибо.
|
|
|
|
|
Aug 22 2008, 22:16
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! А зачем выдирать? http://www.xilinx.com/support/answers/21127.htmтут ниже есть verilog и vhdl исходники всего. В частности в module ringosc.v есть пример генератора где в качестве элементов задержки используются тригера. В последних ревизиях чипов V4 вроде для этого сделали специальный внутренний генератор. Успехов! Rob.
|
|
|
|
|
Aug 26 2008, 03:20
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 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 этот момент тоже не раскрывается. Собственно вопрос как же работает такой делитель, при нулевых начальных условиях? Спасибо.
--------------------
|
|
|
|
|
Aug 26 2008, 13:04
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 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. если же схема все же работает, значит ксайлы с исешкой дают неверные даташиты ? Спасибо.
Эскизы прикрепленных изображений
--------------------
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|