名称:音频(WM8731芯片)输入输出试验设计Verilog代码VIVADO? ARTIX-7开发板
软件:VIVADO
语言:Verilog
代码功能:
音频(WM8731芯片)输入输出试验
通过耳麦说话,并通过耳机收听,音频环回功能是采用开发板音频模块电路实现M_IN口输入音频信号,同时L_OUT口输出音频信号,即L_OUT口上的扬声器能够实时的播放M_IN口输入的声音。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
本代码已在ARTIX-7开发板验证,ARTIX-7开发板如下,其他开发板可以修改管脚适配:
设计文档:
1、实验简介
本实验的音频环回功能是采用开发板音频模块电路(如下图1.1)实现M_IN口输入音频信号,同时L_OUT口输出音频信号,即L_OUT口上的扬声器能够实时的播放M_IN口输入的声音。
图1.1 开发板音频接口
2、实验原理
2.1硬件介绍
开发板音频模块使用WOLFSON公司的WM8731芯片实现声音信号的A/D和D/A转换功能。下图2.1为音频模块的硬件电路:
图2.1 音频模块电路
2.2 WM8731配置和时序
这里简单介绍一下音频模块用到的音频编/解码芯片WM8731。该芯片在本设计中主要完成声音信号在采集和回放过程中的A/D和D/A转换功能。该芯片的ADC和DAC的采样频率为8KHz到96KHz可调,可转换的数据长度为16-32位可调。WM8731的内部有11个寄存器。该芯片的初始化以及工作时的工作状态和功能都是通过以I2C总线方式对其内部的这11个寄存器进行相应的配置来实现的。本设计中WM8731工作于主模式,采样频率设为48KHZ, 转换的数据位长度为16位。WM8731的数字音频接口有5根引脚,分别为:BCLK(数字音频位时钟)、DACDAT(DAC数字音频数据输入)、DACLRC(DAC采样左/右声道信号)、ADCDAT(ADC数字音频信号输出)、ADCLRC(ADC采样左/右声道信号)。在本设计中FPGA为从设备,WM8731为主设备。ADCDAT、DACDAT、ADCLRC和DACLRC与位时钟BCLK同步,在每个BCLK的下降沿进行一次数据传输。BCLK、DACDAT、DACLRC、ADCLRC为WM8731的输入信号。ADCDAT为WM8731的输出信号。
图2.2 WM8731结构
在本系统中FPAG和WM8731的控制和数据通信将用到I2C和数字音频总线接口。FPGA通过I2C接口配置WM8731的寄存器,通过I2S总线接口来进行音频数据的通信。关于I2C接口,其他实验中已经有讲解,下面我们主要来了解数字音频接口。
数字音频接口可提供4种模式:
1. Right justified(如图2.3)
2. Left justified(如图2.4)
3.I2S(如图2.5)
4.DSP mode(如图2.6)
图2.3 Right justified模式
图2.4 Left justified模式
图2.5 I2S模式
图2.6 DSP mode模式
本实验选择Right justified模式。
3、程序设计
本实验的功能是程序检测按键KEY是否按下,如果检测到KEY按下了,开始录音,同
时播放录取的音频。本程序包含两大部分:WM8731寄存器配置,音频接收和播放。音频环回的过程为:AD采集的音频数据直接进入DA输出。
WM8731寄存器配置
lut_wm8731 模块和i2c_config 模块将寄存器配置地址和配置信息通过查找表的形式通过I2C总线写入音频模块中,具体的请参考例程代码和wm8731 的芯片数据手册。
音频录取和播放
audio_rx 接收模块,接收从麦克风输入的语音信号,完成左右声道的音频接收,将串行数据转换成并行数据。通过“Right justified”模式的时序图可以看到接收语音信号时在LRC 信号为高电平,且BCLK 信号的上升沿时左声道接收数据并完成串行信号转换成并行信号的过程。在LRC 信号为低电平,且BCLK 信号的上升沿时右声道接收数据并完成串行信号转换成并行信号的过程。
audio_tx是音频发送模块,完成左右声道音频数据的串行化。同样通过时序图可以看到,语音信号完成模数,数模转换,在LRC信号上升沿,且即将跳变为高电平时开始发送左声道数据,BCLK信号下降沿时完成缓存将并行信号转换为串行信号的过程;在LRC信号上升沿且即将跳变为低电平时开始发送右声道数据,在BCLK信号下降沿时完成缓存将并行信号转换为串行信号的过程。
audio_key模块主要完成录音播放的按键控制,状态转换如下,当按键按下后进入录音状态,当按键松开时进入播放状态。
4、实验现象
开发板首先将音频模块插入扩展口,同时插入麦克风和耳机,然后下载实验程序,戴上耳机,用麦克风开始讲话,耳机能听到麦克风语音。
部分代码展示:
/* ?*?Copyright?(C)2014-2015?AQUAXIS?TECHNOLOGY. ?*??Don't?remove?this?header.? ?*?When?you?use?this?source,?there?is?a?need?to?inherit?this?header. ?* ?*?License ?*??For?no?commercial?- ?*???License:?????The?Open?Software?License?3.0 ?*???License?URI:?http://www.opensource.org/licenses/OSL-3.0 ?* ?*??For?commmercial?- ?*???License:?????AQUAXIS?License?1.0 ?*???License?URI:?http://www.aquaxis.com/licenses ?* ?*?For?further?information?please?contact. ?*URI:????http://www.aquaxis.com/ ?*E-Mail:?info(at)aquaxis.com ?*/ ? ?////////////////////////////////////////////////////////////////////////////////// //?Company:?ALINX黑金 //?Engineer:?老梅 //? //?Create?Date:?2016/11/17?10:27:06 //?Design?Name:? //?Module?Name:?mem_test //?Project?Name:? //?Target?Devices:? //?Tool?Versions:? //?Description:? //? //?Dependencies:? //? //?Revision: //?Revision?0.01?-?File?Created //?Additional?Comments: //? ////////////////////////////////////////////////////////////////////////////////// module?aq_axi_master( ??//?Reset,?Clock ??input???????????ARESETN, ??input???????????ACLK, ??//?Master?Write?Address ??output?[0:0]??M_AXI_AWID, ??output?[31:0]?M_AXI_AWADDR, ??output?[7:0]??M_AXI_AWLEN,????//?Burst?Length:?0-255 ??output?[2:0]??M_AXI_AWSIZE,???//?Burst?Size:?Fixed?2'b011 ??output?[1:0]??M_AXI_AWBURST,??//?Burst?Type:?Fixed?2'b01(Incremental?Burst) ??output????????M_AXI_AWLOCK,???//?Lock:?Fixed?2'b00 ??output?[3:0]??M_AXI_AWCACHE,??//?Cache:?Fiex?2'b0011 ??output?[2:0]??M_AXI_AWPROT,???//?Protect:?Fixed?2'b000 ??output?[3:0]??M_AXI_AWQOS,????//?QoS:?Fixed?2'b0000 ??output?[0:0]??M_AXI_AWUSER,???//?User:?Fixed?32'd0 ??output????????M_AXI_AWVALID, ??input?????????M_AXI_AWREADY, ??//?Master?Write?Data ??output?[63:0]?M_AXI_WDATA, ??output?[7:0]??M_AXI_WSTRB, ??output????????M_AXI_WLAST, ??output?[0:0]??M_AXI_WUSER, ??output????????M_AXI_WVALID, ??input?????????M_AXI_WREADY, ??//?Master?Write?Response ??input?[0:0]???M_AXI_BID, ??input?[1:0]???M_AXI_BRESP, ??input?[0:0]???M_AXI_BUSER, ??input?????????M_AXI_BVALID, ??output????????M_AXI_BREADY, ???? ??//?Master?Read?Address ??output?[0:0]??M_AXI_ARID, ??output?[31:0]?M_AXI_ARADDR, ??output?[7:0]??M_AXI_ARLEN, ??output?[2:0]??M_AXI_ARSIZE, ??output?[1:0]??M_AXI_ARBURST, ??output?[1:0]??M_AXI_ARLOCK, ??output?[3:0]??M_AXI_ARCACHE, ??output?[2:0]??M_AXI_ARPROT, ??output?[3:0]??M_AXI_ARQOS, ??output?[0:0]??M_AXI_ARUSER, ??output????????M_AXI_ARVALID, ??input?????????M_AXI_ARREADY, ???? ??//?Master?Read?Data? ??input?[0:0]???M_AXI_RID, ??input?[63:0]??M_AXI_RDATA, ??input?[1:0]???M_AXI_RRESP, ??input?????????M_AXI_RLAST, ??input?[0:0]???M_AXI_RUSER, ??input?????????M_AXI_RVALID, ??output????????M_AXI_RREADY, ???????? ??//?Local?Bus ??input?????????MASTER_RST, ?? ??input?????????WR_START, ??input?[31:0]??WR_ADRS, ??input?[31:0]??WR_LEN,? ??output????????WR_READY, ??output????????WR_FIFO_RE, ??input?????????WR_FIFO_EMPTY, ??input?????????WR_FIFO_AEMPTY, ??input?[63:0]??WR_FIFO_DATA, ??output????????WR_DONE, ??input?????????RD_START, ??input?[31:0]??RD_ADRS, ??input?[31:0]??RD_LEN,? ??output????????RD_READY, ??output????????RD_FIFO_WE, ??input?????????RD_FIFO_FULL, ??input?????????RD_FIFO_AFULL, ??output?[63:0]?RD_FIFO_DATA, ??output????????RD_DONE, ??output?[31:0]?DEBUG ); ??localparam?S_WR_IDLE??=?3'd0; ??localparam?S_WA_WAIT??=?3'd1; ??localparam?S_WA_START?=?3'd2; ??localparam?S_WD_WAIT??=?3'd3; ??localparam?S_WD_PROC??=?3'd4; ??localparam?S_WR_WAIT??=?3'd5; ??localparam?S_WR_DONE??=?3'd6; ?? ??reg?[2:0]???wr_state; ??reg?[31:0]??reg_wr_adrs; ??reg?[31:0]
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1342