Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Синхронизовать две DE0 борды на 450МГц
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
iiv
Всем привет,

есть две терасиковские борды с EP4CE22F17C6, на каждой из которых работает идентичный дизайн на частоте 450МГц. Сам дизайн прост, поэтому удалось выйти на такую частоту, на ней же хочется оставаться. В дизайне есть основной клок (450МГц) и счетчик по этому клоку. Счетчик двухступенчатый, первая ступень - 2-х битная, а по переполнению счетчик клочит второй счетчик (44Бит) на 450/4МГц частоте. На платах есть свои 50МГц осцилляторы, использовать внешние осцилляторы не хочу. Мне необходимо синхронизировать оба счетчика с обеих плат (пусть с какой-то фиксированной фазой) и удерживать такую синхронизацию бесконечно долго (счетчик переполняется за 40 часов, вот это для меня означает бесконечно долго).

Физически для такой синхронизации я могу задействовать не более 10 ног каждой плисины через JP3 (2x13) коннектор. Длина провода, если постараться, будет не более 10см, но ни о каких лвдсах, к сожалению, мечтать не приходится. Дополнительно хотел бы сказать, что вокруг не сильно благоприятные электромагнитные условия, то есть этот проводок между плисками, хоть я и заэкранирую, может случайно что-то словить из окружающей среды.

Реально никогда с таким не сталкивался, и прошу совета, как правильно поступить. Железо поменять не смогу - не реально.

Вижу одно из решений:

первая плисина
Код
input CLOCK_50;
inout [12:0] GPIO_2;

my_pll1 my_pll1_module(.inclk0(CLOCK_50) /*50МГц от кварца*/, .inclk1(GPIO_2[2]) /* вход 450МГц от соседней плиски*/,
.c0(GPIO_2[0]) /* 450МГц на соседнюю плиску*/, .c1(GPIO_2[1]) /* еще один выход с 450МГц клоком на соседнюю плиску*/);

wire [1:0] FastCounter;
wire         MyClk;

assign FastCounter=GPIO_2[3:4];
assign MyClk=GPIO_2[0];

always @(posedge MyClk) FastCounter<=FastCounter+1;


вторая плисина
Код
inout [12:0] GPIO_2;

my_pll2 my_pll2_module(.inclk0(GPIO_2[0]) /*первый 450МГц вход от соседний плиски*/, .inclk1(GPIO_2[1]) /*второй 450МГц вход от соседний плиски*/,
.c0(GPIO_2[2]) /* 450МГц на соседнюю плиску*/);

wire [1:0] FastCounter;
wire         MyClk;

assign FastCounter=GPIO_2[3:4];
assign MyClk=GPIO_2[2];


Еще в железе не проверял, но вопрошаю, пожалуйста, посоветуйте, можно ли так, и что можно еще улучшить!

Спасибо!

ИИВ
Raven
А зачем передавать 450 МГц клоки и огребать все проблемы signal integrity, если можно передавать 50 МГц, и им синхронизировать внутренние PLL? Еще и фазу можно подстроить экспериментально под конкретный кабель, если очень надо.
iiv
Уважаемый Raven,

спасибо за ответ, да, я согласен, что 50МГц гораздо проще передать, и от него синхронизировать внутренние PLL.

Но есть несколько вопросов, которые меня в этом случае беспокоят:

1. точности 50МГц синхронизации мне, к сожалению, не достаточно. То есть дополнительно мне всяко надо будет хоть редко, но посылать синхроимпульс, например, на частоте 450/16 МГц.

2. У меня есть, к сожалению, отрицательный опыт работы SPI плиска-процессор именно в этом окружении, хотя SPI была только на 12МГц, очень редко, но клок почему-то пропускался.

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

Скажите, пожалуйста, правильно ли я понимаю, что, чтобы не потерять клок, вернее правильно верифицировать его потерю, можно сделать так:

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

Пожалуйста, посоветуйте мне что в этом случае надо/можно изменить или исправить, чтобы система была максимально отказоустойчивая и надежная?

Спасибо

