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

Аппаратная интерполяция за такт

Всем доброго дня!

Есть у меня задачка, но не нравится мне решение, которое я придумал.

Задача - полученное значение распределить по 3м осям пропорционально дробной части каждой из координат. Вычисленное значение должно накапливаться в узлах координатной сетки. В итоге все сводится к тому, что надо прочитать, добавить к прочитанному значению вычисленное число и записать обратно в память 8 значений. Если предполагать, что порядок расположения элементов в памяти - по X, Y, Z, то надо вытащить (а потом записать) элементы из памяти со следующими индексами:

X

X+1

4*Y+X

4*Y+X+1

4*4*Z+4*Y+X

4*4*Z+4*Y+X+1

Все это надо сделать за такт, можно с использованием конвейера.

Элементов всего 4*4*8 шт., каждый элемент 16 бит. Итого для хранения всего этого добра необходимо 4*4*8*16 = 2кбит.

В идеале здесь бы пригодилась восьмипортовая память, но таковой нет, есть только двухпортовая. И на ultrascale+, где все реализовывается, она минимум 18кбит.

Решение которое мне пришло в голову, это поставить 4 двухпортовых памяти, дублировать в них значения при записи. Параллельно вытаскивать 8 значений, делать сумму и записывать. Но тут я потрачу уже 18к*4 = 72кбит вместо 2х.

Можно конечно на регистрах, но логики многовато сожрет. Как вариант можно было бы сделать 8*16 = 128 бит память, но данные там со смещением меньше 8 не вытащишь, только слова целиком. 

Может у кого идея будет как лучше сделать?

 

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


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

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

Если вы пишете по одному числу, а читать надо 8 для вычислений, то что мешает на распределенной памяти собрать нужную вам конфигурацию? в слайсе там можно поставить память в режим 1 порт записи 4 порта чтения на 16 вхождений ну и т.д.

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


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

6 часов назад, des00 сказал:

если у вам нужно одновременно писать и читать по 8 чисел в разнобой, то как вам поможет двухпортовка? точнее, как вы планируете дублировать запись за такт?

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

Кстати, да, Вы правы. дублировать то не получится разные адреса во все памяти сразу. Двухпортовка (точнее, 8-ми портовка) решила бы проблему. Записываем через порт записи, и на всех портах чтения данные доступны. Но и тут засада. Если за один такт и конвейером, то получается надо одновременно читать по одним адресам 8 чисел и в этом же такте записывать по другим 8 других чисел.

Цитата

в слайсе там можно поставить память в режим 1 порт записи 4 порта чтения на 16 вхождений ну и т.д.

Ни разу этим не пользовался, посмотрю, спасибо. Это у ксайлинкса?
Но похоже все-таки на логике придется делать. Но тогда ведь наверно синтезатор мультиплексоров понаставит, если мне нужно индексировать (выбирать)по сути произвольно 8 из 128 чисел. Скорость просядет...

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


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

1 hour ago, alexPec said:

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

Кстати, да, Вы правы. дублировать то не получится разные адреса во все памяти сразу. Двухпортовка (точнее, 8-ми портовка) решила бы проблему. Записываем через порт записи, и на всех портах чтения данные доступны. Но и тут засада. Если за один такт и конвейером, то получается надо одновременно читать по одним адресам 8 чисел и в этом же такте записывать по другим 8 других чисел.

Да, как раз в этом и проблема) 

1 hour ago, alexPec said:

Ни разу этим не пользовался, посмотрю, спасибо. Это у ксайлинкса?

Да, в SLICEM есть хитрые включения LUT в режиме памяти, там можно делать разные конфигурации

1 hour ago, alexPec said:


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

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

