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

Мажоритарный элемент на 10 входов. VHDL

В общем поставили такую задачу:

Есть десять 10 битных слов.

Каждому слову соответствует однобитный сигнал, сообщающий является ли данное слово корректным (data_correct), т.е. если сигнал разрешения равен 1, значит слово корректное и с ним можно работать. Если сигнал равен 0, значит данное слово должно игнорироваться (в сравнении не участвует).

У нас может случиться любая ситуация, т.е. может быть хоть все 10 слов корректными, а может и ни одного.

 

При этом стоит задача при помощи мажоритарной логики ( т.е если хотя бы половина слов совпадают выдать его на выход). Если не совпадают - ничего не выдавать т.е все 10 бит выхода равны 0.

 

Задачу усложняет то, что у нас все это должно выполняться параллельно. Т.е за 1 CLK должен выдаваться результат.

Реализация должна быть на VHDL.

 

Есть какие мысли, как это сделать ? У меня в голове только крутятся огромные конструкции где придется описывать каждое из состояний вручную....

:crying:

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


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

В общем поставили такую задачу:

Есть десять 10 битных слов.

Каждому слову соответствует однобитный сигнал, сообщающий является ли данное слово корректным (data_correct), т.е. если сигнал разрешения равен 1, значит слово корректное и с ним можно работать. Если сигнал равен 0, значит данное слово должно игнорироваться (в сравнении не участвует).

У нас может случиться любая ситуация, т.е. может быть хоть все 10 слов корректными, а может и ни одного.

 

При этом стоит задача при помощи мажоритарной логики ( т.е если хотя бы половина слов совпадают выдать его на выход). Если не совпадают - ничего не выдавать т.е все 10 бит выхода равны 0.

 

Задачу усложняет то, что у нас все это должно выполняться параллельно. Т.е за 1 CLK должен выдаваться результат.

Реализация должна быть на VHDL.

 

Есть какие мысли, как это сделать ? У меня в голове только крутятся огромные конструкции где придется описывать каждое из состояний вручную....

:crying:

Обычно для мажоритара требуется нечетное число "данных": битоов или слов. И при этом определяется "граница". Например 2 из 3-х... А у Вас 10 слов... И если половина битов будет 0, а другая - 1, то что из них правильно?

А если говорить более точно, то у Вас 10 слов по 11 битов, учитывая контрольный бит, но как из них выделить правильное значение, если 5 слов будут иметь 0, а другие 5 слов - 1?

Проверять по "контрольному биту" - тоже бессмысленно, т.к. он может искажаться так же, как и бит "данных"...

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


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

Приветствую!

 

Есть какие мысли, как это сделать ? У меня в голове только крутятся огромные конструкции где придется описывать каждое из состояний вручную....

:crying:

Если не хочется самому рабо... "описывать каждое из состояний" заставь это делать дугих... циклы :)

 

Пару циклов для сравнения каждого с каждым - cmp[k]= din_vld[k] && din[k]==din

а затем функция подсчета количества 1 в cmp[k] и сравнения с порогом мажритарности.

 

Успехов! Rob.

 

 

 

 

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


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

Обычно для мажоритара требуется нечетное число "данных": битоов или слов. И при этом определяется "граница". Например 2 из 3-х... А у Вас 10 слов... И если половина битов будет 0, а другая - 1, то что из них правильно?

А если говорить более точно, то у Вас 10 слов по 11 битов, учитывая контрольный бит, но как из них выделить правильное значение, если 5 слов будут иметь 0, а другие 5 слов - 1?

Проверять по "контрольному биту" - тоже бессмысленно, т.к. он может искажаться так же, как и бит "данных"...

В контексте задачи достаточно и половины битов. Если хотя бы 50% битов совпали тогда эти данные на выход.

 

Если не хочется самому рабо... "описывать каждое из состояний" заставь это делать дугих... циклы sm.gif

 

Пару циклов для сравнения каждого с каждым - cmp[k]= din_vld[k] && din[k]==din

а затем функция подсчета количества 1 в cmp[k] и сравнения с порогом мажритарности.

 

Успехов! Rob.