ИИВ
Raven
Сразу скажу, что я не спец по высоконадежным схемам синхронизации, поэтому послветовать вам проверенное и красивое решение не могу. Могу только изложить свои мысли как специалиста по цифровой технике, впервые столкнувшегося с подобной задачей.

Во-первых, вы не формализовали задачу в нужной степени. От этого не совсем понятна цель и возможные пути реализации. Отсюда множественные уточняющие вопросы.

Цитата(iiv @ Jul 24 2013, 12:59) *
спасибо за ответ, да, я согласен, что 50МГц гораздо проще передать, и от него синхронизировать внутренние PLL.

Синхро-клок может быть и на другой, более удобной частоте - 50/2, 50/4.

Цитата(iiv @ Jul 24 2013, 12:59) *
Потеря одного такта клока для меня катастрофична, мне об этом сразу необходимо узнать, чтобы потом все переподстроить.

Так пропуск клока предполагается все-таки, просто его надо детектировать и реинициализировать систему? Что является событием "пропуск клока": пропуск 1 такта, 2-х, 3-х, N?

Цитата(iiv @ Jul 24 2013, 12:59) *
первая плиска шлет клок второй,
вторая повторяет этот клок назад на первую
первая плиска снова дублирует пришедший клок назад на вторую, одновременно с этим первая плиска имеет два счетчика по своему клоку и по клоку, пришедшему от второй, если счетчики начали разбегаться, то выдает ошибку,
аналогичная проверка двух входящих клоков происходит на второй плиске.

Не слишком ли вы усложняете? Как насчет такой схемы.
Board_1 (master) Board_2 (slave)
CLK_SYNC_OUT -> clk_sync -> CLK_SYNC_IN
CLK_INIT_OUT -> clk_init -> CLK_INIT_IN
CLK_FAIL_IN <- clk_fail -> CLK_FAIL_OUT

Board_1 - clock-master, Board_2 - clock-slave, между ними в направлении Board_1 => Board_2 идет CLK_SYNC (скажем, 25 МГц). Board_2 имеет способность способность детектировать пропуск такта/тактов CLK_SYNC (как минимум, а может детектировать и качество конечного клока тоже) на своей стороне, и сигнализирует об этом Board_1 через CLK_FAIL сигнал. Board_1 занимается контролем качества своего локального клока, и мониторит CLK_FAIL_IN вход. Если что не так - переинициализирует клок-схему, принуждая Board_2 сделать то же самое через CLK_INIT сигнал.

PLL вроде контролирует качество генерируемого клока и реагирует на срывы (у него есть выход типа CLK_OK). Точное поведение и характеристики надо, конечно, изучить по документации.

Для контроля пропусков локального 450 МГц клока (если это действительно нужно, и если PLL не делает эту работу), придется замутить какую-то схему.
iiv
Благодаря правильным и своевременным вопросам Raven, за что ему преогромное спасибо, позвольте уточнить задачу:

1. внутренние счетчики, тактируемые от 450МГц на обоих плисках могут быть сдвинуты во времени (+/-5нс) из-за длины провода или каких-либо еще факторов, но величина сдвига не должна уходить больше чем на 1нс за время работы прибора от старта оного. То есть от старта к старту это значение может быть разным и лежать примерно в диапазоне +/-5нс, но как только оно стартовало все должно работать всегда с одним сдвигом.

2. детекция рассинхронизации счетчиков мне надо произвести не позже 50нс. Если за это время я смогу восстановить счетчик - то это идеально, возможно я вообще ничего не потеряю, но если это не так, или не возможно, то выдам на контрольную ножку 1, которая дальше остановит и перезапустит всю систему (последнее очень не желательно, но, если не возможно иначе, то буду с этим мириться).

3. очень бы хотелось бы знать величину рассинхронизации счетчиков между собой, если это физически возможно с максимальной точностью, но, боюсь, что в рамках этого железа - это не осуществимая задача.

4. пока работал с аналогичной задачей с одной плиской - пропусков или проблем с клоком на 450МГц и клоком от кварца 50МГц пока вообще не наблюдалось.

