Перейти к содержанию
    

Высокоскоростные приемники

Всем доброго утра.

 

Появился вот какой вопрос

 

Нужен приемник информационного сигнала в формате Data/Strobe

03fig13.gif

Речь собсно даже не о формате кодирования, вопрос так же можно переформулировать к формату манчестера-2, передачи клоков по отдельной шине и т.д.

 

Вопрос собсно вот в чем

Раньше я работал либо в формате, когда данные приходили ко мне из процессора и сопровождались флагом чтения, либо данные поступали по внешней шине в каком то коде, но скорость была достаточно низкой (единицы Мбит на проволоку), чтобы я мог их сразу по приходу в ПЛИС продисретизировать с клоком 100 МГц и дальше обрабатывать чисто логически.

 

Теперь есть задача принимать сигнал в виде Data/Strobe, но уже со скоростью хотя бы 100Мбит. Поскольку скорость работы схемы я оцениваю в районе 100МГц, то возникает проблема, ведь такой сигнал проквантовать уже не получится. В описаниях к стандарту пишут, что для получения клока подайте оба сигнала на XOR и на выходе вылезет клок (см. последний график на рисунке)

 

Но что мне делать с этим клоком? Его фронты ведь непосредственно привязаны к фронтам информационного сигнала. Как таким фронтом квантовать сигнал Data, если фронты клока непосредственно привязаны к фронтам Data? В идеале хотелось бы, чтобы фронты были сдвинуты на половину длительности информационного символа, но скорость работы может меняться, поэтому должна меняться и задержка.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не хотите париться, пускайте тактовую по отдельной шине.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

чтобы я мог их сразу по приходу в ПЛИС продисретизировать с клоком 100 МГц и дальше обрабатывать чисто логически.

Передескретизовывают ЦОСники, мы переносим в другой тактовый домен.

Но что мне делать с этим клоком? Его фронты ведь непосредственно привязаны к фронтам информационного сигнала. Как таким фронтом квантовать сигнал Data, если фронты клока непосредственно привязаны к фронтам Data? В идеале хотелось бы, чтобы фронты были сдвинуты на половину длительности информационного символа, но скорость работы может меняться, поэтому должна меняться и задержка.

Копайте в сторону DDR (у некоторых плис, есть уже готовый приметив IDDR), IDELAY, констрейнов after и before. Почитайте про пересечение клоклвых доменов.

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

Посоветовать монжно почитать спецификацию на стандарт spacewire, там тоже DS кодирование.

 

 

P.S. задача в целом не тривиальная, передавать данные сложнее чем обрабатывать, с тем же spacewire мы возились не один месяц, прежде чем добились стабильной работы на фиксированной скорости передачи.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня SpaceWire по такой схеме работает.ADuM1402+DS90LV049 --> 20Мб на 20м езернетовского кабеля 5кат.

код примерно такой:

 

assign sw_clk_o = (sw_d_i ^ sw_s_i);

 

 

always @(posedge sw_clk_o or negedge rst_w_)

begin

if (!rst_w_) rx_counter_rg <= 16'b0;

else rx_counter_rg <= rx_counter_rg + 16'b1;

end

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

gosu-art, поясните пожалуйста ваш код. Пока я увидел только счетчик, который работает по производному клоку. Как вы считываете инфу с сигнала sw_d_i?

 

Mad_max, Стандарт на SpaceWire читал, инфы по реализации там нет.

Подскажите, а как вы решали задачу приема? Я имею ввиду общие идеи. Или посоветуйте какие метериалы почитать?

 

des00, формат задан стандартом, другой шины нет. Проблема не в том, что нет частоты - частоту я могу получить подав на XOR D и S сигналы. Проблема в том, что непонятно, что с ней дальше делать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

формат задан стандартом, другой шины нет. Проблема не в том, что нет частоты - частоту я могу получить подав на XOR D и S сигналы. Проблема в том, что непонятно, что с ней дальше делать.

как что ? на фифо и схему подавления дребезга %)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

gosu-art, поясните пожалуйста ваш код. Пока я увидел только счетчик, который работает по производному клоку. Как вы считываете инфу с сигнала sw_d_i?

Да примерно также как и счетчик инкрементируется

always @(posedge clk_i or negedge rst_i_)

begin

if (!rst_i_) data_rg[0] <= 1'b0;

else data_rg[0] <= diff_i;

end

