Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Передача сигнала по оптическому каналу
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
L47
Здравствуйте,
Уважаемые форумчане, прошу помочь в вопросе:

как передать сигнал низкой частоты посредством SFP модуля с детерминированностью по времени и ошибкой в пределах 3-5 нс, ?
- при сигнале несущей 100МГц и необходимости выделения чистых (в пределах 2 нс джиттера) 100МГц на приемнике.

имеется ПЛИС Cyclone II, MAX II, Cyclone IV, ПО Quartus 7.2

в данное время тестирую все на Cyclone II terasic DE2
- генерирую 100МГц и импульс 10нс, пропускаю их через XOR.

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

в правильном направлении ли я двигаюсь? есть ли какие-либо другие варианты решения?


Нажмите для просмотра прикрепленного файла
желтым - выход PLL (с задержкой)
синим - вход PLL


Нажмите для просмотра прикрепленного файла
желтым - результат сравнения выделенного сигнала с входным
синим - вход PLL

настройки PLL:
altpll_component.operation_mode = "NORMAL"
altpll_component.LOOP_FILTER_C = 20
altpll_component.m = 10
altpll_component.n = 1
altpll_component.c0_high = 5
altpll_component.c0_low = 5


des00
поставить что-то вроде ADN2816ACPZ
vadimp61
Примените манчестерское кодирование на частоте 100-622Мгц например.
Есть еще оптомодули, но не SFP работающие от DC до 5Мбод, но они по скорости не пойдут.
L47
Цитата(vadimp61 @ Jun 4 2014, 15:58) *
Примените манчестерское кодирование на частоте 100-622Мгц например.
Есть еще оптомодули, но не SFP работающие от DC до 5Мбод, но они по скорости не пойдут.

предел для cyclone II c6 PLL out Fmax = 500MHz,
то бишь выставляю клок на 500 МГц, считываю по каждому фронту состояние входа - > декодирую, получаю точность в пределах 2 нс?, попробую. спасибо за советы
vadimp61
Цитата(L47 @ Jun 4 2014, 15:06) *
предел для cyclone II c6 PLL out Fmax = 500MHz,
то бишь выставляю клок на 500 МГц, считываю по каждому фронту состояние входа - > декодирую, получаю точность в пределах 2 нс?, попробую. спасибо за советы

Закодируйте свой медленный сигнал с помощью манчестерского кода, то есть фронтами 500 Мгц тактовой, то получите точность повторения своего медленного сигнала 1/250000000 то есть 4 нс.
На SFP нельзя подавать постоянную составляющую.
Тут обсуждали
http://electronix.ru/forum/index.php?showtopic=112002
L47
Цитата(des00 @ Jun 4 2014, 15:31) *
поставить что-то вроде ADN2816ACPZ

к сожалению нету возможности дополнительно приобретать МС, но спасибо за совет,
по аналогии с этой CDR микросхемой ведь можно реализовать на cyclone II? или те параметры фильтра PLL что я установил - уже предел?

Цитата(vadimp61 @ Jun 4 2014, 22:13) *
Закодируйте свой медленный сигнал с помощью манчестерского кода, то есть фронтами 500 Мгц тактовой, то получите точность повторения своего медленного сигнала 1/250000000 то есть 4 нс.
На SFP нельзя подавать постоянную составляющую.
Тут обсуждали
http://electronix.ru/forum/index.php?showtopic=112002

на счет SFP и передачи низкой частоты - на наших модулях мешает лишь внутрикорпусный буферный ОУ фотодиода развязанный внутри емкостями, а светодиод может работать в режиме постоянного тока.

вроде как задержки в кодировании сигнала быть не должно :

*_*_*_*_*_*_ тактовый
______**____ импульс
*_*_*__**_*_ XOR = манчестер

задержка может быть при декодировании, и чем выше частота декодера манчестера - тем меньше ошибка, или я в чем то ошибаюсь?


des00
Цитата(L47 @ Jun 4 2014, 21:16) *
к сожалению нету возможности дополнительно приобретать МС, но спасибо за совет,
по аналогии с этой CDR микросхемой ведь можно реализовать на cyclone II? или те параметры фильтра PLL что я установил - уже предел?

ИМХО, если вам нужно
Цитата
при сигнале несущей 100МГц и необходимости выделения чистых (в пределах 2 нс джиттера) 100МГц на приемнике.

получить чистый синус с низким джиттером, то я бы поставил внешний CDR с узкой петлей. Затем положим у вас данные 100 килобит, повторяем каждый бит 1000 раз, получаем 100мегабит. Пропускаем через короткий скремблер, получаем высокочастотное заполнение. И данные передали низкие и CDR помогли (переходов будет много).

