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

 
 
> Корректный сброс при изменении задающей частоты
Fourier
сообщение Mar 7 2016, 21:22
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 13-02-13
Из: Рыбинск
Пользователь №: 75 606



Здравствуйте!

Имеется плата с АЦП, ЦАПом и Spartan-6 на борту. Тактирование АЦП и ЦАП осуществляется синтезатором через дестрибьютер тактовых сигналов, частота дискретизации 125 МГц.
Дифф. тактовый сигнал от АЦП заводится в глобальную шину синхронизации и используется для синхронизации модулей ЦОС. Сигнал сброса на эти модули естесственно выдается с задержкой после включения.

Проводили испытания на климат и на морозе плата стала сбоить. Я сделал тестовую прошивку с возможность сброса части логики и оказалось, что сбоит логика тактируемая этим сигналом при прогреве платы во время работы.

Начал экспериментировать - замыкать входы синхронизации и действительно при кратковременном пропадании тактового сигнала логика перестает работать навечно.

Предполагаю, что при прогреве платы происходит кратковременное изменение фазы или частоты схемы тактирования. Однако, повторный сброс части логики ПЛИС решает все проблемы.

Подал клок АЦП на DCM и стал мониторить его сигналы LOCKED, STATUS, CLK_VALID, CLK_STOPPED. Сделал конечный автомат, отслеживающий их и формирующий сброс.
И снова стал замыкать дифф. пару. В 90 процентах случаев конечный автомат вырабатывает корректный сигнал сброса и работа логики восстанавливается.
Однако, иногда при кратковременном пропадании клока все сигналы DCM говорят о том, что все хорошо, а логика моя не работает, поскольку я ее не сбросил. (((( Ну об этом и UG382 говорит, как я понял, типа не рассчитывайте особа на сигналы состояний DCM. Вырабатывать сброс периодически не хочется.

Вопрос в следующем: как можно железно отследить кратковременные сбои тактирующего сигнал и сформировать сигнал сброса для логики тактируемой им?
Конечно, можно и с задающей схемой еще поковыряться, но мне не нравится такой расклад: клок пропал - все перестало работать на вечно, даже после его восстановления(((((

Заранее спасибо


Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
TRILLER
сообщение Mar 8 2016, 12:28
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 180
Регистрация: 17-02-09
Из: Санкт-Петербург
Пользователь №: 45 001



Цитата(Fourier @ Mar 8 2016, 00:22) *
Однако, иногда при кратковременном пропадании клока все сигналы DCM говорят о том, что все хорошо, а логика моя не работает, поскольку я ее не сбросил. (((( Ну об этом и UG382 говорит, как я понял, типа не рассчитывайте особа на сигналы состояний DCM.

Сигналы DCM говорят что всё хорошо, потому как всё действительно хорошо. Лично наблюдал не один раз, что опору DCM можно вообще убрать, а DCM и вся логика запущенная от этого DCMа будет работать как ни в чём не бывало. rolleyes.gif
Я бы вам посоветовал не пытаться детектировать ошибку входного синхроимпульса, а запустить работу логики от DCM. Непосредственно входным же тактом осуществлять только захват данных в ножках. Таким образом неполадки опорной тактовой будут приводить всего лишь к потере нескольких тактов данных, а не к умиранию всей схемы.
Go to the top of the page
 
+Quote Post
Fourier
сообщение Mar 8 2016, 12:52
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 13-02-13
Из: Рыбинск
Пользователь №: 75 606



Цитата(TRILLER @ Mar 8 2016, 15:28) *
Я бы вам посоветовал не пытаться детектировать ошибку входного синхроимпульса, а запустить работу логики от DCM. Непосредственно входным же тактом осуществлять только захват данных в ножках. Таким образом неполадки опорной тактовой будут приводить всего лишь к потере нескольких тактов данных, а не к умиранию всей схемы.


Спасибо за совет.

Я так и сделал сейчас, правда еще есть схема мониторинга состояния DCM и сброса при отсутствии захвата. Но в первом приближении косяк остался, завтра буду продолжать разбираться, может что-то не корректно сделал.

Еще вопрос до кучи)))

Чем отличается STATUS[1] от INPUT_CLK_STOPPED Clocking Wizarda. Не могу нигде найти. По тестбенчам они совпадают вроде.

P.S. А ничем и не отлчаются они
assign INPUT_CLK_STOPPED = status_int[1];

Цитата(TRILLER @ Mar 8 2016, 15:28) *
Я бы вам посоветовал не пытаться детектировать ошибку входного синхроимпульса, а запустить работу логики от DCM. Непосредственно входным же тактом осуществлять только захват данных в ножках. Таким образом неполадки опорной тактовой будут приводить всего лишь к потере нескольких тактов данных, а не к умиранию всей схемы.


Подскажите, пожалуйста, а можно ли и захват данных сделать от DCM, так как у меня BUFG дефицит. Если делать так как Вы говорите, по моему, нужно 2 BUFG на ввод дифф. тактовой пары, от них на IDDR2 синхронизацию подать и их же завести на вход DCM, плюс один BUFG - выход DCM.

Или я что-то не так делаю))) Буду очень рад советам.

Вот старый вариант кода сбора данных (без DCM, который отказывает на морозе). От out_dclk тактируется остальная логика.
Покритикуйте, пожалуйста. Может где подводные камни есть.

Код
module ad9613_rx #
(
   parameter   DIFF_TERM = "FALSE" // Parameter to enable internal differential termination
)
(
   // Данные
    input [ADC_WIDTH - 1 : 0] in_data_p,
    input [ADC_WIDTH - 1 : 0] in_data_n,
   // Синхронизация
    input in_dco_p,
    input in_dco_n,
    input in_adc_or_p,
    input in_adc_or_n,
    
    // Выходы
    output out_dclk,
    output reg [ADC_WIDTH - 1 : 0] out_data_0,
    output reg [ADC_WIDTH - 1 : 0] out_data_1
);

localparam ADC_WIDTH = 12;

wire w_dco_p;
wire w_dco_n;

wire w_dco_bufg_p;
wire w_dco_bufg_n;

wire [ADC_WIDTH - 1 : 0] w_rx_data_in;
wire [ADC_WIDTH - 1 : 0] w_rx_data_in_fix;

wire [ADC_WIDTH - 1 : 0] w_rx_data_0;
wire [ADC_WIDTH - 1 : 0] w_rx_data_1;

// Выходной клок
assign out_dclk = w_dco_bufg_p;

parameter     [ADC_WIDTH - 1 : 0] RX_SWAP_MASK = 12'h0000;    // pinswap mask for input bits (0 = no swap (default), 1 = swap). Allows inputs to be connected the wrong way round to ease PCB routing.

genvar     i;

// Входной буфер для клока (формирует дифференциальные сигналы
IBUFGDS_DIFF_OUT IBUFGDS_DIFF_OUT_ADC_DCO (
   .O(w_dco_p),   // Buffer diff_p output
   .OB(w_dco_n),  // Buffer diff_n output
   .I(in_dco_p),  // Diff_p buffer input (connect directly to top-level port)
   .IB(in_dco_n)  // Diff_n buffer input (connect directly to top-level port)
);

// Заводим в глобальную шину синхронизации
BUFG BUFG_ADC_DCO_P (
   .O(w_dco_bufg_p),   // 1-bit output: Clock buffer output
   .I(w_dco_p)    // 1-bit input: Clock buffer input
);

BUFG BUFG_ADC_DCO_N (
   .O(w_dco_bufg_n),   // 1-bit output: Clock buffer output
   .I(w_dco_n)    // 1-bit input: Clock buffer input
);

// Генерация входных буферов
generate
for (i = 0; i < ADC_WIDTH; i = i + 1)
begin : loop0

  
   // Входной дифф. буфер
   IBUFDS #(
      .DIFF_TERM         (DIFF_TERM))
   data_in (
      .I                (in_data_p[i]),
      .IB               (in_data_n[i]),
      .O                 (w_rx_data_in[i])
      );
      
   // При необходимости проводим инверсию данных  
   assign w_rx_data_in_fix[i] = w_rx_data_in[i] ^ RX_SWAP_MASK[i]; // Invert data signals as required
  
   // DDR
   IDDR2 #(
      .DDR_ALIGNMENT("C0")          // Sets output alignment to "NONE", "C0" or "C1"      
   ) IDDR2_D0D1 (
      .Q0 ( w_rx_data_0[i] ),       // 1-bit output captured with C0 clock
      .Q1 ( w_rx_data_1[i] ),       // 1-bit output captured with C1 clock
      .C0 ( w_dco_p),               // 1-bit clock input
      .C1 ( w_dco_n),               // 1-bit clock input
      .CE (1'b1),                   // 1-bit clock enable input
      .D  (w_rx_data_in_fix[i]),    // 1-bit DDR data input
      .R  (1'b0),                   // 1-bit reset input
      .S  (1'b0)                    // 1-bit set input
   );
  
end
endgenerate

// Защелкиваем выходные данные
always @(posedge out_dclk)
begin
   out_data_0 <= w_rx_data_0;
   out_data_1 <= w_rx_data_1;
end

endmodule


Сообщение отредактировал Fourier - Mar 8 2016, 12:58
Go to the top of the page
 
+Quote Post



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

 


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


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