EDIT: Эксперимент обычно длится 1-3часа, первые 5-20 минут калибровка, далее запись данных. Если произошла рассинхронизация с восстановлением за 50нс, я или ничего не потеряю или потеряю 100мс эксперимента. Если такое происходит на чаще 1 раза в минуту - мне это не внапряг. Если я не смог восстановится после рассинхронизации, то мне надо повторить калибровку (5-20минут).

Из-за этих факторов я сильно сомниваюсь, что маленькая тактовая частота клока (50МГц) между плисками может мне дать горантию хорошей синхронизации внутренних счетчиков на 450МГц.
Raven
Уже понятнее.

П.4 дает надежду на реализацию с 50/25 MHz, и ваше сомнение
Цитата(iiv @ Jul 24 2013, 14:45) *
4. пока работал с аналогичной задачей с одной плиской - пропусков или проблем с клоком на 450МГц и клоком от кварца 50МГц пока вообще не наблюдалось.
...
Из-за этих факторов я сильно сомниваюсь, что маленькая тактовая частота клока (50МГц) между плисками может мне дать горантию хорошей синхронизации внутренних счетчиков на 450МГц.

непонятно.

Во всяком случае, это может стать элементом системы. Возможно, дополненной еще какими-то проверочными компонентами. Но передавать 450 MHz как single-ended - вы больше проблем насобираете, чем решите.
Kuzmi4
2 iiv
А почему бы не передавать скажем 1MHz (ну или больше - суть в том чтобы не передавать 450, а как можно меньше), синхронной с основной частотой и потом проводить синхронизацию - например так:
ctrl_dcmphase_v6 - (guest/guest)
Или же, если такой метод не подходит, попробовать использовать свой аналог 1588.
Или же комбинация 2х вышеописанных методов.

И почему вы не хотите LVDS использовать?
iiv
Огромное спасибо Вам Raven, что не оставляете меня наедине с моей незадачкой.

Полностью согласен с фактом, что 450МГц - single-ended особенно в плохих электромагнитных условиях - очень плохо.

Реально хочется понять можно ли передавая 50МГц или что-то около этого можно добиться того, что полученный из него 450МГц клок не сильно разползется на разных плисках между тактами, все-таки клок-то в 9 раз умножается. Можно ли это как-то улучшить? Возможно стоит передавать два клока по 50МГц с первой плиски на вторую и оба зачитывать как my_pll(.inclk0(GPIO_2[0]), .inclk1(GPIO_2[1]), ...) или этот метод -0 как мертвому примочка, посоветуйте, пожалуйста!

Для восстановления пропуска единичного клока при передаче с плиски на плиску планирую задействовать аппаратный способ PLL, но, дополнительно хочу как-то усилить это все какими-то дополнительными методами. Например каждые 16 тактов 450МГц частоты посылать синхроклок с подтверждением.

Еще вопрос, а если посылать с первой плиски на вторую два клока, один 50МГц, а второй 50*9/16 МГц и зачитывать второй плиской как опорные на .inclk0(GPIO_2[0]), .inclk1(GPIO_2[1]) не улучшит ли это ситуацию, скажите, пожалуйста?

Спасибо!

ИИВ
iiv
Во-первых, хочу сказать всем помогавшим и сочувствовавшим огромное спасибо! Надеюсь, с Вашей помощью, смогу решить свою незадачку.

Цитата(Kuzmi4 @ Jul 24 2013, 16:31) *
И почему вы не хотите LVDS использовать?


железо менять нельзя, а лвдсы в этой борде (Terasic DE0) отсутствуют - я вроде правильно понимаю, что по 2.54 пин штеккеру лвдс пропустить нельзя.

Есть один вопрос вокруг этой же темы... Скажите, пожалуйста, есть ли какие-то аппаратные средства у Альтеры в 4-ом циклоне чтобы измерить фазовый сдвиг двух сигналов с одинаковой частотой - например, частота у меня будет 25МГц, а вот сдвиг фаз хотелось бы с хорошей точностью (порядка 1нс, а если можно то и больше) померить. Понятно, что обычным счетчиком только до 2.5нс реально, но, вдруг есть, посоветуйте, пожалуйста, что читать и где копать. Вроде ALTPLL это не умеет делать...

Спасибо

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