Делать CDR на альтеровской PLL я бы не стал, не для того создавалась. Как вариант сделать цифровую петлю ФАПЧ, она позволит вам получить "чистый" клок, но без внешнего гуна это будет дрожащий строб валидности данных.
vadimp61
Цитата(des00 @ Jun 4 2014, 18:35) *
ИМХО, если вам нужно

получить чистый синус с низким джиттером, то я бы поставил внешний CDR с узкой петлей. Затем положим у вас данные 100 килобит, повторяем каждый бит 1000 раз, получаем 100мегабит. Пропускаем через короткий скремблер, получаем высокочастотное заполнение. И данные передали низкие и CDR помогли (переходов будет много).

Делать CDR на альтеровской PLL я бы не стал, не для того создавалась. Как вариант сделать цифровую петлю ФАПЧ, она позволит вам получить "чистый" клок, но без внешнего гуна это будет дрожащий строб валидности данных.

Я так понял что ТС надо передавать одиночные TTL импульсы с минимальной задержкой на восстановление, а не чистый синус.
Ждем пояснения от ТС.
L47
Цитата(vadimp61 @ Jun 5 2014, 05:12) *
Я так понял что ТС надо передавать одиночные TTL импульсы с минимальной задержкой на восстановление, а не чистый синус.
Ждем пояснения от ТС.

Да, задачей является
- передать одиночный импульс раз в 100мкс (10кГц) и раз в секунду (PPS),
- выделить на приемнике помимо сигнальных импульсов - тактовую частоту 100МГц,
- обеспечить возможность различия импульсов 10кГц и PPS.
- обеспечить детерминированность времени декодирования сигнала.
des00
Цитата(L47 @ Jun 5 2014, 06:33) *
Да, задачей является
- передать одиночный импульс раз в 100мкс (10кГц) и раз в секунду (PPS),
- выделить на приемнике помимо сигнальных импульсов - тактовую частоту 100МГц,
- обеспечить возможность различия импульсов 10кГц и PPS.
- обеспечить детерминированность времени декодирования сигнала.

поток 100 мегабит, пропущенный через мультипликативный скремблер на который подана 1ца, передача 10КГц - импульс с уровнем 0 длительностью 3 такта, 1Гц импульс с уровнем 0 длительностью 7 тактов. На приемнике обратный путь. Селекция по длительности импульса.

1. На постоянке лазер работать будет не долго, держать его постоянно включенным не рекомендуется. Деградирует. Еще не забывайте про стандарты безопасности, там светить после включения, если нет оптики, постоянно нельзя.
2. Высокая частота -> много переходов -> проще сделать CDR. И CDR лучше взять внешний, специализированный под использование с оптическими модулями.
vadimp61
Цитата(L47 @ Jun 5 2014, 02:33) *
Да, задачей является
- передать одиночный импульс раз в 100мкс (10кГц) и раз в секунду (PPS),
- выделить на приемнике помимо сигнальных импульсов - тактовую частоту 100МГц,
- обеспечить возможность различия импульсов 10кГц и PPS.
- обеспечить детерминированность времени декодирования сигнала.


Берите оптомодуль от AVAGO, он искажает импульс по длительности не более 4 нс
Зачем? может просто сгенерить синхронную принимаемым импульсам?
krux
имхо, задачу можно разделить на две:
1) передача частоты с малым джиттером
2) передача данных с коррекцией по времени

1) решается при помощи внешней PLL с нужной полосой (для телекома например - классика жанра это что-то типа DS3102)
2) решается при помощи закольцовывания передаваемых синхронизирующих бит данных на приемнике, вычислении round-trip time и введением коррекции на передатчике. (как в связке CPRI BBU/RRH)
L47
Проблема решена на CycloneIV следующим образом:
на передатчике:
с передатчика отправляется сигнал 100МГц с вырезанным в момент прихода PPS импульсом:

assign tx = pps ? 0 : clk_1;

время прихода pps относительно фронта clk подтягивается с помощью задержки:

lcell delay (.in(clk), .out(clk_1));

на приемнике:

генерируются 2 тактовые частоты с помощью ФАПЧ с частотой 400МГц, одна с отклонением на 90 град.
введен 1 счетчик по переднему фронту и 2-й счетчик по заднему фронту тактовой частоты 400МГц синхронно сбрасывающийся по приходу фронта принимаемой частоты 100МГц
аналогичные счетчики введены для частоты сдвинутой на 90 град.
коэфф. счета счетчиков равен трем
при срабатывании хотя бы двух из всех четырех счетчиков в приемнике формируется сигнал PPS, в результате получаем джиттер в пределах 1,25нс