Спасибо ! Попробую это реализовать на VHDL. Правда что-то я не очень пока представляю как это на VHDL делать...
Изменено пользователем Flip-fl0p

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


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

В контексте задачи достаточно и половины битов. Если хотя бы 50% битов совпали тогда эти данные на выход.

И получите ситуацию, когда половина слов равна 0, другая - 1... И что из них надо выбирать?

И еще к вопросу "за 1 CLK должен выдаваться результат"...

Либо берем синхрочастоту в 11 раз выше CLK, 10 сдвиговых регистров и 1-битный мажоритар на 10 входов...

Либо гигантский мультиплексор... Причем мне кажется, что по-битовое мажоритирование 10 слов не подойдет...

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


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

И получите ситуацию, когда половина слов равна 0, другая - 1... И что из них надо выбирать?

И еще к вопросу "за 1 CLK должен выдаваться результат"...

Либо берем синхрочастоту в 11 раз выше CLK, 10 сдвиговых регистров и 1-битный мажоритар на 10 входов...

Либо гигантский мультиплексор... Причем мне кажется, что по-битовое мажоритирование 10 слов не подойдет.

 

Ещё раз говорю, в контексте задачи достаточно и 50% совпадения. Если 50% слов и более совпали значит эти данные истинные. Данные все поступают параллельно. Мне лучше наводку дайте по алгоритму реализации данной задачи.

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


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

Ещё раз говорю, в контексте задачи достаточно и 50% совпадения. Если 50% слов и более совпали значит эти данные истинные. Данные все поступают параллельно. Мне лучше наводку дайте по алгоритму реализации данной задачи.

Вот разговор слепого с глухим...

Представьте 5 слов "00000..0" и 5 слов "11111..1" и контрольные биты у них исправны. Что выберете? Нули или единицы??? Слово "достаточно и 50% совпадения" комбинационная логика не понимает...

Мне кажется, что сама задача поставлена неправильно. 1 контрольный бит - это скорее всего нечетность... Откуда берутся 10 слов одновременно?

И "за 1 CLK должен выдаваться результат" - проблематично...

Кстати, " 1 CLK" - какая частота?

 

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


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

Ещё раз говорю, в контексте задачи достаточно и 50% совпадения. Если 50% слов и более совпали значит эти данные истинные. Данные все поступают параллельно. Мне лучше наводку дайте по алгоритму реализации данной задачи.

Да, задача немного некорректно описана.

А что касается сравнения каждого с каждым, то, очевидно, надо сравнивать каждый с нижними.

Все ж в два раза экономия ;)

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


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

Вот разговор слепого с глухим...

Представьте 5 слов "00000..0" и 5 слов "11111..1" и контрольные биты у них исправны. Что выберете? Нули или единицы??? Слово "достаточно и 50% совпадения" комбинационная логика не понимает...

Мне кажется, что сама задача поставлена неправильно. 1 контрольный бит - это скорее всего нечетность... Откуда берутся 10 слов одновременно?

И "за 1 CLK должен выдаваться результат" - проблематично...

Кстати, " 1 CLK" - какая частота?

Блин туплю жёстко :cranky: . Сообразил про что Вы говорите.

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

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


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

Блин туплю жёстко :cranky: . Сообразил про что Вы говорите.

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

Перед сном...

У меня на сайте есть "Записки Инженера"... И там одна из глав называется "Про мажоритар"...

Удачи!

 

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


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

Как и обещал, сейчас попытаюсь максимально подробно описать поставленную задачу:

Необходимо разработать приёмник (receiver) DVI сигнала, для того чтобы была возможность работы с этим сигналом. Т.е можно было записать его в буфер, перекодировать, подключить LVDS матрицу. и.т.п.

Разработать необходимо на ПЛИС. (Я в курсе про готовые решения, например микросхема TFP403 фирмы Texas Instruments, но нужно именно на ПЛИС)

ПЛИС должна быть фирмы Altera.

 

В первую очередь я начал искать готовые решения задачи: IP Core (альтеровские), так же искал на сайте http://opencores.org//. Результат печальный, ничего толкового не найдено. Поэтому было принято решение изучать спецификацию на стандарт DVI, и самому реализовать приёмник.

