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

поиск нескольких максимумов в массиве на FPGA

с одним максимумом все вроде понятно: например, n-1 компараторов, если в массиве n элементов, можно конвейерами порезать. а как быть если надо, скажем 3 максимальных значения?

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


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

с одним максимумом все вроде понятно: например, n-1 компараторов, если в массиве n элементов, можно конвейерами порезать. а как быть если надо, скажем 3 максимальных значения?

Ну так и в чем же проблема?

Ставим 3 схемы проверки. Если число больше первого, то оно заменяет первое и проходит на следующее сравнение. Если больше второго, то заменяет второе и проходит на третье сравнение. Итого при последовательном переборе чисел добавляются еще пара тактов для "проталкивания числа "вверх"". При этом я понимаю, что проверки идут по одному числу.

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


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

Ну так и в чем же проблема?

Ставим 3 схемы проверки. Если число больше первого, то оно заменяет первое и проходит на следующее сравнение. Если больше второго, то заменяет второе и проходит на третье сравнение. Итого при последовательном переборе чисел добавляются еще пара тактов для "проталкивания числа "вверх"". При этом я понимаю, что проверки идут по одному числу.

кстати простой, однотактный код такой штуки приводился на этом форуме %) в теме про сортировку по возрастанию/убыванию %)

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


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

ну или в лоб три раза прогнать по одной схеме, просто после нахождения максимума и его номера в массиве сохранять это значение в отдельном регистре, а на его место тупо ставить 0.

Конкретизируйте задачу

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


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

ну или в лоб три раза прогнать по одной схеме, просто после нахождения максимума и его номера в массиве сохранять это значение в отдельном регистре, а на его место тупо ставить 0.

отсортировать по возрастанию, за один проход. и не париться %)

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


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

посмотрел тему, про которую говорил des00, там как я понял примерно то же, что имел в виду iosifk. у меня немного не то (хотя, м.б. я сам себе проблему создал). данные читаются не последовательно, а сразу есть, скажем 32 отсчета (на портах). требуется за минимальное количество тактов (при этом не в ущерб Fmax) найти 3 максимума. перебирать элементы по одному неохота

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


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

посмотрел тему, про которую говорил des00, там как я понял примерно то же, что имел в виду iosifk. у меня немного не то (хотя, м.б. я сам себе проблему создал). данные читаются не последовательно, а сразу есть, скажем 32 отсчета (на портах). требуется за минимальное количество тактов (при этом не в ущерб Fmax) найти 3 максимума. перебирать элементы по одному неохота

 

Написать полную сортирующую схему, взять три старших значения результата и позволить синтезатору самостоятельно выкинуть всё остальное?

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


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

а сразу есть, скажем 32 отсчета (на портах).

Это что же более 200 - 400 пинов одновременно сравнивать? А скажем рассогласование приходов сигналов учитывается?

А еще и CDC???

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


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

Это что же более 200 - 400 пинов одновременно сравнивать? А скажем рассогласование приходов сигналов учитывается?

А еще и CDC???

нет, сигналы все внутри. собственно я немного наврал, последовательное чтение все-таки будет, но скорее всего в несколько потоков одновременно (несколько банков памяти). вот и не хотелось к контроллеру памяти логику наворачивать.

 

2Oldring:вариант с полной сортировкой может и приемлем, но я не знаю алгоритмов, которые хорошо параллелятся. не просветите?

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


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

...перебирать элементы по одному неохота

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

Но, как всегда, правильная постановка задачи - половина ее решения, а задача не ясна...

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


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

нет, сигналы все внутри. собственно я немного наврал, последовательное чтение все-таки будет, но скорее всего в несколько потоков одновременно (несколько банков памяти). вот и не хотелось к контроллеру памяти логику наворачивать.

отсортировать потоки, потом составить массив из 3 результатов для каждого потока и еще раз отсортировать %)

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


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

отсортировать потоки, потом составить массив из 3 результатов для каждого потока и еще раз отсортировать %)

а где гарантия, что все максимумы в одном потоке не окажутся?

ой, сорри, невнимательно прочитал. да, это пойдет )

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


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

В данном варианте смешанное решение будет, где-то потребуется вычислять максимум последовательно, где-то параллельно, кол-во уровней логики можно будет определить эксперементально. Можно вообще же все потоки разделить по 4 и выбрасывать минимальное значение на первых этапах (будут оставаться 3), а потом уже последовательно выбрать максимумы.

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


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

данные читаются не последовательно, а сразу есть, скажем 32 отсчета (на портах). требуется за минимальное количество тактов (при этом не в ущерб Fmax) найти 3 максимума. перебирать элементы по одному неохота

Если пытаться сделать схему, параллельно сравнивающую все отсчеты между собой, никакой ПЛИС не хватит. 32 * 31 = 992 (с самим собой сравнивать не нужно).

Или же разбить схему сравнения на несколько ступеней. Сначала - соседние сравнить (16 сравнений) , потом - те, что остались (8), потом ... (4) (2). И это только для одного результата.

Остается - последовательно:

Имеем 3 регистра. В первый заносим первый отсчет. Если следующий отсчет больше первого, заносим новый, а то, что было, передвигаем во второй. Если следующий отсчет больше второго, заносим его вместо второго, а то, что было, передвигаем в третий. И т.д., и т.п.

p.s. первый расчет - неверный, маху дал. Пополам еще поделить.

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

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


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

Или же разбить схему сравнения на несколько ступеней. Сначала - соседние сравнить (16 сравнений) , потом - те, что остались (8), потом ... (4) (2). И это только для одного результата.

это я и имел в виду в первом посте, такая схема мне нравится, но не знаю как ее расширить на 3 макс.

Остается - последовательно:

Имеем 3 регистра. В первый заносим первый отсчет. Если следующий отсчет больше первого, заносим новый, а то, что было, передвигаем во второй. Если следующий отсчет больше второго, заносим его вместо второго, а то, что было, передвигаем в третий. И т.д., и т.п.

мне не нравится слово "последовательно". 3-5 тактов - идеал

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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