|
Сериализация большого количества параллельных данных., Как правильно сделать? |
|
|
|
Mar 28 2013, 11:36
|
Местный
  
Группа: Свой
Сообщений: 310
Регистрация: 28-01-13
Из: Лондон
Пользователь №: 75 384

|
Есть несколько тысяч однобитных сигналов. В каждом цикле любое их количество может быть активным. Надо последовательно перебрать все входы, и при "1" на входе, на выходе надо подать номер входящего сигнала и строб DATARDY. И так пока все активные сигналы не будут переданы. После чего выставляем строб готовности, защелкиваем новое состояние входов и повторяем процесс. Такой себе демультиплексер, только с поддержкой множественных активных сигналов. Ситуация осложняется тем, что в среднем активных сигналов будет меньше 10% от общего количества. Поэтому было бы хорошо сократить число циклов, необходимых для просмотра всех входов. Мои идеи:
- Машиной состояний пройтись в цикле по всем входам. Никакой оптимизации, количество циклов всегда постоянно и не зависит от входов.
- при помощи конструктива for i in 0 to n_inputs loop пройтись только по активным входам. К сожалению, я сомневаюсь что на несколько тысяч входных сигналов цикл сгенерирует хороший дизайн.
- При помощи OR построить что-то типа бинарного дерева поиска, перебирая только активные ветви. Ускорение перебора увеличением сложности. К тому же хорошо будет работать только на сгруппированых сигналах, имея "010101010" на входах никакого ускорения не получится.
- Спросить опытных людей, как бы они решили такую проблему. Цель синтеза Spartan 6.
|
|
|
|
|
Mar 28 2013, 11:54
|
Частый гость
 
Группа: Свой
Сообщений: 150
Регистрация: 9-12-12
Из: Саранск
Пользователь №: 74 770

|
Как вариант комбинация первого и второго. Сгруппировать в группы по 16 сигналов, и добавить параллельно дерево поиска. Если ни хотя б один сигнал в группе активен, его передать, если в группе все неактивные не передавать. Далее сгруппировать по ОR группы, тогда можно отсекать по 4,8, 16 групп сразу. Самый тяжелый случай будет когда будет активен каждый 16 сигнал по всему дизайну, придется передать все. Плата за это, всегда разная длина цикла, плюс накладные расходы, чтобы разобраться с адресами активных битов.
|
|
|
|
|
Mar 28 2013, 14:32
|

я только учусь...
     
Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839

|
может это поможет.... - возможное решение коммутации... у Xilinx тоже есть аналогичные appnotes Цитата(count_enable @ Mar 28 2013, 13:36)  Такой себе демультиплексер, только с поддержкой множественных активных сигналов. - Спросить опытных людей, как бы они решили такую проблему. Цель синтеза Spartan 6. Еще подумайте насчет использования CPLD там архитектура более подходящая для задачи... (мое мнение)
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Mar 28 2013, 15:49
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 2-01-09
Пользователь №: 42 888

|
Входные данные загружаются в регистр. Затем, пока не будут обработаны все сигналы, производится сдвиг и увеличение на 1 счетчика. При появлении на выходе регистра «1», выдаем значение счетчика в качестве искомого номера.
|
|
|
|
|
Mar 28 2013, 20:27
|
Местный
  
Группа: Свой
Сообщений: 310
Регистрация: 28-01-13
Из: Лондон
Пользователь №: 75 384

|
Цитата(kreakozeablik @ Mar 28 2013, 18:49)  Входные данные загружаются в регистр. Затем, пока не будут обработаны все сигналы, производится сдвиг и увеличение на 1 счетчика. При появлении на выходе регистра «1», выдаем значение счетчика в качестве искомого номера. Так это именно мой первый вариант. Он очевиден, но неэкономичен - даже при самых нулях на входах, генерация выхода будет занимать столько же циклов, сколько сами 1.
|
|
|
|
|
Mar 29 2013, 11:32
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(count_enable @ Mar 29 2013, 15:09)  Не совсем понял, как здесь можно использовать САМ. В САМ записываются биты. Если в САМ не 0, то читается адрес ненулевой строки. Аналогично работают поисковые таблицы в свитчах.
--------------------
www.iosifk.narod.ru
|
|
|
|
|
Mar 29 2013, 12:04
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(count_enable @ Mar 29 2013, 15:09)  "Медленный клок" это 1/100 сек, быстрый - как позволит дизайн и плисина. При таком отношении частот вполне можно не заморачиваться и сделать как вы и описали в 1м посте, например с помощью длинного сдвигового регистра (как советовал kreakozeablik) Цитата Работа исследовательская, так что нету строгих рамок, но производительность важна. Производительность чего? Между 2мя 'медленными' клоками вы выкачаете все данные, а потом можете их обрабатывать хоть на 100MHz на отсчет Вы лучше озаботьтесь как будете заводить в плисину 'несколько тысяч сигналов'. У нее банально не хватит ног
|
|
|
|
|
Apr 8 2013, 19:21
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 3-06-08
Пользователь №: 38 035

|
Если есть, допустим, 100 тактов, разбиваем весь входной набор на группы по 100 бит. Для каждой группы создаем сдвиговый регистр, счетчик и фифо. На каждом из 100 тактов: если крайний бит == 1, заносим значение счетчика в фифо. увеличиваем счетчик, сдвигаем регистр на 1 бит.
Остается только слить все фифо вместе...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|