音频设备的3种硬件接口- PCM,I2S和AC97

一、PCM接口

    ​    ​针对不同的数字音频子系统,出现了几种微处理器或DSP与音频器件间用于数字转换的接口。最简单的音频接口是PCM(脉冲编码调制)接口,该接口由时钟脉冲(BCLK)、帧同步信号(FS)及接收数据(DR)和发送数据(DX)组成。在FS信号的上升沿,数据传输从MSB(Most Significant Bit)字开始,FS频率等于采样率。FS信号之后开始数据字的传输,单个的数据位按顺序进行传输,1个时钟周期传输1个数据字。发送MSB时,信号的等级首先降到最低,以避免在不同终端的接口使用不同的数据方案时造成MSB的丢失。

    ​    ​PCM接口很容易实现,原则上能够支持任何数据方案和任何采样率,但需要每个音频通道获得一个独立的数据队列

二、I2S接口

​    ​    ​I2S接口(Inter-IC Sound)在20世纪80年代首先被飞利浦用于消费音频,并在一个称为LRCLK(Left/Right CLOCK)的信号机制中经过多路转换,将两路音频信号变成单一的数据队列。当LRCLK为高时,左声道数据被传输;LRCLK为低时,右声道数据被传输。与PCM相比,IIS更适合于立体声系统。对于多通道系统,在同样的BCLK和LRCLK条件下,并行执行几个数据队列也是可能的。

三、AC97接口

     AC97(Audio Codec 1997)是以Intel为首的五个PC厂商Intel、Creative Labs、NS、Analog Device与Yamaha共同提出的规格标准。与PCM和IIS不同,AC97不只是一种数据格式,用于音频编码的内部架构规格,它还具有控制功能。AC97采用AC-Link与外部的编解码器相连,AC-Link接口包括位时钟(BITCLK)、同步信号校正(SYNC)和从编码到处理器及从处理器中解码(SDATDIN与SDATAOUT)的数据队列。AC'97数据帧以SYNC脉冲开始,包括12个20位时间段(时间段为标准中定义的不同的目的服务)及16位“tag”段,共计256个数据序列。例如,时间段“1”和“2”用于访问编码的控制寄存器,而时间段“3”和“4”分别负载左、右两个音频通道。“tag”段表示其他段中哪一个包含有效数据。把帧分成时间段使传输控制信号和音频数据仅通过4根线到达9个音频通道或转换成其他数据流成为可能。与具有分离控制接口的IIS方案相比,AC97明显减少了整体管脚数。一般来说,AC97 编解码器采用TQFP48封装。

总结:

    ​    ​PCM、I2S和AC97各有其优点和应用范围,例如在CD、MD、MP3随身听多采用IIS接口,移动电话会采用PCM接口,具有音频功能的PDA则多使用和PC一样的AC97编码格式。

    ​    ​音频设备接口包括PCM、I2S和AC97几种,分别适用于不同的应用场合。针对音频设备,Linux内核中包含了2类音频设备驱动框架,OSS和 ALSA,前者包含dsp和mixer字符设备接口,在用户空间的编程中,完全使用文件操作;后者以card和组件(pcm、mixer等)为主线,在用户空间的编程中不使用文件接口而使用alsalib。

    ​    ​在音频设备驱动中,几乎必须使用DMA,而DMA的缓冲区会被分割成一个一个的段,每次 DMA操作进行其中的一段。OSS驱动的阻塞读写具有流控能力,在用户空间不需要进行流量方面的定时工作,但是它需要及时的写(播放)和读(录音),以免出现缓冲区的underflow或overflow。

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是Verilog实现I2S_RX音频接收通用设计的基本步骤: 1. 定义输入输出信号:定义I2S_RX接收到的数据信号和时钟信号,以及输出音频信号。 2. 配置I2S_RX接口:根据具体的I2S_RX接口规格,配置相关的寄存器和参数,使其能够正确接收音频数据。 3. 实现数据解码:对接收到的I2S_RX数据进行解码,提取出音频数据,根据具体的音频格式进行解析,如PCMAC97等。 4. 实现音频处理算法:对音频数据进行处理,如去噪、均衡、音量控制等。 5. 输出音频信号:将处理后的音频数据输出到DAC芯片或其他音频设备,使其能够播放出来。 以下是I2S_RX音频接收的Verilog代码示例: ``` module i2s_rx( input i2s_clk, input i2s_data, output audio_out ); reg [31:0] i2s_rx_data; reg [1:0] i2s_rx_state; reg [15:0] audio_data; reg [3:0] bit_cnt; parameter IDLE = 2'b00; parameter LEFT = 2'b01; parameter RIGHT = 2'b10; always @(posedge i2s_clk) begin case (i2s_rx_state) IDLE: begin i2s_rx_data <= 0; if (i2s_data == 1'b0) begin i2s_rx_state <= LEFT; bit_cnt <= 4; end else if (i2s_data == 1'b1) begin i2s_rx_state <= RIGHT; bit_cnt <= 4; end end LEFT, RIGHT: begin if (bit_cnt == 0) begin i2s_rx_state <= IDLE; audio_data <= i2s_rx_data[15:0]; audio_out <= audio_data; end else begin i2s_rx_data <= {i2s_rx_data[30:0], i2s_data}; bit_cnt <= bit_cnt - 1; end end endcase end endmodule ``` 以上代码实现了一个简单的I2S_RX接收模块,能够正确接收音频数据,并输出到音频输出端口。具体实现还需要根据具体的I2S_RX接口规格进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小正空间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值