如何计算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]);
答案 0 :(得分:2)
您说“我有一个IEEE 754单精度浮点格式的值”。我绝对会避免使用IEEE格式编号。它使不必要的事情变得复杂。我不知道该数字来自何处或如何将其输入到FPGA中,但首先要做的是尝试将其转换为定点格式。
Xilinx为您提供Arc Tan
的现成的Cordic代码。这样可以使您的生活轻松很多。如预期的那样,它不接受IEEE数字,但可以使用“有符号分数”和8到48位之间的精度大小。您应该获取他们的Cordic IP手册,并阅读其功能。我还没有看到asin
的Cordic代码。
由于IP仅适用于流式AXI4接口,因此您可能需要付出一些努力来控制I / O。
让我感到惊讶的是,您为您提供了C代码示例,但却在谈论使用VHDL。我希望熟悉C的任何人都可以使用(系统)Verilog,因为这些语言非常非常接近。同样有使某些人感到不安的风险:如果可能,请使用System Verilog。与VHDL相比,Verilog的迭代次数更多,并且与当今使用现代语言的方式更加接近。
答案 1 :(得分:0)
我假设YPR的更新速率与系统时钟相比较低。
在这种情况下,我建议您看看Instant SoC。那是一种将C ++代码编译为易于使用的VHDL文件(包括RISC-V处理器)的编译器。我没有尝试使用IEEE数字作为接口。我认为也应该使用C ++计算四元数。在+ -pi范围内的输出可以是固定点。 Digilent保险库中有一个示例,您可以查看:"RISC-V on Nexys"。