FPGA基础入门【17】开发板音频接口控制配置 您所在的位置:网站首页 音响耳机接口能输入音频吗 FPGA基础入门【17】开发板音频接口控制配置

FPGA基础入门【17】开发板音频接口控制配置

2024-07-12 05:23| 来源: 网络整理| 查看: 265

上一篇教程介绍的是NEXYS4开发板上的温度传感器,用上了串口通信和I2C接口,这次使用的加速度传感器使用的是SPI接口,是除了I2C之外另一种常用的接口,实用性很高

FPGA基础入门【17】开发板音频接口控制配置 开发板音频控制麦克风接口简介音频输出接口简介 逻辑设计顶层代码 模拟仿真Testbench仿真脚本仿真结果 编译烧写结果 总结

开发板音频控制

NEXYS 4文档中写着它的麦克风芯片是Analog Device的ADMP421,从前面两篇教程可以看出,NEXYS4开发板基本上使用的都是Analog Device的芯片,所以它上面还打着这个公司的标签。它和FPGA的连接如下 connection 这个芯片的文档在这里可以看到:ADMP421。 这个芯片已经很老了,以至于文档中都打着“过时”水印,不过毕竟NEXYS4也是很老的开发板了,是作为教育型开发板存在的,更多的是学习用

这个芯片的样子比较奇特,4个引脚加上一个收音孔,在开发板上看到标着MIC的那个孔不是用来焊接外设设备的,孔的背面就贴着这个芯片

麦克风接口简介

虽然芯片和接口的连接很简单,但驱动方式还是要好好学一下的。这个芯片使用的是脉冲密度调制Pulse Density Modulation (PDM)

时钟一般在1MHz到3MHz中,我们可以把100MHz系统时钟降低40倍成2.5MHz使用。在PDM中,1对应正脉冲,0是负脉冲,保持1代表最大正值,保持0代表最大负值,就像下面所展示那样 wave 它和外接输入的模拟信号对应关系如下,这个过程叫做delta-sigma调制,可以这么理解:输入的模拟电压越大,积分器累计的越快,就越容易超过积分器的阈值,激活寄存器。当积分器的阈值是输入模拟电压最大值的一半时,模拟输入为0产生的一直是0,模拟输入为最大值V产生的一直是1,模拟输入为最大值一半V/2时产生的是持续翻转的方波 analog 麦克风还分左右声道,引脚L/R SEL的高电平代表左声道,低电平代表右声道,虽然我看不出来这个芯片怎么测左声道和右声道。在读取数据时,可以使用时钟的上升沿和下降沿分别探测两个声道的数据 timing

音频输出接口简介

NEXYS4开发板上的音频输出驱动不是用的某一款芯片,而是Sallen-Key Butterworth四阶低通滤波器,从开发板的设计图纸看到它的设计如下: schematic 其中AUD_PWM连接到FPGA的A11引脚,AUD_SD连接到FPGA的D12引脚。它的作用是将PWM方波转换成相应的正弦波给3.5mm音频输出口。如果AUD_SD为低电平,则不经过放大,高电平使能放大器

PWM波和输出对应如下,它载体是一定周期的方波,其中高电平占的比例越高,代表输出模拟电压越高。如果输出信号的频率最高是5kHz,那PWM波的频率最好是50kHz以上以保证精度。 PWM1 PWM2 PWM波和PDM波有一定的区别,如果要把麦克风信号传到音频输出,需要一定的转换。

人耳能识别的频率范围是20Hz到20kHz,一般好的音质需要到达44kHz左右。我们选择20kHz,那么需要PWM周期对应200kHz,在100MHz系统时钟下是500个时钟周期,为了二进制方便改成512个时钟周期,此时PWM周期为19.5kHz。

麦克风用的是2.5MHz,使用7位精度,最大值128,计算密度需要51.2us,但PWM每5.12us就需要一个数据,因此我们需要10个计数器来交替计算。

为了解释这个工作原理,可以看NEXYS4文档中给出的例子 PDM to PWM 这里假设麦克风时钟周期是2.4MHz,应用需要7位数据,也就是最大值128,采样率24kHz,那样就需要像图中所示交替使用两个计数器

逻辑设计

设计计划是,从麦克风以2.5MHz读取PDM数据,采样128个数据取密度,用它来产生PWM波,这个PWM波同时输出给LED和音频输出,然后戴上耳机看能不能听到相应声音

顶层代码

从上面对PDM波和PWM波的分析,我们做如下设计:

100MHz系统时钟(周期10ns)用来生成PWM波,512个时钟为一个周期,用一个阈值来控制PWM波中高电平的占比100MHz系统时钟减缓40倍到2.5MHz(周期400ns)作为PDM波的读取时钟PDM波读取128个样本的时间为400ns128=51.2us,PWM一个周期为10ns512=5.12us,我们需要10个计数器交替计数,就像原理分析时候的例子以PDM波的128个采样计数为基准,定出10个参考点,每当PDM计数到这个参考点就清空相应计数器的值,重新计数,这样每当到达参考点时,相应计数器就记录了128个采样的高电平比例。10个参考点位置为floor(128*i/10)={0, 12, 25, 38, 51, 64, 76, 89, 102, 115}由于数字逻辑中只有整数,设置另一个计数器,频率是100MHz,以5120为周期(128个PDM采样周期),在十个PDM参考点的40倍即计数器完成计数时读取密度,乘以4倍(上限128转换到512),作为下一个PWM周期的阈值

基于上面的设计,新建代码文件microphone.v,源代码如下:

顶层定义,时钟复位LED,加上一个开关sd_sw,用来控制音频输出的放大器使能,另外加上麦克风和音频输出的接口

module microphone( input clk, input rst, output reg led, input sd_sw, // a switch to control the amplifier // Port to microphone output reg MIC_CLK, input MIC_DATA, output reg MIC_LR_SEL, // Port to mono audio output output reg AUD_PWM, output reg AUD_SD );

系统时钟减缓40倍生成麦克风读取时钟2.5MHz,并探测其上升沿

// Generate 2.5MHz to MIC_CLK, and rising edge detection reg [7:0] MIC_CLK_count; reg MIC_CLK_d; wire MIC_CLK_posedge; always @(posedge clk or posedge rst) begin if(rst) begin MIC_CLK


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有