floating-point - 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]);
解决方案
你说“我有一个 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 有了更多的迭代,并且更接近当今现代语言的使用方式。
推荐阅读
- java - 如何解压缩大量 gif
- python - 对带有配置文件的 python 日志记录感到困惑(仅记录在配置文件中为 root_logger 设置的内容)
- python - 为什么启用 Eager Execution 时可训练变量会消失?
- node.js - fluent-ffmpeg 与作物的纵横比
- c# - 使用泛型类型的问题
我的 C# 课 - c - GCC C 编译器(gcc -Wall -o foo.c foo.c)
- php - 如何从一串数据中获取小时和分钟?
- keyboard-shortcuts - 让 win+m 后跟 win+p 执行代码
- javascript - parseInt 返回非数字 (NaN)
- html - 属性滚动条宽度在css中不起作用