开发板:Kintex7-410T开发板; 开发环境:vivado2019.1; 输入:WM8731转换的ad数据; 输出:WM8731转换的da数据; 实验概述: 手机播放音乐,通过3.5mm耳机线接入Kintex7开发板,WM8731将手机播放音乐转换为I2S协议的数字信号送入FPGA,FPGA做串并转换,处理为32bit并行数据,并将数据送入DDR3缓存,同时从DDR3读出音频数据做并串转换,再送回WM8731耳机输出,效果就是通过耳机实时听到存储的音频。 工程代码架构如下: 工程BD部分如下:
1 音频采集和输出部分 音频phy芯片选择WM8731,通过iic总线配置为从机模式,之所以配置为从机模式是为了数据同步,WM8731配置为从机模式、I2S、32位、48K采样率,具体看代码,此部分代码结构如下: 该部分顶层如下:
音频采集、发送、wm8731配置均在100M时钟同步下完成,解决了数据跨时钟域问题; 2 音频缓存 这部分是核心,利用米联客的FDMA实现,这里重点介绍FDMA控制器部分的设计思路, 首先顶层参数如下:
音频数据操作时钟100M; DDR3读写时钟200M;
FDMA突发长度设置为128,可修改; FDMA读写数据位宽都设为32,与音频输出位宽一致; 音频采样率设置为48K,与wm8731设置的一致; 音频通道设为2,左右声道; 音频录音时长设为20,单位是秒,可修改; 那么,FDMA一次传输的总数据量=音频采样率X音频通道X音频录音时长; 所以,FDMA一次传输需要突发的次数=FDMA一次传输的总数据量÷FDMA突发长度; 同理,FDMA读写一次的地址增量(字节数)=32÷8XFDMA突发长度; 先来看看FDMA写时序,在代码中以注释形式给出,方便理解代码,如下: 具体关于FDMA的介绍可以去米联客看,也可以私信联系我; 写操作逻辑十分简单,如下:
写操作部分的fifo操作如下:
如果你不知道FDMA操作时序,可能看不懂代码;
FDMA读时序如下: 读操作部分与写同理,不再粘贴代码;
最后:需要源码的兄弟可以私信联系我,也可接受私人订制。