基于AX516 FPGA 开发板的音频录制与回放
硬件介绍
AX516是一款基于FPGA平台的高性能开发板,它使用赛灵思生产的 Spartan6 系列的XC6SLX16-2CSG324FPGA 作为CPU。这一系列具有众多优点:具有丰富硬件资源、具有丰富接口等。在包括:软件无线电、工控、IC验证等众多领域都有所广泛应用。
基本流程
选取FPGA开发板与外接音频模块相结合的方式,利用音频模块的音频芯片WM8731模拟信号与数字信号之间转换的功能来实现。除此之外,还用到I2C和I2S总线接口,通过它们来实现FPGA与WM8731之间的控制与数据通信。其中,I2C接口负责FPGA对WM8731的寄存器的配置,而I2S接口负责对音频数据的通信。通过DDR3读写控制、音频通信与控制、按键检测等程序来实现。
在硬件上电结束后,开始按键检测。判断有按键按下时,再次判断按键是否松开。在按键松开后开始DDR读写控制程序,然后初始化管脚配置与位宽。将时钟复位后,再配置WM8731寄存器,启动音频产生程序,发送音频数据。在另一端接收音频数据,至此结束。
硬件结构
如图
开发板主要参数
1 | 项目 参数 |
电路设计
如图
WM8731结构
如图 WM8731主要负责数字信号与模拟信号之间的转换功能。
寄存器信息
如图:在WM8731的内部有11个寄存器,通过I2C总线的方式对其内部的11个寄存器进行相应的配置,来实现对芯片的初始化以及工作时的工作状态和功能。ADC和DAC都是WM8731的内部模块,ADC是模拟数字转换器,DAC是数字模拟转换器。音频信息通过外部的麦克风输入,在WM8731中来进行数字信号与模拟信号之间的转换。控制器可以通过控制接口来对WM8731进行配置,然后在通过音频接口读写数据音频信号。
寄存器地址及功能
如下
1 | 寄存器地址 寄存器名称 相关功能 |
wm8731 FPGA引脚及功能
1 | WM8731引脚 FPGA引脚 |
开发流程
1 | 设计定义、HDL实现、功能仿真、逻辑综合、前仿真、布局布线、后仿真、静态时序分析、系统测试 |
协议
i2c
I2C(Inter Interface Circuit)全称为芯片间总线,是目前使用广泛的芯片间串行扩展总线。目前世界上采用I2C总线有两个规范,荷兰飞利浦公司和日本索尼公司,现多采用飞利浦公司I2C总线技术规范,已成为电子行业认可的总线标准。采用I2C技术单片机以及外围器件种类很多,已广泛用于各类电子产品、家用电器及通信设备中。
I2C串行总线只有两条信号线,一条是数据线SDA,另一条是时钟线SCL。SDA和SCL是双向的,I2C总线上各器件数据线都接到SDA线上,各器件时钟线均接到SCL线上。
带有I2C接口单片机可直接与I2C总线接口的各种扩展器件(如存储器、I/O芯片、A/D、D/A、键盘、显示器、日历/时钟)连接。由于I2C总线采用纯软件寻址方法,无需片选线连接,大大简化总线数量。
基本结构如图
访问
由总线规范,起始信号表明一次数据传送的开始,其后为寻址字节。在寻址字节后是按指定读、写的数据字节与应答位。在数据传送完成后主器件都必须发送终止信号。在起始与终止信号之间传输的数据字节数由主器件(单片机)决定
寄存器配置
如图 每个寄存器都需i2c传输3个字节。
i2s
数字音频接口四种模式 1.Right justified 2.Left justified 3.I2S 4.DSP mode
音频数据传输:WM8731的数字音频接口有5根引脚,分别为:BCLK(数字音频位时钟)、DACDAT(DAC数字音频数据输入)、DACLRC(DAC采样左/右声道信号)、ADCDAT(ADC数字音频信号输出)、ADCLRC(ADC采样左/右声道信号)。
FPGA为从设备,WM8731为主设备。ADCDAT、DACDST、ADCLRC和DACLRC与位时钟BCLK同步,在每个BCLK的下降沿进行一次数据传输。BCLK、DACDAT、DACLRC、ADCLRC为WM8731的输入信号。ADCDAT为WM8731的输出信号。FPGA和WM8731的I2S的通信右对齐的时序图如下图所示:
DDR3 读写
录取的数据存放到DDR3 选择的是两个64bit用户port口,一个port口用来读取DDR3数据,另一个则用来读写数据到DDR3里
代码实现
音频部分包含一个主程序(mywav.v)和四个子程序,四个子程序分别是音频接收程序(sinwave_store.v),音频播放程序(sinwave_gen.v),WM8731寄存器配置程序(reg_config.v)和复位延迟程序(reset_delay.v)。另外寄存器配置程序(reg_config.v)还调用了iic的通信程序i2c_com.v。
主程序
在硬件上电结束后,开始按键检测。判断有按键按下时,再次判断按键是否松开。在按键松开后开始ddr读写控制程序,后初始化管脚配置与位宽。将时钟复位后,配置WM8731寄存器,启动音频产生程序,发送音频数据。在另一端接收音频数据,至此,主程序结束。
示例代码
在按键检测程序和ddr读写控制程序执行后,主程序首先分配管脚与位宽。在此之后依次调用各个模块功能
音频接收
编写音频接收程序:sinwave_store.v,程序通过判断bclk输入时钟的上升沿来采样音频adcdat输入的数据,串行转化为64bit的并行数据并产生一个DDR3数据写请求信号
- 流程
在初始化变量结束后,程序首先检测是否有bclk、dacclk信号的跳变;在检测到时钟信号跳变后,采集ADC数据。当blc时钟处于下降沿时,开始采集数据。之后产生ddr写信号,在判断满足输出条件后输出接收结果。
- 代码
首先初始化变量,之后检测对应时钟信号是否跳变。确认有信号跳变后采集对应ADC数据。在开始采集前,判断时钟信号处于下降沿,之后产生ddr读写控制信号,在满足输出结果后输出音频接收结果。
音频播放
- 流程
频播放程序流程与音频接收程序流程类似。在初始化变量后,检测dacclk、bclk时钟信号是否跳变。再确认跳变后,检测时钟处于下降沿时开始播放音频数据,随后产生ddr读信号。在判断播放完成后结束流程。
- 代码
在初始化变量和配置管脚和位宽后,检测dacclk、bclk时钟是否跳变,在确认时钟跳变后开始播放声音数据,首先判断dacclk时钟是否处于下降沿,处于下降沿后播放数据。同时产生ddr读信号,在判断播放完成后程序结束。
寄存器配置
- 流程
在初始化变量后,程序开始产生i2c控制时钟,之后进行寄存器i2c配置过程控制。在此之后判断是否复位,在确认复位后开始i2c传输数据,之后判断是否接收到i2c应答信号,如果收到,则继续下一个寄存器配置,否则配置WM8731寄存器赋值。至此流程结束。
- 代码
在初始化变量后配置位宽和管脚,之后产生频率为20khz的i2c控制时钟;之后进行寄存器IIC配置过程控制;判断复位后,开始数据传输,如果收到i2c应答信号,则继续下个寄存器配置,否则发送结束。开始WM8731寄存器赋值。
I2C通信
- 流程
在配置变量后引脚后,首先i2c处于空闲状态,在判断输入信号处于低电平后,开始数据传输,在接受到应答信号后,开始下次传输,在判断传输结束后,流程结束。
- 代码
在判断处于低电平后,开始数据传输,接收到应答信号后,开始下次数据传输,直至数据传输结束。
复位延迟
当始终处于上升沿是判断cnt是否满足条件,满足指定条件后,使得cnt自增。不满足时进行复位操作,以此达到复位时延操作。
按键检测
- 流程
初始化变量结束后,判断按键是否按下,如果按键按下ddr写地址复位,开始计数。在判断超过抖动时间后,开始录音。判断按键是否松开,按键松开后ddr读地址开始计数,超过抖动时间后,录音结束。按键检测程序流程结束。
- 代码
第一部分检测按键是否按下,第二部分检测按键是否松开。最后执行相应操作。
顶层模块
- 流程
依次调用:WM8731驱动程序、按键检测程序、DDR读写控制程序。
- 代码
效果
如图
编译与操作
在音频模块上有三个不同颜色的音频连接器,蓝色的接口是音频输入接口;粉色的接口是麦克风的输入接口;绿色的接口则为麦克风的输出接口。
在连接过程中,我们需要注意的是不要将插头与接口插错,耳机的粉色插头要插到音频模块的粉色接口上,耳机的绿色插头则要插到音频模块的绿色接口上。
编译工程生成文件,然后再用Impact 工具下载生成的文件到FPGA里,这样就完成了我们FPGA版的录音机了。
想要实现录音与播放功能很简单,就像在微信发语音一样,按住录音键说话,说完话后再松开录音就可以了。我们需要按住开发板上的KEY1键,对着耳机的麦克风说上一段话,然后释放KEY1键,之后我们就能在耳机中听到我们自己说的话了,非常简单,方便快捷。
See
- 黑金AX516开发板用户手册