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

Inter channel skew

Приветствую уважаемые посетители форума. И снова требуется ваша помощь. Заранее говорю, задачу я решил, и модуль выполняет свой функционал. Но меня не покидает чувство, что моя реализация очень далека от правильной, и я упустил какой-то важный момент, который позволил бы реализовать всё гораздо проще...

Итак суть задачи:

Имеем 3 шины с которых мы получаем данные. Данные мы приняли, синхронизировали с нашим клоковым доменом и в итоге получили 3 линии данных: DATA_BUS_N0, DATA_BUS_N1, DATA_BUS_N2. Данные синхронны частоте DATA_CLK. Каждую линию данных сопровождает сигнал валидности. Когда он равен лог.1 данные активны, когда он равен лог.0 активны тестовые данные. При приёме оказалось, что физически шины не выровнены, и данные в каждой шине поступают с задержкой друг относительно друга. И появляется так называемый inter channel skew. Максимальное расхождение данных между 2 шинами может составлять 1 период частоты DATA_CLK. Думаю тут будет уместна такая вот картинка:

SKEW.png

 

Требуется разработать модуль, который бы выравнивал данные относительно друг друга, в итоге данные после модуля должны выглядеть так:

noskew.png

 

Был бы очень признателен, если бы подсказали правильные способы реализации данного модуля, или подсказали на какой-нибудь Application note, где рассказывается как его реализовать.

Данные идут сплошным потоком, поэтому время работы модуля особой роли не играет.

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


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

Пожалуйста.

 

Берём 3 FIFO. Каждую шину заводим в своё FIFO. Начинаем чтение из всех трёх FIFO только тогда, когда в каждом есть хотя бы по одному слову (конъюнкция стробов валидности). Глубина FIFO естественно должна быть больше максимального разброса между шинами. Но раз это максимум 1 период то вообще хорошо. Можно даже FIFO сделать на логике, чтобы блочную память впустую не тратить, т.к. тут единый клоковый домен, да и глубина FIFO малая. Причем данный способ удобен в том, что не нужно заранее знать какая шина от какой отстаёт. Должно получиться очень компактно и просто.

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

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


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

Пожалуйста.

 

Берём 3 FIFO. Каждую шину заводим в своё FIFO. Начинаем чтение из всех трёх FIFO только тогда, когда в каждом есть хотя бы по одному слову (конъюнкция стробов валидности). Глубина FIFO естественно должна быть больше максимального разброса между шинами. Но раз это максимум 1 период то вообще хорошо. Можно даже FIFO сделать на логике, чтобы блочную память впустую не тратить, т.к. тут единый клоковый домен, да и глубина FIFO малая. Причем данный способ удобен в том, что не нужно заранее знать какая шина от какой отстаёт. Должно получиться очень компактно и просто.

Делал я такой вариант, не устроил из-за того, что данные передаются как во время стробов валидности, так и во время их отсутствия. Просто предназначение данных разное. Я делал так: по стробам валидности я писал данные в 3 разных FIFO(в точности как вы и говорили) и потом их считывал... А во время отсутствия строба валидности я их писал в другие FIFO... Такая реализация вполне возможная, но как мне показалось уже очень мудреная и сложная. Ещё я там добавил фильтр стробов валидности для того, чтобы если вдруг произошло искажение принимаемых данных, и к примеру строб валидности на 1 такт стал равен нулю, не сбивалась запись в FIFO, иначе из-за ошибок приёма можно получить ещё большее расхождение фаз... Поскольку данные являются видео потоком, искажения данных не влияют ни на что.

Изменено пользователем Flip-fl0p

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


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

Делал я такой вариант, не устроил из-за того, что данные передаются как во время стробов валидности, так и во время их отсутствия. Просто предназначение данных разное. Я делал так: по стробам валидности я писал данные в 3 разных FIFO(в точности как вы и говорили) и потом их считывал... А во время отсутствия строба валидности я их писал в другие FIFO... Такая реализация вполне возможная, но как мне показалось уже очень мудреная и сложная. Ещё я там добавил фильтр стробов валидности для того, чтобы если вдруг произошло искажение принимаемых данных, и к примеру строб валидности на 1 такт стал равен нулю, не сбивалась запись в FIFO, иначе из-за ошибок приёма можно получить ещё большее расхождение фаз... Поскольку данные являются видео потоком, искажения данных не влияют ни на что.

UPD.

Вот такое "творение" получилось у меня. Если честно не очень нравится

CHANNEL_DESKEW.7z

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


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

2 Flip-fl0p

в общем случае, ваша задача решается через FIFO, которые пишутся по вашим VALID-сигналам, вычитываются по нужному наполнению (на сколько я понял, в вашем случае EF==0 для всех 3х FIFO) + нужно сделать сброс FIFO после того как вы вычитали условную "линию", чтобы ошибка разбега данных не накапливалась в процессе работы. Это без шума по VALID-сигналам..

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


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

2 Flip-fl0p

в общем случае, ваша задача решается через FIFO, которые пишутся по вашим VALID-сигналам, вычитываются по нужному наполнению (на сколько я понял, в вашем случае EF==0 для всех 3х FIFO) + нужно сделать сброс FIFO после того как вы вычитали условную "линию", чтобы ошибка разбега данных не накапливалась в процессе работы. Это без шума по VALID-сигналам..

Я вот и боюсь шума по VALID сигналам. Поэтому применяю простейший мажоритарный фильтр на 5 разрядов. Соответственно если идет 2 ошибки подряд фильтр их прекрасно убирает. Но вот на время фильтрации шума, я должен на это же время задержать данные(искажения в данных не критичны). И появляется проблема, что слишком много всякой "обвязки" для FIFO надо применять. Т.е вся дополнительная "обвязка" занимает столько же места, сколько и мой модуль, который я выложил здесь. Мне не жалко регистров. Просто схема выглядит как-то некрасиво и громоздко. Хотя работает, проверял на реально железке.

А что за условие EF==0 ? Случаем не сигнал Empty FIFO ?

Изменено пользователем Flip-fl0p

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


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

FIFO заменить на сдвиговые регистры с мультиплексорами (у Xilinx это SRL называется) и приделать логику управления адресами в разных каналах для выравнивания данных.

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


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

А что за условие EF==0 ?

да, FIFO Empty Flag == 0 (есть данные внутри FIFO)

 

С шумами по VALID-сигналам там сложнее..

Кстати, откуда эти шумы там берутся ?

 

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


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

да, FIFO Empty Flag == 0 (есть данные внутри FIFO)

 

С шумами по VALID-сигналам там сложнее..

Кстати, откуда эти шумы там берутся ?

В теории шумов быть не должно (на практике в лабораторных условиях их нет, что подтверждает теорию). Но я не могу дать гарантию, что передающее устройство, в моем случае источник DVI сигнала (скорость чуть меньше 800 Мб\с), не словит сбой. Может "прилетит" помеха, наведёт гадости на провод - и вот он сбой. Конечно, вероятность этого события крайне мала, поскольку отсутствие сигнала валидности - это всего 4 уникальных 10 битных комбинации - все остальные 10 битные комбинации считаются данными. Но всё-же хочется внести дополнительный механизм защиты от сбоя. Может я и зря себя накручиваю.

Но если верить закону Мёрфи - сбой будет обязательно :smile3046: Весь мой небольшой жизненный опыт говорит о том, что старина Мёрфи был тысячу раз прав !

Изменено пользователем Flip-fl0p

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


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

2 Flip-fl0p

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

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


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

2 Flip-fl0p

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

Так сделал, и работает, просто не нравится. Возникло ощущение неправильности.

Т.е сейчас есть 2 модуля. Первый - это тот, который я здесь выложил, а второй - построенный на FIFO. Оба работают.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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