Не знаю точно вашей организации вычислений, но если X/Y/Z это числа то у вас есть как минимум четные и нечетные адреса, разбиваем память на два блока, ставим крос-мультиплексор по адресу и данным и пишем данные по четному/нечетному адресу в разные блочки памяти, но одновременно. Чтение аналогично. Подобное я делал в турбодекодерах, когда надо гулять по решетке. Можно масштабировать систему на 4/8, но из ваших формул адреса четко не видно что там все адреса будут попадать в разные блочки памяти (например, при Y = 0, адреса X+1/4*Y+X+1 совпадут)

Опять же зависит от вашей тактовой частоты, может быть задрать тактовую частоту?

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


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

Так, попробую более обще описать задачу. Есть 128 ячеек памяти, по 16 бит элемент. Каждый такт на вход подается 8 чисел и 8 адресов (для каждого числа). Адрес означает позицию в массиве 128ми ячеек. Надо к числам по этим адресам добавить соответствующие входные числа. Т.е. такой "интегратор", 8 чисел добавляются за такт к числам по указанным адресам.

А частота итак уже на грани, у меня остальная часть проекта работает на 200МГц. Вряд ли тут задерешь... Слэки минимальные тайминг анализер показывает 0,6нс.

Ну и допущение - на входе два одинаковых адреса не появляется

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


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

1 hour ago, alexPec said:

Ну и допущение - на входе два одинаковых адреса не появляется

в любом случае по вашему алгоритму нужно за такт 8 чтений и 8 записей по произвольным адресам из одного массива.  А это проще всего можно сделать только на регистрах.   

Причем проблема именно во множественной записи.  В  инете видел  статьи  о схемах создания  мулти-портовой  памяти,  причем как на чтение так и на запись,  поищите  может что и подойдет    

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


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

11 hours ago, alexPec said:

В идеале здесь бы пригодилась восьмипортовая память, но таковой нет, есть только двухпортовая. И на ultrascale+, где все реализовывается, она минимум 18кбит.

Был опыт реализации 4х портовой памяти, на 2х портовых ячейках блочной памяти.

По идее по такому же принципу ее можно еще раз масштабировать и сделать из 4х  -  8ми портовую.

Только при этом возрастет количество задействованной памяти в 4 раза.

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


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

8 minutes ago, slkhome said:

Только при этом возрастет количество задействованной памяти в 4 раза.

и  не только,  еще  и падает макс. частота 

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


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

Всем спасибо за советы! Видимо да, направление мысли в сторону регистров самое верное в этой задаче.

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


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

10 hours ago, slkhome said:

Был опыт реализации 4х портовой памяти, на 2х портовых ячейках блочной памяти.

а как вы реализовывали когерентность записи от каждого из портов и разруливали приоритет read-first, write-first?

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


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

4 hours ago, des00 said:

а как вы реализовывали когерентность записи от каждого из портов и разруливали приоритет read-first, write-first?

Честно говоря - уже не помню тонкостей. Это использовал для реализации вейвлет-преобразования. Нужно было быстро реализовать - поэтому было уже не до оптимизации. Место в кристалле было. Алгоритм работал. 

Если есть желание поразбираться - могу поискать исходники

 

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


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

4 minutes ago, slkhome said:

Честно говоря - уже не помню тонкостей. Это использовал для реализации вейвлет-преобразования. Нужно было быстро реализовать - поэтому было уже не до оптимизации. Место в кристалле было. Алгоритм работал. 

Если есть желание поразбираться - могу поискать исходники

 

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

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


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

qpram_pass_qawsed.7z

38 minutes ago, des00 said:

Если вам не сложно, буду признателен.

Если не сложно, то напишите что выясните по этим исходникам, плиз

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


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

28 minutes ago, slkhome said:

Если не сложно, то напишите что выясните по этим исходникам, плиз

без проблем, а пароль к архиву можно в личку? :)

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


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

В 15.09.2022 в 11:52, des00 сказал:

без проблем, а пароль к архиву можно в личку? :)

КО говорит, что он в названии архива:)))

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


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

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

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

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

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

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

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

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

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

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