




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于SOPC的SD卡WAV音频播放器 设计报告 组员:贾 登 仪器10802班 张子龙 信工10803班 郭建林 信工10803班 日期:2011年5月29日基于sopc的sd卡wav音频播放器设计 摘要:本设计使用SOPC Builder在FPGA芯片上定制一个高速CPU实现FPGA与SD卡的SPI模式通信,并根据SD卡的FAT32文件系统读取SD卡内的WAV文件,读到的的音频文件数据送到FIFO模块,以将数据根据其采样率均匀输出到DA播放电路,实现了SD卡根目录下WAV文件的顺序播放、暂停、上一曲、下一曲功能。与SD卡的通信在NIOS 软件中用C语言编写,FIFO模块用Verilog HDL语言编写,音频数据的播放由DAC0832、uA741运放、音箱完成。关键词:FPGA 、SOPC、SD卡、SPI、FAT32、DA0832一、设计指标:系统上电后,自动顺序播放sd卡根目录中所有wav音频文件。Wav音频文件的频率可以是8k、16k、24k、32k、44.1k之中的任何一种,硬件电路自动根据实际的歌曲频率切换输出音乐数据的频率。按键实现播放下一曲、上一曲、暂停功能。扩展功能:通过遥控器红外线控制播放下一曲、上一曲、暂停二、硬件平台:Cyclone EP2C5T144C8 FPGA 开发板(自带sd卡模块)DAC0832+UA741构成的DA转换模块其他资源:杜邦线、电源、测试用音箱、(单片机)等。三、软件平台:Quartus 8.1 & NIOS 8.1 IDE四、设计方案:4.1综合分析:A、选单片机还是FPGA? 虽然我们跟熟悉的是单片机,但是这个课题对时间要求或者说cpu的处理速度要求较高,单片机接24M晶振也达不到速度上的要求,因此选择fpga是比较合适的。Fpga配上50M的晶振实现高速访问sd卡并实时播放音乐文件是可以实现的。B、用verilog开发还是C语言开发?接下来又有两个选择,是采用verilog语言开发还是采用SOPC定制软核再在NIOS IDE中用C语言进行编程实现。若采用verilog进行开发,软件编程上难度较大,时序不容易把握再加上实时调试也比较困难。采用C语言编程,在时序控制上比较容易,借助于NIOS IDE的强大在线调试功能,可以很方便的发现程序的错误并改正。综上几点原因我们选择了用定制cpu的方式进行此课题的设计。C、采用哪种方式访问sd卡,4位SD模式还是spi模式?4位sd模式对处理器要求较spi模式要高(crc校验不能忽略),还有cmd命令线是双向端口(发送命令和接受命令都经过cmd线),较spi全部单向传输要麻烦。在实际测试下,spi模式在速度上可以达到本课题设计要求,所以选择了spi模式对sd卡进行通信。4.2怎样从SD卡读取wav音频文件的数据?Cpu跟SD卡在底层进行spi通信,在软件上层利用FAT32文件系统获取文件的具体相关信息及文件数据。具体流程如下:获取SD卡第0扇区的5112字节数据计算得到根目录所在扇区获取根目录所在扇区的5112字节数据计算音频文件所在扇区或开始簇号根据FAT表分析文件所占有簇的分布情况从而读取整个音频文件4.3如何保证读到的音频文件按其采样频率输出?由于sd卡读取数据的速度的不可控性,另外WAV音频文件比较大,一首歌多达十到几十M,只能采用边读边放才能保证音乐实时不间断地放出来。播放的速度只取决于歌曲的采样频率,播放速度在播放过程中不能变化。解决方法:cpu只负责读取音乐数据,FIFO模块将数据按歌曲采样频率送到DAC。FIFO模块产生wren(允许写入信号)通知cpu对FIFO指定数据块内容进行写入新数据,这样播放的速度就始终保持不变,也能保证完整而不重复地播放音乐文件。五、系统各模块设计5.1、SD卡spi通信电路简化示意图:在SOPC系统中为cpu添加四条宽度为1位的pio端口如下:SD_CS(output only)(片选信号)SD_CLK(output only)( SPI 时钟信号)SD_DI (output only)(数据/命令输入到SD信号)SD_DO(input only)(sd卡反馈数据/命令信号)5.2、SD卡操作时序图:在CS为低电平期间向SD卡发送第0号命令,让SD卡进入SPi模式初始化命令成功后,才可以进行SD卡的读取扇区操作读取指定扇区,本课题设计中的核心命令5.3、CPU及外设设计FPGA开发板上50M有源晶振为整个系统提供时钟脉冲信号,为了充分地利用FPGA的高速性能,借助Quartus 中PLL模块对时钟进行3倍频,就可以让cpu的外部时钟频率达到150M。综合考虑速度及FPGA开发板资源情况,选择cpu类型为标准型,执行速度可达到75DMIPS。系统简图:cpu以SDRAM作为内存(程序存储空间及数据存储空间),保证了大程序也可以很好地运行jtag_uart:便于调试(可选,即使没有此模块也可以通过nios 单步调试测试程序运行情况)epcs:FPGA配置芯片,在FPGA上电后重新加载程序FIFO:数据写入缓冲模块,起到音频数据的均匀播放(严格以歌曲的采样频率将数据送到DA)按键交互:三个按键中断,可实现以下功能播放/暂停:按下后继续播放或暂停当前歌曲下一曲:按下后播放下一首歌曲上一曲:按下后播放上一首歌曲5.4、FIFO模块设计:FIFO模块是重点设计模块,它直接关系到最后音乐输出的效果(放快了还是放慢了,音乐有无明显失真)设计思想:当cpu播放某一首歌曲前,会先得到歌曲的采样频率(采样频率存储在wav文件中)然后cpu根据不同的采样频率向FIFO输出不同的mode2.0并使rst(输出使能控制)无效(正常输出)。在FIFO内部有一个深度为1024,宽度为8位的寄存器数组,dataout7.0按采样频率循环输出第0到第1023寄存器中数据。这1024个寄存器被均分为两块,上下各512。在输出第0个数据和第512个数据时让wren为高电平,其余时刻均为低电平。当cpu从SD卡中读取到新数据后,要等到wren为高电平后,才通过数据线data7.0及wrclk(上升沿写入数据)向FIFO写入512个数据。写入数据时,FIFO内部自动根据当前播放的是哪一个块(上面的512还是下面的512)把数据写入另一个块中,就实现了数据不会丢失(在一个块没有播放完时,这个块不会被新数据覆盖)。cpu在150M时钟频率下,足够在FIFO播放的同时准备好下一个512字节的数据。/数据写入endendendassign wren=(rdptr=512)|(rdptr=0);endmodulealways ( posedge wrclk)beginif(flag) begindatawrptr=datain;wrptr=wrptr+1b1;if(wrptr=512)beginwrptr=0;endelse begindatawrptr+512=datain;wrptr=wrptr+1b1;if(wrptr=512)beginwrptr=0;endendendassign wren=(rdptr=512)|(rdptr=0);endmodulealways (rdptr)/数据输出及产生上下块标志(flag)begindataout=datardptr;if(rdptr=0)flag=0;if(rdptr=512)flag=1;endalways(posedge clk or negedge rst)/产生输出时钟beginif(rst)elsebegincase (mode)3d0:begincnt=cnt+1b1;if(cnt=f8K)beginrdclk=rdclk;cnt=0;endend3d1:begincnt=cnt+1b1;if(cnt=f16K)beginrdclk=rdclk;cnt=0;end end3d2:begincnt=cnt+1b1;if(cnt=f24K)beginrdclk=rdclk;cnt=0;endend3d3:begincnt=cnt+1b1;if(cnt=f32K)beginrdclk=rdclk;cnt=0;endend3d4:begincnt=cnt+1b1;if(cnt=f44K)beginrdclk=rdclk;cnt=0;endenddefault:begincnt=cnt+1b1;if(cnt=f8K)beginrdclk=rdclk;cnt=0;end endendcaseendend附FIFO verilog代码:module fifo(clk,rst,mode,wrclk,datain,wren,dataout);parameter f8K=3125; parameter f16K=1563;parameter f24K=1042;parameter f32K=783;parameter f44K=567;input clk;input rst;input wrclk;input 2:0 mode;input 7:0 datain;output 7:0 dataout;reg 7:0 dataout;reg rdclk;reg 7:0 data 0:1023 ;reg 10:0 rdptr =0;reg 10:0 wrptr=0;reg 11:0 cnt=0;reg flag;output wren;always(posedge rdclk ) /读指针计数器beginrdptr=rdptr+1b1;if(rdptr=1024)beginrdptr=0;endend5.5、Quartus 电路原理全图:送往DA 音乐频率值输出 音频数据输出 暂停FIFO输出 写FIFO时钟 FIFO PLL模块 50*3=150M 暂停引脚上一曲引脚下一曲 引脚写FIFO使能 SD卡引脚 SDRAM引脚 5.6、Nios 软件设计第一步:完成cpu与sd卡的spi通信可以读出指定扇区的512字节数据;第二步:在sd卡底层操作基础上搭载FAT32文件系统,完成cpu从SD卡中读出指定文件名的文件中的数据;第三步:播放指定文件名的不同采样频率的WAV文件,测试并完善FIFO模块;第四步:利用FAT32文件系统扫描SD卡根目录下所有WAV文件,将文件信息(文件名、文件数据存放起始簇号等)存入文件信息结构体数组中;第五步:完成自动循环播放文件信息结构体数组中所指的wav文件;第六步:写按键中断响应函数,实现暂停、下一曲、上一曲功能,完成整个软件系统设计。5.7、NIOS 核心代码流程图主程序入口暂停、上一曲、下一曲中断初始化SD卡复位、初始化FAT32文件系统初始化扫描根SD卡根目录下所有wav文件,以获得根目录下所有wav文件的数目N定义N个文件信息结构体数组再次扫描根目录下所有wav文件,依次将这些文件的的信息(文件名、长度、开始簇等)装入上述数组u=0uN?根据第u曲文件的信息调用读文件函数读取该文件数据 u=u+1否是读文件函数入口读取文件开始簇第一扇区的数据到缓冲区buffer512由buffer24buffer27获得wav文件的采样率,并由此决定mode值(FIFO模块根据mode值决定输出数据的速度)读取下一扇区数据到缓冲区buffer512Flag1(上一首中断标志位)=0 ??是否是否Flag2(下一首中断标志位)=0 ?fag1=1,u=u-2flag2=1FIFO允许写入 ?否是将buffer512写入FIFO文件数据读完?是返回u暂停中断入口FIFO正在播放数据?返回使FIFO暂停播放使FIFO继续播放数据清零“暂停”中断捕获寄存器是否“上一首”中断入口Flag1=0清零“上一首”中断捕获寄存器返回“下一首”中断入口Flag2=0清零“下一首”中断捕获寄存器返回六、总结本系统以ALTERA公司EP2C5T114C8芯片为核心部件,通过在此芯片上定制一个高速嵌入式CPU(执行速度可达150DMIPS)实现了对SD卡的内部数据的读取,并通过FIFO模块将数据以均匀速度输出到DAC,从而实现WAV音频文件的播放,暂停,上一曲,下一曲功能,操作准确无误,音质纯正。利用Quartus II,Nios II等开发软件编写软件代码,能实现复杂的程序算法。拓展SD RAM作为CPU其内存,突破芯片FPGA本身内存的限制,为大型程序的稳定运行提供了充足的内存空间
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司合作合同范例4篇
- 代理加明合同范例
- 中介诚意金合同范例
- 个体进货合同范例
- 仿生建筑施工合同范例
- 三家比价合同范例
- 公路范例租赁合同范例
- 不同物业保安合同范例
- 介绍客户提合同范例
- 内销与外销合同范例
- SCADA系统基本功能检测记录
- 民营医院组织架构图示
- 消防维保方案 (详细完整版)
- 小学综合实践六年级上册第2单元《主题活动二:设计一周营养食谱》教案
- 高校电子课件:外国税制
- 小学英语作业分层设计实施策略研究优秀科研论文报告
- 高中 高二 化学选择性必修1 第三章 第四节 第1课时 难溶电解质的沉淀溶解平衡 教学课件
- 《农村合作金融机构非信贷资产风险分类指引》(银监发[2007]29号)
- 军事地形学地形图基本知识
- 小学生安全教育主题班会PPT模板(含具体内容)
- 设备安装工程监理规划
评论
0/150
提交评论