diff_i - это D строб

clk_i - восстановленный клок sw_clk_o = (sw_d_i ^ sw_s_i);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

    XOR2 SPW_XOR
        (
            .I0(rx_s),
            .I1(rx_d),
            
            .O(rx_c)
        );
    
    
    BUFG rx_c_bufg
        (
            .I(rx_c),
            .O(rx_clk)
        );
    
    
    always @(posedge rx_clk or posedge rst)
        begin
            if (rst) data_arr[1] <= 1'b0;
            else data_arr[1] <= rx_d;
        end
    
    always @(negedge rx_clk or posedge rst)
        begin
            if (rst) data_arr[0] <= 1'b0;
            else data_arr[0] <= rx_d;
        end
    
    // Rx bit collection
    always @(posedge rx_clk or posedge rst)
        begin
            if (rst) data_arr[9:2] <= 8'b0;
            else data_arr[9:2] <= data_arr[7:0];
        end

Дальше, как des говорит, data_arr тащите до фифо клоком rx_clk.

Потом читаете фифо своим "системным" клоком (самый надежный механизм пересечения доменов).

 

P.S. Но не стоит обольщаться, в последней версии 133Мб, парни то ли placment приемника руками делали, то ли положились на тулз :) after, before констрейнили.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Потом читаете фифо своим "системным" клоком (самый надежный механизм пересечения доменов).

 

А что мешает сразу системным клоком выделить любой перепад той и другой линии, что и будет ena по ИЛИ на системном клоке в фифо линию данных (например 300 Мгц, ведь длительность - полный бит).

Другое дело - где начало посылки. Расскажите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

1) "...сдвинуты на половину длительности информационного символа.." - ну дак инвертор поставьте, в комуникации это любимый способ....

2) Если Ваш приёмник имеет максимальный клок равный передатчику то выход один - используйте полученный на XOR клок для всей схемы Вашего приёмника.

Можно есчё PLL-м привязать врутренний клок к XOR клоку.

 

3) При этом, приёмник должен успевать забирать входные данные (data rate). Напр. за счёт того, что данные входят последовательно, а обрабатываються паралельно.

Изменено пользователем Torpeda

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что мешает сразу системным клоком выделить любой перепад той и другой линии, что и будет ena по ИЛИ на системном клоке в фифо линию данных (например 300 Мгц, ведь длительность - полный бит).

Другое дело - где начало посылки. Расскажите.

Metastability... :wacko:

Если скорость потока 10Мб, а системная частота 300Мгц, то проскочите,

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

Проверено, что называется на личном опыте.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Metastability

 

Хорошо. три триггера на входе и 400 мгц.

Других рекомендаций по борьбе с метастабильностью здесь я не увидел.

(Все остальное на системном уровне)

Во всяком случае все что тут рекомендовали по выделению клока - из той же оперы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

des00 Ммм, а как я буду давить дребезг? Я так понимаю, что дребезг имеется ввиду фронтов сигнала rx_s^rx_d ? Ведь они не идеально одновременно переключаются, то есть фронты будут не гладкие, а из волосни всякой, не?

 

Mad_max, Спасибо за код! Но мне по прежнему непонятна идея

1) Зачем нужен буфер BUFG ? Почему нельзя сразу написать rx_clk=rx_s^rx_d ?

2) Я не понимаю о каком ФИФО идет речь, ведь data_arr это же и есть фифо со сдвигом на 2 каждый такт? Читать вы имеете ввиду

always @(posedge sys_clk )
        begin
            rx_data<=data_arr[9];
        end

 

gosu-art, не понял, что за сигнал diff_i ? Что за строб такой, как он получен из sw_d_i? Писать за меня код не обязательно, можно просто на словах :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хорошо. три триггера на входе и 400 мгц.

Других рекомендаций по борьбе с метастабильностью здесь я не увидел.

(Все остальное на системном уровне)

Во всяком случае все что тут рекомендовали по выделению клока - из той же оперы.

Нет, ну если 1ГГц, то и вообще нет проблем. Но решение не в общем случае.

Допустим системный клок 100МГц, по причинам не связанными с входным интерфейсом,

того требует обработка данных, а интерфейс может быть сегодня один, а завтра другой (разные заказчики допустим),

что в этом случае делать.

Тем не менее приведите топик стартеру для примера пару строчек кода своего видения решения задачи, ему будет в любом случае полезно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...