开发板: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读时序如下:
读操作部分与写同理,不再粘贴代码;
最后:需要源码的兄弟可以私信联系我,也可接受私人订制。