Jump to content

    

Математика в VHDL

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

1 hour ago, jenya7 said:

Как мне такие вычисления перенести в VHDL?

Либо делать все  ручками -

.... делать (или брать) готовые  модули для real|float операций  и лепить из них dataflow  вычислений  

... переводить все в fixed point  и опят же ручками лепить  dataflow  вычислений  

Либо  использовать HLS - пишете на C/C++  и генерите рабочий data-flow на VHDL

Удачи! Rob.

Share this post


Link to post
Share on other sites
17 minutes ago, jenya7 said:

нужно очень высокое быстродействие. поэтому решено всю математику перенести в FPGA.

Так а сколько раз в секунду должны выполняться вычисления из первого сообщения?

Share this post


Link to post
Share on other sites
3 minutes ago, RobFPGA said:

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

Либо делать все  ручками -

.... делать (или брать) готовые  модули для real|float операций  и лепить из них dataflow  вычислений  

... переводить все в fixed point  и опят же ручками лепить  dataflow  вычислений  

Либо  использовать HLS - пишете на C/C++  и генерите рабочий data-flow на VHDL

Удачи! Rob.

а где можно познакомиться с этой темой?

Share this post


Link to post
Share on other sites

можно попробовать типа новый стандарт плавающей запятой

https://habr.com/ru/post/462385/

https://posithub.org/

 

здесь вроде есть ссылки на реализации

https://posithub.org/docs/PDS/PositEffortsSurvey.html

Share this post


Link to post
Share on other sites
1 minute ago, alexadmin said:

Так а сколько раз в секунду должны выполняться вычисления из первого сообщения?

частота в секунду не высокая. но само вычисление должно быть очень быстрым.

2 minutes ago, Maverick_ said:

можно попробовать типа новый стандарт плавающей запятой

https://habr.com/ru/post/462385/

https://posithub.org/

ну это теория. а практическое решение?

Share this post


Link to post
Share on other sites
Just now, jenya7 said:

частота в секунду не высокая. но само вычисление должно быть очень быстрым.

Так сколько, скажите, не таите. От этого принципиально зависит сложность задачи, требуемый объем ресурсов и пути решения.

Share this post


Link to post
Share on other sites

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

4 minutes ago, jenya7 said:

а где можно познакомиться с этой темой?

С какой темой?  Как ручками dataflow рисовать? :biggrin:

А  про HLS  смотреть  на Xilinx или на Intel в зависимости от вашей FPGA.

Удачи! Rob.  

Share this post


Link to post
Share on other sites
 
 
 
 
4 minutes ago, jenya7 said:

ну это теория. а практическое решение?

я обновил свой пост выше...

Share this post


Link to post
Share on other sites
10 minutes ago, alexadmin said:

Так сколько, скажите, не таите. От этого принципиально зависит сложность задачи, требуемый объем ресурсов и пути решения.

нужно уложиться в 3 ms

Share this post


Link to post
Share on other sites
37 minutes ago, andrew_b said:

Там есть специальные типы для этого. Вектор (N downto -M) содержит целую (N downto 0) и дробную части (-1 downto -M). Помнится, Xilinx, что-ли, не поддерживал векторы с отрицательными границами. Учитывая, в каком состоянии у них в целом поддержка VHDL'2008, не удивлюсь, если всё так и осталось.

Патчноты для Vivado 2019 крест на пузе ставят, что ввели полную поддержку VHDL-2008 (11 лет опоздания всего :wink:). Хочется верить, что в последней версии действительно всё пофиксили и работает.

43 minutes ago, jenya7 said:

я потеряю точность. на что мне умножить 0.0000001234

Тут уж Вам решать. Или сделать точно, но не в потоке (быстродействие понятие условное) и я уверен что есть такие паузы, в которых можно обчислить процессором все значения.

Или вы подходите не с той стороны. У меня была похожая проблема, когда делались преобразования значений с ADC в цифру в десятичном виде и потом нужно было делать некие вычисления и отправить на комп. В итоге оказалось, если выкинуть преобразование в десятичные числа - всё имеет намного компактнее вид и быстродействие, только в двоичном формате.

Опять же, если нужно работать с числами +/-2.147кк в целой части и +/-2.328е-10 в десятичной, Вам достаточно будет использовать целое интегральное int для целых значений и целое интегральное int для значений после запятой (итого 64 бита). Выглядит вполне реально. Ну или найдите слабые места и оптимизируйте.

4 minutes ago, jenya7 said:

нужно уложиться в 3 ms 

А данные как приходят? Прямо все сразу? неужели пока не дошёл остаток данных нельзя провести никакие начальные вычисления? За 3 ms можно не только вычисления сделать, но и крестики-нолики поиграть, если сделать предобработку потоковых данных.

Share this post


Link to post
Share on other sites
7 minutes ago, jenya7 said:

нужно уложиться в 3 ms

пару десятков умножений floatов (doublы вам там точно не нужны) даже 8ми битный АВР успеет сделать за 3мс.

а уж если в целочисленную арифметику данные вычисления перевести...

 

Share this post


Link to post
Share on other sites
3 minutes ago, _pv said:

пару десятков умножений floatов (doublы вам там точно не нужны) даже 8ми битный АВР успеет сделать за 3мс.

а уж если в целочисленную арифметику данные вычисления перевести...

 

там еще есть вычисления. это только часть. но в принципе может вы и правы.

Share this post


Link to post
Share on other sites
56 minutes ago, jenya7 said:

я потеряю точность. на что мне умножить 0.0000001234.

если нужна точность до 0.0000001234, то нужно умножать на степень 2 так, чтобы результат был больше 1

0.0000001234 * 2^23 = 1.035...

значит нужно выделять минимум 23 бит после запятой для фиксированной точки.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now