В результате изучения спецификации выводы я сделал неутешительные: сигнал DVI приходит как угодно: дрожание фаз сигнала (0,5 Tbit), их перекос и рассинхронизация сигнала приводит к тому, что приёмник помимо раскодирования сигнала, должен ещё и восстановить его. Поэтому далее я не буду затрагивать тему кодирования DVI, поскольку проблем с этим нет, в стандарте есть вся необходимая информация, да и в сети есть готовые решения кодировщиков.

 

Немного поподробнее про сигнал DVI:

 

Есть 4 дифференциалььные пары. По одной паре передается сигнал синхронизации ( T_pixel ещё его называют Pixel_clock) по остальным парам передаются данные о цвете пикселя. За время 1 T_pixel должно передаваться 10 бит данных о цвете(8 бит данные о цвет, 2 бита данные для раскодирования, так называемое 8bit/10bit кодирование, или его называют T.M.D.S). Итого 30 бит данных с 3 диф. пар (24 бита полезной информации и 6 бит для восстановления данных. Периоды передачи данных о цвете пикселя чередуются с периодами передачи служебной информации. За время передачи служебной информации по каждой паре передаётся как минимум 128 одинаковых служебных слов идущих подряд (DVI спецификация стр.32, таблица и рисунок). Вот примерная картинка идеального сигнала DVI.

6e0961b85e69.png

Далее я буду рассматривать только одну диф. пару информации, поскольку для других пар всё будет аналогично.

Итак, DVI сигнал должен иметь 3 пары с данными, и четвертую пару по которой предается частота синхронизации - T_pixel. На основании частоты T_pixel необходимо формировать частоту T_bit в 10 раз чаще чем частота T_pixel для возможности преобразования последовательно идущих данных в параллельный 10 битный код.

 

Основная проблема состоит в том что:

1. При приёме сигнала мы не знаем где у нас идут данные о цвете пикселя, а где идут служебные данные.

d1063241dda9.png

2. Допустимое расхождение фаз сигнхросигнала и данных о цвете у нас составляет 0,6•T_pixel (страница 38 стандарта DVI). Т.е фактически синхросисигнал T_pixel никак не привязан к последовательному потоку данных о цвете пикселя.

e052e7dff17b.png

3. Так-же необходимо учитывать, что существует так называемый jitter - дрожание фаз сигнала, и по стандарту он будет почти 0,5 T_bit (DVI спецификация стр.39 таблица 4-9)

38851699cc59.png

И самое печальное, то что алгоритм восстановления фаз синхросигнала и данных не рассматривается в спецификации DVI...

"The methods of clock generation for data recovery are implementation specific and beyond the scope of this document." - Методы генерации сигнала для восстановления данных - определенное внедрение (не совсем понял эту фразу) и не рассматривается в этой спецификации. Но смысл общий тут уловить можно: фиг вам, а не алгоритм.

 

Итого что мы имеем:

1. Мы имеем поток данных с дрожанием фазы.

2. Мы имеем синхросигнал, не стробирующий поток данных.

3. Но так-же мы имеем гарантированный спецификацией поток из 128 одинаковых слов для определения начала периода передачи служебной информации. ( DVI спецификация стр.32, таблица и рисунок).

 

Порывшись на просторах всемирной помойки я практически не нашёл информации об алгоритмах восстановления потока DVI данных. Единственная адекватная информация по алгоритму восстановления любезно выложена в сеть товарищами из "Миландра" (https://www.google.ru/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwi_pOKMi47OAhXEGCwKHUqRBygQFggdMAA&url=http%3A%2F%2Fwww.milandr.ru%2Fuploads%2Fdoc_img%2Fother%2Fpublications%2F2015.3_(N3)_Reshenia_dlya_visokoskorostnih_interfeisov_LVDS_i_DVI_EK.pdf&usg=AFQjCNG9QB6kK7BaVjeVNac1_f1E07c-2g&sig2=Iip9t3Q_QObeKAH2Pn32Qg&cad=rja)

В принципе я что-то подобное и думал реализовать.

Итак, как я понял суть алгоритма:

1. Создается 10 частот T_bit сдвинутых друг относительно друга на П/5.

2. Далее по каждой из частот мы начинаем принимать данные.

3. От каждой частоты T_bit данные мы их грубо говоря принимаем 10 раз со сдвигом в 1 T_bit и в итоге получем 100 бит для анализа. В этом случае как минимум одно из 10 принятых слов будет являться истинным.

d8918778c4bf.png

 

4. Когда найдено зарезервированное слово, тогда мы запускаем счетчик, считающий, сколько таких одинаковых слов идет подрят.

5. Как только счётчик насчитал 128 слов - выставляется флаг о том, что данная последовательность является истинной.

1bd55d1e0dda.png

 

6. Аналогично поступаем с остальными 9 фазами сигнала.

Таким образом у нас будут найдено несколько частот T_bit, образующиих интервал который будет точно стробировать истинные данные.

cd2cf2486f4e.png

 

bda220b749b8.png

 

Далее в алгоритме говорится что, истиные данные - это середина удачного интервала. Лично я считаю, что более правильно истинные данные проверять большинством. Т.е истинные данные - это те данные которых большинство. Поэтому я и хочу реализовать мажоритарный элемент, который на выход выдает из большинства выходных данных.

post-77140-1469437052_thumb.png

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

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


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

Приветствую!

 

 

А вот оно что! Но Вы не правильно бутерброд едите! Тут такой мажоритарный морж нафиг не нужен

 

Вам надо смотреть на прием сериальных данных с подстройкой задержки/фазы для каждой линии, а потом уж синхронизация слов. Стандартный способ разжеванный в куче аппнот.

 

Ели кратко то сначала для каждой линии находим положение фронтов битового интервала относительно тактовой (10х пиксельной) двигая автоматом IOdelay на входной ножке, а затем ставим задержку в середину найденного битового интервала. Затем выравниваем слово сравнивая с требуемым паттерном и "сдвигая/задерживая" биты (BitSlip). Все это обычно делается сразу при де-сериализации. Такая калибровка/подстройка фазы приема бит может делается один/раз а начале, по запросу или непрерывно в процессе работы.

 

Так что ищите апноты для Вашего семейства FPGA.

 

 

Успехов! Rob.

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


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

Приветствую!

 

 

А вот оно что! Но Вы не правильно бутерброд едите! Тут такой мажоритарный морж нафиг не нужен

 

Вам надо смотреть на прием сериальных данных с подстройкой задержки/фазы для каждой линии, а потом уж синхронизация слов. Стандартный способ разжеванный в куче аппнот.

 

Ели кратко то сначала для каждой линии находим положение фронтов битового интервала относительно тактовой (10х пиксельной) двигая автоматом IOdelay на входной ножке, а затем ставим задержку в середину найденного битового интервала. Затем выравниваем слово сравнивая с требуемым паттерном и "сдвигая/задерживая" биты (BitSlip). Все это обычно делается сразу при де-сериализации.

 

Так что ищите апноты для Вашего семейства FPGA.

 

 

Успехов! Rob.

А можно чутка поподробнее. И ссылку на любой из аппнотов. Что-то не нагуглилось....

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


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

Приветствую!

 

У Вас не только бутерброд но Google неправильный :)

 

Вот ,быстро только для Xilinx - я с Altera давно не работал. Но принципы теже.

http://www.xilinx.com/support/documentatio...tes/xapp460.pdf

По аналогии можно много похожего найти (в правильном Google ;) )

 

Успехов! Rob.

 

P.S. Извиняйте ссылка копировалась криво - ищите http://www.xilinx.com/support/documentatio...es/xapp1064.pdf

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


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

Приветствую!

 

У Вас не только бутерброд но Google неправильный :)

 

Вот ,быстро только для Xilinx - я с Altera давно не работал. Но принципы теже.

http://www.xilinx.com/support/documentatio...tes/xapp460.pdf

По аналогии можно много похожего найти (в правильном Google ;) )

 

Успехов! Rob.

 

P.S. Извиняйте ссылка копировалась криво - ищите http://www.xilinx.com/support/documentatio...es/xapp1064.pdf

Спасибо ! Буду курить мануал. А если несложно, можете покритиковать мой подход. В чём его минусы ?

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


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

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

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

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

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

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

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

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

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

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