Muscat 0 13 апреля, 2012 Опубликовано 13 апреля, 2012 · Жалоба Всем доброго утра. Появился вот какой вопрос Нужен приемник информационного сигнала в формате Data/Strobe Речь собсно даже не о формате кодирования, вопрос так же можно переформулировать к формату манчестера-2, передачи клоков по отдельной шине и т.д. Вопрос собсно вот в чем Раньше я работал либо в формате, когда данные приходили ко мне из процессора и сопровождались флагом чтения, либо данные поступали по внешней шине в каком то коде, но скорость была достаточно низкой (единицы Мбит на проволоку), чтобы я мог их сразу по приходу в ПЛИС продисретизировать с клоком 100 МГц и дальше обрабатывать чисто логически. Теперь есть задача принимать сигнал в виде Data/Strobe, но уже со скоростью хотя бы 100Мбит. Поскольку скорость работы схемы я оцениваю в районе 100МГц, то возникает проблема, ведь такой сигнал проквантовать уже не получится. В описаниях к стандарту пишут, что для получения клока подайте оба сигнала на XOR и на выходе вылезет клок (см. последний график на рисунке) Но что мне делать с этим клоком? Его фронты ведь непосредственно привязаны к фронтам информационного сигнала. Как таким фронтом квантовать сигнал Data, если фронты клока непосредственно привязаны к фронтам Data? В идеале хотелось бы, чтобы фронты были сдвинуты на половину длительности информационного символа, но скорость работы может меняться, поэтому должна меняться и задержка. Как решаются такие задачи? Как сохранить дизайн синхронным, не вводя производных клоков? Посоветуйте, каких нибудь статей на эту тему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 13 апреля, 2012 Опубликовано 13 апреля, 2012 · Жалоба не хотите париться, пускайте тактовую по отдельной шине. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mad_kvmg 0 13 апреля, 2012 Опубликовано 13 апреля, 2012 · Жалоба чтобы я мог их сразу по приходу в ПЛИС продисретизировать с клоком 100 МГц и дальше обрабатывать чисто логически. Передескретизовывают ЦОСники, мы переносим в другой тактовый домен. Но что мне делать с этим клоком? Его фронты ведь непосредственно привязаны к фронтам информационного сигнала. Как таким фронтом квантовать сигнал Data, если фронты клока непосредственно привязаны к фронтам Data? В идеале хотелось бы, чтобы фронты были сдвинуты на половину длительности информационного символа, но скорость работы может меняться, поэтому должна меняться и задержка. Копайте в сторону DDR (у некоторых плис, есть уже готовый приметив IDDR), IDELAY, констрейнов after и before. Почитайте про пересечение клоклвых доменов. Как решаются такие задачи? Как сохранить дизайн синхронным, не вводя производных клоков? Посоветуйте, каких нибудь статей на эту тему? Посоветовать монжно почитать спецификацию на стандарт spacewire, там тоже DS кодирование. P.S. задача в целом не тривиальная, передавать данные сложнее чем обрабатывать, с тем же spacewire мы возились не один месяц, прежде чем добились стабильной работы на фиксированной скорости передачи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosu-art 0 13 апреля, 2012 Опубликовано 13 апреля, 2012 · Жалоба У меня 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Muscat 0 13 апреля, 2012 Опубликовано 13 апреля, 2012 · Жалоба gosu-art, поясните пожалуйста ваш код. Пока я увидел только счетчик, который работает по производному клоку. Как вы считываете инфу с сигнала sw_d_i? Mad_max, Стандарт на SpaceWire читал, инфы по реализации там нет. Подскажите, а как вы решали задачу приема? Я имею ввиду общие идеи. Или посоветуйте какие метериалы почитать? des00, формат задан стандартом, другой шины нет. Проблема не в том, что нет частоты - частоту я могу получить подав на XOR D и S сигналы. Проблема в том, что непонятно, что с ней дальше делать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 13 апреля, 2012 Опубликовано 13 апреля, 2012 · Жалоба формат задан стандартом, другой шины нет. Проблема не в том, что нет частоты - частоту я могу получить подав на XOR D и S сигналы. Проблема в том, что непонятно, что с ней дальше делать. как что ? на фифо и схему подавления дребезга %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosu-art 0 13 апреля, 2012 Опубликовано 13 апреля, 2012 · Жалоба 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mad_kvmg 0 13 апреля, 2012 Опубликовано 13 апреля, 2012 · Жалоба 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 констрейнили. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 13 апреля, 2012 Опубликовано 13 апреля, 2012 · Жалоба Потом читаете фифо своим "системным" клоком (самый надежный механизм пересечения доменов). А что мешает сразу системным клоком выделить любой перепад той и другой линии, что и будет ena по ИЛИ на системном клоке в фифо линию данных (например 300 Мгц, ведь длительность - полный бит). Другое дело - где начало посылки. Расскажите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
topor_topor 0 13 апреля, 2012 Опубликовано 13 апреля, 2012 (изменено) · Жалоба В идеале хотелось бы, чтобы фронты были сдвинуты на половину длительности информационного символа, но скорость работы может меняться, поэтому должна меняться и задержка. Как решаются такие задачи? Как сохранить дизайн синхронным, не вводя производных клоков? Посоветуйте, каких нибудь статей на эту тему? 1) "...сдвинуты на половину длительности информационного символа.." - ну дак инвертор поставьте, в комуникации это любимый способ.... 2) Если Ваш приёмник имеет максимальный клок равный передатчику то выход один - используйте полученный на XOR клок для всей схемы Вашего приёмника. Можно есчё PLL-м привязать врутренний клок к XOR клоку. 3) При этом, приёмник должен успевать забирать входные данные (data rate). Напр. за счёт того, что данные входят последовательно, а обрабатываються паралельно. Изменено 13 апреля, 2012 пользователем Torpeda Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 13 апреля, 2012 Опубликовано 13 апреля, 2012 · Жалоба передавать данные сложнее чем обрабатывать Почему сложнее? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mad_kvmg 0 13 апреля, 2012 Опубликовано 13 апреля, 2012 · Жалоба А что мешает сразу системным клоком выделить любой перепад той и другой линии, что и будет ena по ИЛИ на системном клоке в фифо линию данных (например 300 Мгц, ведь длительность - полный бит). Другое дело - где начало посылки. Расскажите. Metastability... Если скорость потока 10Мб, а системная частота 300Мгц, то проскочите, а если скорость входного потока 200Мбит, то не проскочите и будете долго смотреть на анализаторе куда деваются биты из сдвигового регистра. Проверено, что называется на личном опыте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 13 апреля, 2012 Опубликовано 13 апреля, 2012 · Жалоба Metastability Хорошо. три триггера на входе и 400 мгц. Других рекомендаций по борьбе с метастабильностью здесь я не увидел. (Все остальное на системном уровне) Во всяком случае все что тут рекомендовали по выделению клока - из той же оперы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Muscat 0 13 апреля, 2012 Опубликовано 13 апреля, 2012 · Жалоба 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? Писать за меня код не обязательно, можно просто на словах :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mad_kvmg 0 13 апреля, 2012 Опубликовано 13 апреля, 2012 · Жалоба Хорошо. три триггера на входе и 400 мгц. Других рекомендаций по борьбе с метастабильностью здесь я не увидел. (Все остальное на системном уровне) Во всяком случае все что тут рекомендовали по выделению клока - из той же оперы. Нет, ну если 1ГГц, то и вообще нет проблем. Но решение не в общем случае. Допустим системный клок 100МГц, по причинам не связанными с входным интерфейсом, того требует обработка данных, а интерфейс может быть сегодня один, а завтра другой (разные заказчики допустим), что в этом случае делать. Тем не менее приведите топик стартеру для примера пару строчек кода своего видения решения задачи, ему будет в любом случае полезно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться