VHDL音频项目

VHDL音频项目,vhdl,fpga,clock,vivado,pwm,Vhdl,Fpga,Clock,Vivado,Pwm,我正在尝试在Nexys 4 DDR板上进行一个学校项目。我感兴趣的项目分为两部分: 使用板上内置的PDM麦克风模拟Vu表(分贝表),并在16个LED上显示。声音越大,LED灯亮的越多 通过将电路板上的15个开关转换为15位二进制数,产生0到32767 Hz的声频(方波)。我计划使用PWM音频输出到扬声器进行演示 电路板上的剩余开关将用于在两种模式之间切换。我试图在网上研究各种各样的项目,但大多数都不是开源的,也没有帮助。我完全不知道如何实现第一部分,对如何实现第二部分有一个粗略的想法 对于第二部

我正在尝试在Nexys 4 DDR板上进行一个学校项目。我感兴趣的项目分为两部分:

  • 使用板上内置的PDM麦克风模拟Vu表(分贝表),并在16个LED上显示。声音越大,LED灯亮的越多

  • 通过将电路板上的15个开关转换为15位二进制数,产生0到32767 Hz的声频(方波)。我计划使用PWM音频输出到扬声器进行演示

  • 电路板上的剩余开关将用于在两种模式之间切换。我试图在网上研究各种各样的项目,但大多数都不是开源的,也没有帮助。我完全不知道如何实现第一部分,对如何实现第二部分有一个粗略的想法

    对于第二部分,我曾计划使用时钟分频器来划分100 MHz时钟(引脚E3),但也有点不确定如何做到这一点。理想情况下,我希望以1Hz的增量控制输出频率。例如,在15个开关输入中,如果最低有效位(称为开关[0])是唯一的高位,则输出频率为1 Hz。如果开关[1]高,则频率为2 Hz。如果开关[1]和开关[0]都很高,则频率为3 Hz。等等

    还应该说,我对使用FPGA非常陌生


    任何形式的帮助都将不胜感激

    如果传入的音频是简单的音调,则可以使用音频信号的大小作为响度的度量;如果您有一个由多个频率组成的更复杂的声音,则需要先执行FFT以提取分量波形。从那里,选择你喜欢的频率并使用它

    对于PWM,您有两个选项。第一种是使用一些计数器逻辑来创建新的时钟信号。不建议将此方法用于创建用于控制其他逻辑的时钟,因为它可能会造成严重的设置和/或保持冲突。第二种方法是使用PLL/DLL从以前的时钟信号生成新的时钟信号。这将比使用可配置逻辑生成的寄存器更稳定,如果需要,还可用于控制其他寄存器,但其生成的时钟范围有限(通常为~1MHz至1GHz)

    第三个(更好)是使用100MHz时钟,但只能在特定时间进行更改;此方法的伪代码可能是:

    Every (1MHz) clock cycle, counter = counter + 1
      If counter = frequency value/2 (i.e. 50,000,00 for 1MHz, 16,666,666 for 3MHz, etc)
         Instead, set counter to 0 and toggle the output signal
    
    如果您可以确定正确的频率值,这将给您一个根据需要变化的信号(即每秒两次以产生1MHz信号:)