|
|
  |
Синхронизация, Синхронизация устройств |
|
|
|
Apr 30 2011, 18:17
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Всем доброго))) Имеется некоторая плата, которая выплёвывает байты данных с частотой 27 МГц, и имеется девайс (на ПЛИСине) который эти байты из параллельной шины должен перегонять в последовательную, и который работает на частоте 50 МГц. Вопрос: частоты принципиально не кратны друг другу, и я боюсь, что рано или поздно, кто то кого то догонит (или параллельная шина начнёт забивать ячейки во входном буфере, биты из которых ещё не успели отправится на последовательную шину, или на последовательную шину начнут вылезать биты которые на ней уже были (запись во входной буфер я организовал, как циклический сдвиг)) и естественно произойдёт потеря пакетов. Я не в этой области вообщето специализируюсь, но так вышло, что приходится и этим то же заниматься, может кто подскажет выход, заранее спасибо=)
|
|
|
|
|
Apr 30 2011, 18:26
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(Грендайзер @ Apr 30 2011, 22:17)  Всем доброго))) Имеется некоторая плата, которая выплёвывает байты данных с частотой 27 МГц, и имеется девайс (на ПЛИСине) который эти байты из параллельной шины должен перегонять в последовательную, и который работает на частоте 50 МГц. Вопрос: частоты принципиально не кратны друг другу, и я боюсь, что рано или поздно, кто то кого то догонит (или параллельная шина начнёт забивать ячейки во входном буфере, биты из которых ещё не успели отправится на последовательную шину, или на последовательную шину начнут вылезать биты которые на ней уже были (запись во входной буфер я организовал, как циклический сдвиг)) и естественно произойдёт потеря пакетов. Я не в этой области вообщето специализируюсь, но так вышло, что приходится и этим то же заниматься, может кто подскажет выход, заранее спасибо=) А как? Если вход 27М х 8 бит, то выход последовательного должен быть 1 х (27*8) = с частотой не меньше 216 МГц. Иначе всяко переполнение будет. Для увеличения частоты можно плисовый PLL подключить. Опишите поподробней требования, не все ясно. С 50 МГц на выходе шириной в 1 бит ничего не выйдет. Или у вас поток входной прерывается? Тогда скважность пачек данных какая?
|
|
|
|
|
Apr 30 2011, 19:00
|
Участник

Группа: Свой
Сообщений: 74
Регистрация: 29-11-08
Из: санкт-петербург
Пользователь №: 42 061

|
Цитата(alexPec @ Apr 30 2011, 22:26)  А как? Если вход 27М х 8 бит, то выход последовательного должен быть 1 х (27*8) = с частотой не меньше 216 МГц. думаю, что там,наверное, есть какая-то скважность по входу... и,видимо, чуть больше 4х. а по поводу решения - по-моему, здесь напрашивается FIFO(если что, http://en.wikipedia.org/wiki/FIFO =) ). Ну только аккуратно прикиньте объем, в зависимости от входной скважности...
|
|
|
|
|
May 1 2011, 14:33
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Да, извините, забыл сказать, между пакетами, что идут с 8-ми битной шины имеется задержка по времени (т.е. покет отправлен, задержка, затем ещё пакет и опять задержка и т. д.). По поводу FIFO вроде ясно, но тем не мене эт немного не то. Систему я организовал след. образом: получаю пакет с параллельной шины (ПШ) и записываю его в буфер (это происходит с частотой 27 МГц). Далее, пока не пришёл следующий пакет начинаю выкладывать данные на последовательную шину (ПСШ) с частотой 50 МГц. Естественно за один цикл работы ПШ (27 МГц) я не успеваю выложить весь байт на ПСШ, и следующий пришедший байт, кладу в след. ячейку буфера. Как только весь байт из первой ячейки оказался на ПСШ, начинаю выкладывать биты на ПСШ из следующей ячейки и т. д., пока интервал в работе обеих шин не станет достаточным, что бы байты с ПШ можно было начать записывать опять в первую ячейку. Но т. к. частоты вообще никак не кратны, то боюсь, что даже несмотря на временной интервал между пакетами приходящими с ПШ кто то кого то догонит...
|
|
|
|
|
May 1 2011, 18:46
|
Участник

Группа: Свой
Сообщений: 74
Регистрация: 29-11-08
Из: санкт-петербург
Пользователь №: 42 061

|
Нет-нет, FIFO как раз то... Вам нужно FIFO и сериалайзер(преобразователь в последовательный код из параллельного). Когда в FIFO не пусто, вы читаете из FIFO и преобразуете это в последовательный код(нужен сигнал запрещения повторной записи в сериалайзер, когда он еще что-то двигает). После того как сериалайзер выдвинул данные, если в FIFO что-то есть вы снова оттуда читаете и преобразуете это в последовательный код... идея ясна,я надеюсь?
|
|
|
|
|
May 2 2011, 08:51
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Да, ясна, потому, что я именно так и поступил (часа полтора думал как поступить, и придумал таки  ), система у меня такая получилась: когда с параллельной шины я пишу в ячейку буфера, активизируется флаг, относящийся к этой ячейки, который запрещает в эту ячейку писать, когда ячейка полностью оказалась на последовательной шине, этот флаг опускается, позволяя заново писать в эту ячейку... Для каждой ячейки имеется свой флаг (это наверное не очень экономно и практично, но на большее меня не хватило  ) Но вопрос вот в чём, если произойдёт набег фаз двух синхросигналов (50 МГц и 27МГц), то параллельная шина начнёт, в какой то момент времени ждать когда можно будит писать в ячейку (поскольку в этот момент времени последовательная шина ещё не успела всё считать из данной ячейки), и это опять таки приведёт к потере пакетов... Возможно я просто чего то не понимаю, и прошу сразу извинить, т. к. ещё раз подчёркиваю, я этим совсем недавно стал заниматься
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|