如何在 VHDL 中添加 LUT 以生成正弦波

How to add a LUT in VHDL to generate a sine

我已经制作了一个 I2S 发射器来从我的 FPGA 中生成一个 "sound"。我想做的下一步是创建正弦。我在一个 LUT 中制作了 16 个样本。我的问题是如何在 VHDL 中实现类似的东西。以及如何按顺序加载样本。谁已经尝试过了,可以分享他的知识吗?

我用 16 个样本进行了查找 table:

0               0π
0,382683432     1/16π
0,707106781     1/8π
0,923879533     3/16π
1               1/4π
0,923879533     5/16π
0,707106781     3/8π
0,382683432     7/16π
3,23114E-15     1π
-0,382683432    1 1/16π
-0,707106781    1 1/8π
-0,923879533    1 3/16π
-1              1 1/4π
-0,923879533    1 5/16π
-0,707106781    1 3/8π
-0,382683432    1 7/16π
-6,46228E-15    2π

最简单的解决方案是制作一个 ROM,它只是一个 big case 语句。

FPGA 综合工具会将其映射到更多 LUT 上。

请注意,对于较大的表格,仅存储 1/4 的波形,其他值是派生的。


I would like to send out a 24 bit samples, do you also know how to do that with this data (binary!)?

24 位(有符号)意味着您必须将浮点值转换为 -8388608..8388607 范围内的整数值。 (出于对称原因,您将使用 -8388608..8388607)

因此将正弦值(您知道在 -1..1 范围内)乘以 8388607。

正弦波的频率取决于您发送的速度(每秒采样数)。