для интереса также было испытано при генерировании двух тактовых частот по 1 ГГц, результат давал джиттер около 0.5 нс
также имеется возможность уменьшить джиттер добавлением частот с меньшим отклонением по углу.

остались некоторые вопросы:
1. планируется все таки использовать CDR, каковы на практике CDR встроенные в плис например Cyclone IV GX? имются ли какие -либо подводные камни? какие рабочие частоты? (на сколько я понимаю они оптимизированы под стандарты передачи данных)
2. реализовывал ли кто-либо White-rabbit синхронизацию?, если да то поделитесь пожалуйста ссылкой или соображениями по принципам реализации синхронизации до единиц наносекунд.
3. возможно есть какие-либо недочеты/ошибки в коде, прошу дать знать.



приемник:
пример с использованием несущей в 24МГц:

Код
/*Обнаружение PPS и восстановление частоты*/

//Параметр - число тактов от обнаруженного заднего фронта mdi, при превышении значения >
parameter n_c = 9; // > обнаружение PPS
parameter n_cnt = 16; // > сброс счетчика, чем больше тем шире восстановленный импульс в clk_r
parameter n_c_p =8; // > запуск на восстановления импульса, может срабатывать не только в момент прихода PPS, вносит ошибку в восстановленную частоту
//при изменении параметра проверить размер счетчика на соответствие


//Обнаружение тактированием от 400МГц_0град

reg [4:0] p = 0; //счетчик переднего фронта
reg [4:0] n = 0; //счетчик заднего фронта

always @(posedge clk_ref) //счет передних фронтов, когда mdi = 0
begin
if(!mdi)
    if(p < n_cnt)
        begin
        p <= p + 1'b1;
        end
    else
        begin
        p <= 0;
        end
else p <= 0;
end

always @(negedge clk_ref) //счет задних фронтов, когда mdi = 0
begin
if(!mdi)
    if(n < n_cnt)
        begin
        n <= n + 1'b1;
        end
    else
        begin
        n <= 0;
        end
else n <= 0;
end
/////////////////////////////////////

//Обнаружение тактированием от 400МГц_90град

reg [4:0] p_2 = 0;//счетчик переднего фронта
reg [4:0] n_2 = 0;//счетчик заднего фронта

always @(posedge clk_ref_2) //счет передних фронтов, когда mdi = 0
begin
if(!mdi)
    if(p_2 < n_cnt)
        begin
        p_2 <= p_2 + 1'b1;
        end
    else
        begin
        p_2 <= 0;
        end
else p_2 <= 0;
end

always @(negedge clk_ref_2) //счет задних фронтов, когда mdi = 0
begin
if(!mdi)
    if(n_2 < n_cnt)
        begin
        n_2 <= n_2 + 1'b1;
        end
    else
        begin
        n_2 <= 0;
        end
else n_2 <= 0;
end


//Обнаружение PPS (если хотябы два будут больше чем n_c PPS = 1)
assign data = ((p_2 > n_c)&&(n_2 > n_c))||((p > n_c)&&(n > n_c))||((n > n_c)&&(n_2 > n_c))||((p > n_c)&&(n_2 > n_c))||((p > n_c)&&(p_2 > n_c))||((n > n_c)&&(p_2 > n_c));
//Обнаружение вырезаного импульса (если хотябы два будут больше чем n_c_p pulse = 1)  
assign pulse = ((p_2 > n_c_p)&&(n_2 > n_c_p))||((p > n_c_p)&&(n > n_c_p))||((n > n_c_p)&&(n_2 > n_c_p))||((p > n_c_p)&&(n_2 > n_c_p))||((p > n_c_p)&&(p_2 > n_c_p))||((n > n_c_p)&&(p_2 > n_c_p));

//Восстановление частоты (восстановление срезанного импульса)
assign clk_r = pulse? pulse : mdi;

/*-----------------------------*/
DuHast
Цитата(L47 @ Jul 24 2014, 12:58) *
остались некоторые вопросы:
1. планируется все таки использовать CDR, каковы на практике CDR встроенные в плис например Cyclone IV GX? имются ли какие -либо подводные камни? какие рабочие частоты? (на сколько я понимаю они оптимизированы под стандарты передачи данных)


