реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Inter channel skew, Модуль выравнивания данных в разных каналах данных.
Flip-fl0p
сообщение Aug 24 2017, 07:18
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 423
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



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


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


Был бы очень признателен, если бы подсказали правильные способы реализации данного модуля, или подсказали на какой-нибудь Application note, где рассказывается как его реализовать.
Данные идут сплошным потоком, поэтому время работы модуля особой роли не играет.
Go to the top of the page
 
+Quote Post
Inanity
сообщение Aug 24 2017, 08:15
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 182
Регистрация: 6-07-12
Пользователь №: 72 653



Пожалуйста.

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

Сообщение отредактировал Inanity - Aug 24 2017, 08:18
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Aug 24 2017, 08:28
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 423
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



Цитата(Inanity @ Aug 24 2017, 11:15) *
Пожалуйста.

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

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

Сообщение отредактировал Flip-fl0p - Aug 24 2017, 08:31
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Aug 24 2017, 13:07
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 423
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



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

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

Прикрепленные файлы
Прикрепленный файл  CHANNEL_DESKEW.7z ( 4.36 килобайт ) Кол-во скачиваний: 20
 
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Aug 24 2017, 15:03
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 242
Регистрация: 13-02-07
Из: 49°25′58″ 11°53′5″
Пользователь №: 25 329



2 Flip-fl0p
в общем случае, ваша задача решается через FIFO, которые пишутся по вашим VALID-сигналам, вычитываются по нужному наполнению (на сколько я понял, в вашем случае EF==0 для всех 3х FIFO) + нужно сделать сброс FIFO после того как вы вычитали условную "линию", чтобы ошибка разбега данных не накапливалась в процессе работы. Это без шума по VALID-сигналам..
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Aug 24 2017, 15:56
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 423
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



Цитата(Kuzmi4 @ Aug 24 2017, 18:03) *
2 Flip-fl0p
в общем случае, ваша задача решается через FIFO, которые пишутся по вашим VALID-сигналам, вычитываются по нужному наполнению (на сколько я понял, в вашем случае EF==0 для всех 3х FIFO) + нужно сделать сброс FIFO после того как вы вычитали условную "линию", чтобы ошибка разбега данных не накапливалась в процессе работы. Это без шума по VALID-сигналам..

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

Сообщение отредактировал Flip-fl0p - Aug 24 2017, 15:57
Go to the top of the page
 
+Quote Post
dm.pogrebnoy
сообщение Aug 24 2017, 16:21
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 717
Регистрация: 11-04-07
Пользователь №: 26 933



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


--------------------
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Aug 24 2017, 19:15
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 242
Регистрация: 13-02-07
Из: 49°25′58″ 11°53′5″
Пользователь №: 25 329



Цитата(Flip-fl0p @ Aug 24 2017, 18:56) *
А что за условие EF==0 ?

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

С шумами по VALID-сигналам там сложнее..
Кстати, откуда эти шумы там берутся ?
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Aug 24 2017, 19:54
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 423
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



Цитата(Kuzmi4 @ Aug 24 2017, 22:15) *
да, FIFO Empty Flag == 0 (есть данные внутри FIFO)

С шумами по VALID-сигналам там сложнее..
Кстати, откуда эти шумы там берутся ?

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

Сообщение отредактировал Flip-fl0p - Aug 24 2017, 19:55
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Aug 28 2017, 14:11
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 242
Регистрация: 13-02-07
Из: 49°25′58″ 11°53′5″
Пользователь №: 25 329



2 Flip-fl0p
Сделайте сначала без подавителя шума, чтобы работало на столе. А потом определяйтесь с шумами и делайте нужную дополнительную логику если решите что она нужна в вашем устройстве.
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Aug 30 2017, 06:47
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 423
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



Цитата(Kuzmi4 @ Aug 28 2017, 17:11) *
2 Flip-fl0p
Сделайте сначала без подавителя шума, чтобы работало на столе. А потом определяйтесь с шумами и делайте нужную дополнительную логику если решите что она нужна в вашем устройстве.

Так сделал, и работает, просто не нравится. Возникло ощущение неправильности.
Т.е сейчас есть 2 модуля. Первый - это тот, который я здесь выложил, а второй - построенный на FIFO. Оба работают.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st November 2017 - 15:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01321 секунд с 7
ELECTRONIX ©2004-2016