VHDL 中单精度浮点数的三角函数
Trigonometric functions for single-precision floating point numbers in VHDL
如何计算三角函数:反正切、反正弦或者至少正弦和余弦 在 VHDL 中?
我有一个 IEEE 754 单精度浮点格式的值(t.e。一个符号,一个尾数,一个指数)(下图)。据我所知,它可以作为查找 table 或通过 CORDIC 算法来实现。这两种实现对我来说都是 suitable 。精度达到 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]);
你说的是"I have a value in IEEE 754 single-precision floating-point format "。我肯定会尽量避免使用 IEEE 格式数字。它使事情变得不必要的复杂。我不知道这个数字是从哪里来的,也不知道你是如何把它输入到 FPGA 中的,但首先要做的是尝试将其转换为定点格式。
Xilinx 为您提供 Arc Tan
的现成 Cordic 代码。这会让您的生活 轻松很多 。正如预期的那样,它不接受 IEEE 数字,但可以使用 "signed fractions" 和 8 到 48 位之间的精度大小。您应该获取他们的 Cordic IP 手册并仔细阅读它的功能。我还没有看到 asin
的 Cordic 代码。
您可能需要付出一些努力来控制 I/O,因为 IP 仅适用于流式 AXI4 接口。
令我吃惊的是,您提供了 C 代码示例,但却在谈论使用 VHDL。我希望任何熟悉 C 的人都使用(系统)Verilog,因为语言非常非常接近。也冒着让一些人不高兴的风险:如果可能的话,使用 System Verilog。 Verilog 比 VHDL 有更多的迭代,更接近现代语言的使用方式。
我假设与系统时钟相比,YPR 的更新率较低。
在这种情况下我可以推荐你看看Instant SoC。这是一个编译器,可将 C++ 代码编译为易于使用的 VHDL 文件,包括 RISC-V 处理器。我没有尝试使用 IEEE 编号作为接口。我认为也应该用 C++ 计算四元数。 +-pi 范围内的输出可以是定点。
您可以查看 Digilent Vault 中的示例:"RISC-V on Nexys".
如何计算三角函数:反正切、反正弦或者至少正弦和余弦 在 VHDL 中? 我有一个 IEEE 754 单精度浮点格式的值(t.e。一个符号,一个尾数,一个指数)(下图)。据我所知,它可以作为查找 table 或通过 CORDIC 算法来实现。这两种实现对我来说都是 suitable 。精度达到 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]);
你说的是"I have a value in IEEE 754 single-precision floating-point format "。我肯定会尽量避免使用 IEEE 格式数字。它使事情变得不必要的复杂。我不知道这个数字是从哪里来的,也不知道你是如何把它输入到 FPGA 中的,但首先要做的是尝试将其转换为定点格式。
Xilinx 为您提供 Arc Tan
的现成 Cordic 代码。这会让您的生活 轻松很多 。正如预期的那样,它不接受 IEEE 数字,但可以使用 "signed fractions" 和 8 到 48 位之间的精度大小。您应该获取他们的 Cordic IP 手册并仔细阅读它的功能。我还没有看到 asin
的 Cordic 代码。
您可能需要付出一些努力来控制 I/O,因为 IP 仅适用于流式 AXI4 接口。
令我吃惊的是,您提供了 C 代码示例,但却在谈论使用 VHDL。我希望任何熟悉 C 的人都使用(系统)Verilog,因为语言非常非常接近。也冒着让一些人不高兴的风险:如果可能的话,使用 System Verilog。 Verilog 比 VHDL 有更多的迭代,更接近现代语言的使用方式。
我假设与系统时钟相比,YPR 的更新率较低。
在这种情况下我可以推荐你看看Instant SoC。这是一个编译器,可将 C++ 代码编译为易于使用的 VHDL 文件,包括 RISC-V 处理器。我没有尝试使用 IEEE 编号作为接口。我认为也应该用 C++ 计算四元数。 +-pi 范围内的输出可以是定点。 您可以查看 Digilent Vault 中的示例:"RISC-V on Nexys".