首页 > 解决方案 > VHDL中单精度浮点数的三角函数

问题描述

如何计算三角函数:反正切、反正弦,或者至少是 VHDL 中的正弦余弦?我有一个 IEEE 754 单精度浮点格式的值(te 一个符号、一个尾数、一个指数)(下图)。据我所知,它可以实现为查找表或通过 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]);

标签: floating-pointvhdltrigonometryfpgaxilinx

解决方案


你说“我有一个 IEEE 754 单精度浮点格式的值”。我肯定会尽量避免使用 IEEE 格式的数字。它使事情变得不必要的复杂。我不知道那个数字是从哪里来的,也不知道你是如何把它输入 FPGA 的,但首先要做的是尝试将它转换为定点格式。

Xilinx 为您提供现成的 Cordic 代码,用于Arc Tan. 那会让你的生活轻松很多。正如预期的那样,它不接受 IEEE 数字,但可以使用“有符号分数”和 8 到 48 位之间的精度大小。您应该获取他们的 Cordic IP 手册并阅读它可以做什么。我还没有看到 Cordic 代码asin

您可能需要付出一些努力来控制 I/O,因为 IP 仅适用于流式 AXI4 接口。

令我惊讶的是,您在 C 代码中为您提供了示例,但正在谈论使用 VHDL。我希望任何熟悉 C 的人都可以使用(系统)Verilog,因为语言非常非常接近。也有让一些人不高兴的风险:如果可能的话,使用 System Verilog。Verilog 比 VHDL 有了更多的迭代,并且更接近当今现代语言的使用方式。


推荐阅读