PYNQ2裸跑之音频ADAU1761
前面在qt和matlab中实现了音频的播放,最终目的是在底层硬件中实现数据播放,之所以使用裸跑是为了更好的理解音频codec的相关配置和IIC、I2S的接口的通用代码的开发和测试。
芯片ADAU1761 是一款低功耗、集成数字音频处理功能的立体声音频编解码器,支持立体 声 48 kHz 录音和回放,采用1.8V 模拟电源供电,功耗为 14mW。立体声音频 ADC 和DAC 支持 8 kHz 至 96 kHz 范围内的采样速率,并支持数字音量控制。
- 配置接口
ADAU1761支持SPI和IIC两种配置接口,在音频codec中,一般采用IIC时序来完成配置。
IIC读写寄存器有两种模式:单字节和块模式。
- 数据接口
音频接口有四种:I2S、左对齐、右对齐和TDMmode。比价常用的是I2S接口时序。可以从图中可以清楚得到:LRCLK的周期为fs,占空比为50%。
项目需求:
- 采样率:8kHz
- 配置接口:IIC
- 数据接口:I2S
- 实现音频采集和播放功能
- 音频采集和播放的位宽为16bit
第一步接口确认:
数据口:数据口有以下几个:MCLK、ADC_SDATA、BCLK、LRCLK和DAC_SDATA.
- 根据I2S接口时序,可以确认LRCLK为频率为8kHz、占空比为50%。
- 下一个确认MCLK频率,在ADAU1761中带有一个PLL,时钟配置有很多中,具体如下所示:
寄存器0x4000:时钟寄存器
这里采用默认配置,CLKSRC直接等于MCLK,INFREQ设置为1024 × fs ,这样可以计算出MCLK=8*1024=8.192MHz
- 再确认BCLK,思路为需要确认在LRCLK为高或低时,一共有几个时钟周期
如果一个LRCLK周期中有64个bit时钟周期,那么可以确认BCLK=64*LRCLK,所以可以确认BCLK=512kHz。
寄存器 |
值 |
说明 |
0x4000 |
0x01 |
不使用核时钟,直接使用MCLK |
0x4015 |
0x00 |
使用默认配置,50%占空比,从模式 |
0x4016 |
0x00 |
使用默认配置 该寄存器设置BCLK频率 |
0x4017 |
0x00 |
使用默认配置 不清楚这个寄存器含义 |
0x401C |
0x21 |
|
0x401D |
0x00 |
使用默认配置 |
0x401E |
0x41 |
|
0x401F |
0x00 |
使用默认配置 |
0x4020 |
0x05 |
|
0x4021 |
0x11 |
|
0x4022 |
0x00 |
使用默认配置 |
0x4023 |
0xFF |
设置左边耳机使能和音量最大 |
0x4024 |
0xFF |
设置右边耳机使能和音量最大 |
0x4029 |
0x03 |
|
0x402A |
0x03 |
使能DAC |
0x40F2 |
0x01 |
|
0x40F9 |
0x7F |
使能全部时钟 |
0x40FA |
0x01 |
在弄清楚了时钟之间的关系,和寄存器的配置,后面就简单很多。
下面就是IIC接口实现和I2S接口实现:
IIC模块网上很多,根据ADAU1761,最多写6个byte,修改了一个可以设置写1-6个字节的版本。
iic_rw_module
(input clk , //50MHzinput rst_n , output reg scl , inout sda , input iic_en , input rd_or_wr , //读写标志:读1,写0input [6:0] device_addr , input [15:0] iic_reg_addr , input [47:0] iic_reg_data ,input [7:0] iic_bytes ,output[47:0] iic_read_data , output reg iic_done
);
I2S接口,也是在网上找的,简单好用。实际工程中,对调用进行了修改,没有采用axi总线进行写数据。
module myI2STx_v1_0 #(parameter integer C_S00_AXIS_TDATA_WIDTH = 32)(// I2S Interfaceinput mclk,output reg bclk = 1,output reg lrclk = 1,output reg sdata = 0,// User ports ends// Do not modify the ports beyond this line// Ports of Axi Slave Bus Interface S00_AXISinput wire s00_axis_aclk,input wire s00_axis_aresetn,output reg s00_axis_tready = 0,input wire [C_S00_AXIS_TDATA_WIDTH-1 : 0] s00_axis_tdata,input wire [(C_S00_AXIS_TDATA_WIDTH/8)-1 : 0] s00_axis_tstrb,input wire s00_axis_tlast,input wire s00_axis_tvalid);reg mclkdelay = 0;reg halfclk = 0;reg [0:0]counter = 0;reg [15:0]ramp = 16'hFFFF;reg [15:0]shiftreg = 0;reg [4:0]bitcounter = 0;reg [2:0] state = 0;reg [31:0] buffer = 0;reg bufvalid = 0;localparam S0 = 0;localparam S1 = 1;localparam S2 = 2;localparam S3 = 3;localparam S4 = 4;always @(posedge s00_axis_aclk) beginif (bufvalid==0 && s00_axis_tready==0) begins00_axis_tready <= 1;end else if (bufvalid==0 && s00_axis_tready==1 && s00_axis_tvalid==1) begins00_axis_tready <= 0;buffer <= s00_axis_tdata;bufvalid <= 1;endif (mclk==1 && !mclkdelay) begincounter <= counter+1;if (counter == 0) beginhalfclk <= 1;endmclkdelay <= mclk;end else beginhalfclk <= 0;mclkdelay <= mclk;endif (halfclk==1) begincase(state)S0: beginif (bufvalid==1) beginbufvalid <= 0;bitcounter <= 0;lrclk <= 0;bclk <= 0;sdata <= 0;state <= S1;shiftreg <= buffer[31:16];endendS1: beginbclk <= 1;state <= S2;endS2: beginbclk <= 0;sdata <= shiftreg[15];bitcounter <= bitcounter+1;state <= S3; endS3: beginbclk <= 1;shiftreg <= shiftreg<<1;if (bitcounter==31) beginif (lrclk==0) beginstate <= S4;end else beginstate <= S0;endend else beginstate <= S2;endendS4: beginbitcounter <= 0;lrclk <= 1;bclk <= 0;sdata <= 0;state <= S1;shiftreg <= buffer[15:0];enddefault:beginstate <= S0;endendcaseendendendmodule
接下来就是 生成原始音频文件或者数据,这里采用了matlab,对笔记本的麦克风进来录音,代码如下所示:
R = audiorecorder(8000,16,1);
record(R);
stop(R);
pause(R);
play(R);
stop(R);
myspeech = getaudiodata(R,'int16');
filename = ('test4.wav'); %给文件取吿
audiowrite(filename,myspeech,8000);
最后是如何把数据下发给codec。
我的思路:PS裸跑读取音频数据(可以通过SD卡读取文件,或者简单点直接定义一个short数组存放音频数据),通过乒乓操作,使用BRAM接口把数据下发给PL。
具体交互逻辑其实是构建一个FIFO空满标志:
PS判断RAM1是否为空,为空写入数据,否则等待;
当PS端写完数据后,通过寄存器通知PL,写完成;
PS第一次写完成触发PL开始取数据;
PL读使能一直根据音频采样率固定节拍;
工程源码链接:https://download.csdn.net/download/weixin_39813867/16616593
PYNQ2裸跑之音频ADAU1761相关推荐
- F1C100S裸奔nes游戏模拟器-f1c100s裸跑-WINDOWS下keil-MDK纯裸跑 回味80后的小幸福
裸跑f1c100s-nes游戏模拟器 F1C100S-完整nes游戏模拟器(显示60帧-可音频输出),后附测试文件可下载. 全志F1C100S使用ARM9内核,QNF88封装适合手工焊接,内置32M ...
- Part2:S3C2440裸跑一个LED程序
Part2:S3C2440落跑一个LED程序 0 写在前面 1 明确"操作对象"和"操作过程" 2 代码编写和分析--看一个程序如何裸跑... 2.1 代码编写 ...
- 4岁雪地裸跑、7岁自主创业,这个11岁机器人比赛冠军,南京大学自考毕业了!...
新智元报道 编辑:张佳 [新智元导读]4岁雪地裸跑.独自驾驶帆船出海,5岁开飞机,7岁自主创业成为公司第一大股东,8岁徒步100公里穿越新疆罗布泊无人区,9岁小学毕业,还获得多项机器人世界冠军 ...
- 广州高校学生发起百人裸跑要求校方安装空调
华南师范大学石牌校区的同学们为了装空调出奇招,校方表示正在一校三区逐步安装 新快报讯 炎炎夏日,在没有空调的宿舍里要如何度过?华南师范大学石牌校区的同学们为此出奇招,准备发起一场"百人裸跑& ...
- s3c2416运行JAVA_s3c2416裸跑环境配置
最近刚刚开始学习ARM-linux,上周买了块tq2416的板子,给的Linux资料太复杂太深奥不愿看,等不及想要把2416跑起来.于是到处找相关裸跑资料,可是用2416的人实在少,网上的资料更少,裸 ...
- TX2440 裸跑实验-跑马灯(ADS1.2编译) 入门
TX2440 裸跑实验-跑马灯(ADS1.2编译) 入门 一.实验目的: 理解汇编的编程结构,有助于学习ARM汇编,为后续学习CPU的启动机制来了个入门级 二.实验环境: TX2440平台 三.实验工 ...
- s3c2416keil下裸跑
原文 http://www.cnblogs.com/yanzhicheng/p/3197053.html 最近刚刚开始学习ARM-linux,上周买了块tq2416的板子,给的Linux资料太复杂太 ...
- 想出名裸奔可以,但是请自己去,Leo谈“鹰爸训练4岁儿子雪中裸跑”
周国平说:"一切世俗的头衔都可以凭人力获取,而要成为父亲却必须仰仗神力." 世上很少有父母不爱自己的孩子,不同点在于根据父母自己的判断表达爱的方式.去年有个虎妈,最近又出了个让孩子 ...
- 深度测试: LayaAir H5游戏引擎裸跑性能超越Unity3D
转载:https://blog.csdn.net/vsyoyo/article/details/53332024 本文通过对实际评测报告数据进行逐一分析,验证LayaAir H5游戏引擎的真实性能表现 ...
最新文章
- kindeditor上传图片php,Kindeditor编辑器添加图片上传水印功能(php代码)
- centos python 安装
- 人生如戏,请给我好一点儿的演技
- MySQL 怎么变快_如何让mysql索引更快一点
- MFC之CAsyncSocket详解
- 【Python CheckiO 题解】Roman Numerals
- python读音-Python怎么读
- Linux 文件类型!
- 【游戏开发实战】Unity调用谷歌Google免费翻译API(https接口),年轻人不讲武德,用多个国家语言怎么讲
- Chrome 浏览器关闭了360主页防护后每次打开仍然是360导航问题排查与处理方法,不卸载360流氓软件解决chrome浏览器主页锁定问题
- Power Switching ----- Controlling power for power shutoff
- HTTP 请求 报错信息406
- 家用计算机设置网络,手把手教您设置安装家庭无线网络
- kdays 游戏汉化教程[日记版本] 序章 接触
- Windows桌面任务栏应用图标变白怎么办?
- 用GitHub做一份精美的在线简历
- 路由器指定dns解析服务器设置
- 10 年老程序员教你甩锅必杀技,论【如何优雅的甩锅】
- ICC Floorplan遇到的坑以及解决方法
- APK部署手机上出现闪退现象
热门文章
- 2017电大形考 计算机应用基础6,2015-电大形考-计算机应用基础---Windows-7操作系统---客观题(答案)27689...
- 论文工具大全+软件简介
- cocos creator 2.4.6 加载json文件 初始化游戏 - 初学者
- 服务器七雄争霸官方网站,七雄争霸特效城堡半价购买 全新服务器等您来挑战...
- 博升机器人_乐博乐博机器人
- 七周二次课(1月23日) 10.6 监控io性能 10.7 free命令 10.8 ps命令 10.9 查看网络状态 10.10 linux下抓包...
- 华为 watch fit 鸿蒙,华为新款智能手表 Watch Fit 曝光,矩形表盘,支持近 100 种运动模式...
- D. Alex and Julian
- 关于英伟达jetson nano的搭配双目摄像头跑ORB_SLAM2
- 包(package)与模块的导入--from与import