В Циклонах стоят не CDR а SecDes работающие на скоростях от 600 Mbps. Ваше решение - внешний CDR.
L47
Цитата(DuHast @ Jul 26 2014, 03:09) *
В Циклонах стоят не CDR а SecDes работающие на скоростях от 600 Mbps. Ваше решение - внешний CDR.




Цитата
Receives the serial data stream and feeds the stream to the channel PLL
if you configure the channel PLL as a CDR

http://www.altera.com/literature/hb/cyclon...e5_handbook.pdf


DuHast
Все равно получения в этом CDR частота затем используется с работе SerDes'а и не может быть меньше 600МГц.
L47
Выявилась проблема в методе, мной выше описанном:

генерирую 2 частоты PLL-ом по 400МГц, одна на 90 град смещена,
ищу вырезанный импульс (PPS) в несущей частоте 24 МГц,

в случае когда вывожу найденный PPS таким способом:

Код
assign data = (p > n_c) || (n > n_c) || (p_2 > n_c) || (n_2 > n_c);


на выводе data появляются помехи,
в случае отдельного вывода:

Код
assign pps_p = p > n_c;
assign pps_n = n > n_c;
assign pps_p_2 = p_2 > n_c;
assign pps_n_2 = n_2 > n_c;


- помех нет, выводится PPS

в случае использования счетчика на 5: (в выше изложенном использовался счетчик на 4)
Код
reg [4:0] p = 0;

при попытке вывода pps по отдельности - т.е. "pps_p = p > n_c;" - тоже выдает шум вместо сигнала PPS.

склоняюсь к тому что связано это с внутренними наводками на счетчик, так ли это?
Mindworker
Подскажите, пожайлуста, в чем проблема: на выходе ножки ПЛИС на частоте 125МГц нет меандра, вместо этого появляется синусоподобный сигнал.
Частоту формировал на PLL и DCM внутри ПЛИС, потом выводил на ножку.
Тактовая частота генератора 100МГц, на плате не меандр.
Мне необходимо получить меандр на 125МГц, что я не так делаю?
Maverick
Цитата(Mindworker @ Dec 9 2014, 16:15) *
Подскажите, пожайлуста, в чем проблема: на выходе ножки ПЛИС на частоте 125МГц нет меандра, вместо этого появляется синусоподобный сигнал.
Частоту формировал на PLL и DCM внутри ПЛИС, потом выводил на ножку.
Тактовая частота генератора 100МГц, на плате не меандр.
Мне необходимо получить меандр на 125МГц, что я не так делаю?

как подключен осцилограф/анализатор?
какой осцилограф/анализатор? полоса, частота дискретизации позволяет?
Mindworker
Цитата(Maverick @ Dec 9 2014, 14:24) *
как подключен осцилограф/анализатор?
какой осцилограф/анализатор? полоса, частота дискретизации позволяет?

Осциллограф Tektronix TDS2042C. Полоса = 200МГц, частота дискретизации = 2GS/s. Одна беда он был до этого не заземлен, но потом заземлил и та же картина.
Пробники с 10-ми делителями.
ZASADA
а полоса пробника?
а как подключаете пробник, какова длина земляного провода?
Maverick
Цитата(Mindworker @ Dec 9 2014, 19:38) *
Осциллограф Tektronix TDS2042C. Полоса = 200МГц, частота дискретизации = 2GS/s. Одна беда он был до этого не заземлен, но потом заземлил и та же картина.
Пробники с 10-ми делителями.

признаюсь честно даже с длиной провода земли буквально 2-3 см я не видел на таком осциллографе идеального меандра при частотах выше 20-30 МГц...
Alex11
Наверно, TDS2024C? Далее. 200 МГц полосы предполагают передачу синуса 200 МГц, что приблизительно соответствует длительности фронта 2.5 нс. Соответственно, на 125 МГц с периодом 8 нс будем иметь два фронтв по 2.5 нс и два плоских участка по 1.5 нс. Если еще учесть, что делители к нему не пропускают 200 МГц, то реально будет все еще хуже. Чтобы посмотреть что-то похожее на правду нужен осциллограф не хуже TDS30xx и активный пробник с полосой не менее гига. Тогда увидите меандр.
Mindworker
Все понял, всем спасибо за ответы и комментарии. Пойдем просить новый осциллограф biggrin.gif
Leka
Цитата(Mindworker @ Dec 10 2014, 10:47) *
Все понял, всем спасибо за ответы и комментарии. Пойдем просить новый осциллограф biggrin.gif

Нужен не новый осциллограф cranky.gif , а Z0 пробник.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.