Тригонометрические функции для чисел с плавающей запятой одинарной точности в VHDL - PullRequest
0 голосов
/ 11 декабря 2019

Как рассчитать тригонометрические функции: арктангенс, арксинус или, как минимум, синус и косинус в VHDL? У меня есть значение в формате IEEE 754 с плавающей запятой одинарной точности (т. Е. Знак, мантисса, показатель степени) (рисунок ниже). Как я знаю, это может быть реализовано в виде справочной таблицы или с помощью алгоритма CORDIC. Обе реализации подходят для меня. Точность до Pi / 1000 будет достаточно. Реализация должна быть синтезируемой. Устройство - Artix-7 FPGA.

Подобный код в C:

yaw   = atan2(2.0f * (q[1] * q[2] + q[0] * q[3]), q[0] * q[0] + q[1] * q[1] - q[2] * q[2] - q[3] * q[3]);   
pitch = -asin(2.0f * (q[1] * q[3] - q[0] * q[2]));
roll  = atan2(2.0f * (q[0] * q[1] + q[2] * q[3]), q[0] * q[0] - q[1] * q[1] - q[2] * q[2] + q[3] * q[3]);

Ответы [ 2 ]

2 голосов
/ 11 декабря 2019

Вы сказали: «У меня есть значение в формате с плавающей точкой одинарной точности IEEE 754». Я бы определенно постарался избежать использования чисел формата IEEE. Это делает вещи ненужными сложными. Я не знаю, откуда взялась эта цифра или как вы ее взяли в FPGA, но первое, что нужно сделать, это попытаться преобразовать ее в формат с фиксированной запятой.

Xilinx имеет готовый для вас код Cordic для Arc Tan. Это сделало бы вашу жизнь намного проще. Как и ожидалось, он не принимает числа IEEE, но работает с «знаковыми дробями» и точными размерами от 8 до 48 бит. Вы должны получить руководство по Cordic IP и прочитать, что он может сделать. Я еще не видел Cordic-код для asin.

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

Что меня удивляет, так это то, что вы предоставляете пример кода на C, но говорите об использовании VHDL. Я ожидаю, что кто-нибудь, знакомый с C, будет использовать (System) Verilog, поскольку языки очень, очень близки. Также есть риск расстроить некоторых людей: если это вообще возможно, используйте System Verilog. В Verilog было несколько больше итераций, чем в VHDL, и он намного ближе к тому, как используются современные языки в наши дни.

0 голосов
/ 16 декабря 2019

Я предполагаю, что частота обновления YPR низкая по сравнению с системными часами.

В этом случае я могу порекомендовать вам взглянуть на Instant SoC . Это компилятор, который компилирует код C ++ в простой в использовании VHDL-файл, включающий процессор RISC-V. Я не пытался использовать номера IEEE в качестве интерфейса. Я думаю, следует рассчитать кватернионы с C ++ также. Выход в диапазоне + -pi может быть фиксированной точкой. В хранилище Digilent есть пример, на который вы можете посмотреть: "RISC-V на Nexys" .

...