Flip-fl0p 4 24 августа, 2017 Опубликовано 24 августа, 2017 · Жалоба Приветствую уважаемые посетители форума. И снова требуется ваша помощь. Заранее говорю, задачу я решил, и модуль выполняет свой функционал. Но меня не покидает чувство, что моя реализация очень далека от правильной, и я упустил какой-то важный момент, который позволил бы реализовать всё гораздо проще... Итак суть задачи: Имеем 3 шины с которых мы получаем данные. Данные мы приняли, синхронизировали с нашим клоковым доменом и в итоге получили 3 линии данных: DATA_BUS_N0, DATA_BUS_N1, DATA_BUS_N2. Данные синхронны частоте DATA_CLK. Каждую линию данных сопровождает сигнал валидности. Когда он равен лог.1 данные активны, когда он равен лог.0 активны тестовые данные. При приёме оказалось, что физически шины не выровнены, и данные в каждой шине поступают с задержкой друг относительно друга. И появляется так называемый inter channel skew. Максимальное расхождение данных между 2 шинами может составлять 1 период частоты DATA_CLK. Думаю тут будет уместна такая вот картинка: Требуется разработать модуль, который бы выравнивал данные относительно друг друга, в итоге данные после модуля должны выглядеть так: Был бы очень признателен, если бы подсказали правильные способы реализации данного модуля, или подсказали на какой-нибудь Application note, где рассказывается как его реализовать. Данные идут сплошным потоком, поэтому время работы модуля особой роли не играет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Inanity 1 24 августа, 2017 Опубликовано 24 августа, 2017 (изменено) · Жалоба Пожалуйста. Берём 3 FIFO. Каждую шину заводим в своё FIFO. Начинаем чтение из всех трёх FIFO только тогда, когда в каждом есть хотя бы по одному слову (конъюнкция стробов валидности). Глубина FIFO естественно должна быть больше максимального разброса между шинами. Но раз это максимум 1 период то вообще хорошо. Можно даже FIFO сделать на логике, чтобы блочную память впустую не тратить, т.к. тут единый клоковый домен, да и глубина FIFO малая. Причем данный способ удобен в том, что не нужно заранее знать какая шина от какой отстаёт. Должно получиться очень компактно и просто. Изменено 24 августа, 2017 пользователем Inanity Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 24 августа, 2017 Опубликовано 24 августа, 2017 (изменено) · Жалоба Пожалуйста. Берём 3 FIFO. Каждую шину заводим в своё FIFO. Начинаем чтение из всех трёх FIFO только тогда, когда в каждом есть хотя бы по одному слову (конъюнкция стробов валидности). Глубина FIFO естественно должна быть больше максимального разброса между шинами. Но раз это максимум 1 период то вообще хорошо. Можно даже FIFO сделать на логике, чтобы блочную память впустую не тратить, т.к. тут единый клоковый домен, да и глубина FIFO малая. Причем данный способ удобен в том, что не нужно заранее знать какая шина от какой отстаёт. Должно получиться очень компактно и просто. Делал я такой вариант, не устроил из-за того, что данные передаются как во время стробов валидности, так и во время их отсутствия. Просто предназначение данных разное. Я делал так: по стробам валидности я писал данные в 3 разных FIFO(в точности как вы и говорили) и потом их считывал... А во время отсутствия строба валидности я их писал в другие FIFO... Такая реализация вполне возможная, но как мне показалось уже очень мудреная и сложная. Ещё я там добавил фильтр стробов валидности для того, чтобы если вдруг произошло искажение принимаемых данных, и к примеру строб валидности на 1 такт стал равен нулю, не сбивалась запись в FIFO, иначе из-за ошибок приёма можно получить ещё большее расхождение фаз... Поскольку данные являются видео потоком, искажения данных не влияют ни на что. Изменено 24 августа, 2017 пользователем Flip-fl0p Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 24 августа, 2017 Опубликовано 24 августа, 2017 · Жалоба Делал я такой вариант, не устроил из-за того, что данные передаются как во время стробов валидности, так и во время их отсутствия. Просто предназначение данных разное. Я делал так: по стробам валидности я писал данные в 3 разных FIFO(в точности как вы и говорили) и потом их считывал... А во время отсутствия строба валидности я их писал в другие FIFO... Такая реализация вполне возможная, но как мне показалось уже очень мудреная и сложная. Ещё я там добавил фильтр стробов валидности для того, чтобы если вдруг произошло искажение принимаемых данных, и к примеру строб валидности на 1 такт стал равен нулю, не сбивалась запись в FIFO, иначе из-за ошибок приёма можно получить ещё большее расхождение фаз... Поскольку данные являются видео потоком, искажения данных не влияют ни на что. UPD. Вот такое "творение" получилось у меня. Если честно не очень нравится CHANNEL_DESKEW.7z Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 24 августа, 2017 Опубликовано 24 августа, 2017 · Жалоба 2 Flip-fl0p в общем случае, ваша задача решается через FIFO, которые пишутся по вашим VALID-сигналам, вычитываются по нужному наполнению (на сколько я понял, в вашем случае EF==0 для всех 3х FIFO) + нужно сделать сброс FIFO после того как вы вычитали условную "линию", чтобы ошибка разбега данных не накапливалась в процессе работы. Это без шума по VALID-сигналам.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 24 августа, 2017 Опубликовано 24 августа, 2017 (изменено) · Жалоба 2 Flip-fl0p в общем случае, ваша задача решается через FIFO, которые пишутся по вашим VALID-сигналам, вычитываются по нужному наполнению (на сколько я понял, в вашем случае EF==0 для всех 3х FIFO) + нужно сделать сброс FIFO после того как вы вычитали условную "линию", чтобы ошибка разбега данных не накапливалась в процессе работы. Это без шума по VALID-сигналам.. Я вот и боюсь шума по VALID сигналам. Поэтому применяю простейший мажоритарный фильтр на 5 разрядов. Соответственно если идет 2 ошибки подряд фильтр их прекрасно убирает. Но вот на время фильтрации шума, я должен на это же время задержать данные(искажения в данных не критичны). И появляется проблема, что слишком много всякой "обвязки" для FIFO надо применять. Т.е вся дополнительная "обвязка" занимает столько же места, сколько и мой модуль, который я выложил здесь. Мне не жалко регистров. Просто схема выглядит как-то некрасиво и громоздко. Хотя работает, проверял на реально железке. А что за условие EF==0 ? Случаем не сигнал Empty FIFO ? Изменено 24 августа, 2017 пользователем Flip-fl0p Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dimidrol 0 24 августа, 2017 Опубликовано 24 августа, 2017 · Жалоба FIFO заменить на сдвиговые регистры с мультиплексорами (у Xilinx это SRL называется) и приделать логику управления адресами в разных каналах для выравнивания данных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 24 августа, 2017 Опубликовано 24 августа, 2017 · Жалоба А что за условие EF==0 ? да, FIFO Empty Flag == 0 (есть данные внутри FIFO) С шумами по VALID-сигналам там сложнее.. Кстати, откуда эти шумы там берутся ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 24 августа, 2017 Опубликовано 24 августа, 2017 (изменено) · Жалоба да, FIFO Empty Flag == 0 (есть данные внутри FIFO) С шумами по VALID-сигналам там сложнее.. Кстати, откуда эти шумы там берутся ? В теории шумов быть не должно (на практике в лабораторных условиях их нет, что подтверждает теорию). Но я не могу дать гарантию, что передающее устройство, в моем случае источник DVI сигнала (скорость чуть меньше 800 Мб\с), не словит сбой. Может "прилетит" помеха, наведёт гадости на провод - и вот он сбой. Конечно, вероятность этого события крайне мала, поскольку отсутствие сигнала валидности - это всего 4 уникальных 10 битных комбинации - все остальные 10 битные комбинации считаются данными. Но всё-же хочется внести дополнительный механизм защиты от сбоя. Может я и зря себя накручиваю. Но если верить закону Мёрфи - сбой будет обязательно :smile3046: Весь мой небольшой жизненный опыт говорит о том, что старина Мёрфи был тысячу раз прав ! Изменено 24 августа, 2017 пользователем Flip-fl0p Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 28 августа, 2017 Опубликовано 28 августа, 2017 · Жалоба 2 Flip-fl0p Сделайте сначала без подавителя шума, чтобы работало на столе. А потом определяйтесь с шумами и делайте нужную дополнительную логику если решите что она нужна в вашем устройстве. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 30 августа, 2017 Опубликовано 30 августа, 2017 · Жалоба 2 Flip-fl0p Сделайте сначала без подавителя шума, чтобы работало на столе. А потом определяйтесь с шумами и делайте нужную дополнительную логику если решите что она нужна в вашем устройстве. Так сделал, и работает, просто не нравится. Возникло ощущение неправильности. Т.е сейчас есть 2 модуля. Первый - это тот, который я здесь выложил, а второй - построенный на FIFO. Оба работают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться