如何在 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。
正弦波的频率取决于您发送的速度(每秒采样数)。
我已经制作了一个 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。
正弦波的频率取决于您发送的速度(每秒采样数)。