【紫光同创国产FPGA教程】【第十二章】SD卡音乐播放例程

原创声明:

本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处()。

适用于板卡型号:

PGL22G/PGL12G

1. 实验简介

在其他实验中我们已经完成了单独的SD卡读写和音频模块的录音播放,本实验通过搜索SD卡中WAV音乐文件,然后送到音频模块播放,完成一个简单音乐播放器的功能。

2. 实验原理

本实验一个关键是在没有文件系统的情况下,搜索SD卡每个扇区的内容,匹配出WAV文件,这里有一个假设:假设每一个文件都是从一个扇区第一个字节开始而且文件是连续存储的,经过大量实验,发现FAT32文件格式中的文件确实如此。

WAV文件格式

大部分的文件都有文件头,WAV也不例外,我们通过分析SD卡一个扇区的前几个字节,判断这个文件是否为WAV文件。

WAV文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。RIFF是英文Resource Interchange File Format的缩写,每个WAV文件的头四个字节便是“RIFF”,所以本实验就简单的以每个扇区的前4个字节是否为“RIFF”判断该文件是否为WAV文件,紧接着4个字节表示文件的大小,这样我们就可以确定要读取的数据量。WAV文件头大小是88字节,在播放时要把前88个字节的文件头去掉。

wav文件头格式

3. 程序设计

例程中通过wav_read搜寻SD卡中的WAV文件,并将WAV文件读取出来写入FIFO,最后再从FIFO中将数据输出并写入音频模块。

由于在前面的例程中已经讲过其他模块的原理及使用这里不再赘述,仅说明wav_read模块。

wav_read模块完成了从SD卡中搜索wav文件,读取wav文件,状态机如下,如果有搜索请求(按键按下),则进入搜索状态“S_FIND”,如果搜索到WAV文件,进入“S_PLAY_WAIT”状态,检查FIFO的剩余空间是否够512个字节,如果有512个字节空间,就进入“S_PLAY”状态读取wav的一个扇区内容。

wav_read模块状态机

在程序设计中,搜寻SD卡里图片的文件头是按每8个扇区地址(4K字节)搜寻一次的形式操作,所以在一次搜寻结束后,下一次搜寻时需要将地址左移3位对齐以保证下一次搜寻的地址和图片在SD卡中存储的地址一致。

说明:因为SD卡格式化的时候按最小单元4K格式化,音乐文件的头文件一般都是在SD卡的4K分区的起始位置开始放置。

wav_read模块的管脚说明:

信号名称 方向 说明
clk in 时钟输入
rst in 异步复位输入,高复位
ready out 空闲状态指示
find in 搜索播放请求
sd_init_done in sd卡初始化完成
state_code out 状态码0,表示sd还在初始化1,sd卡初始化完成,等待按键按下2,正在搜索WAV文件3,找到WAV文件,正在播放
sd_sec_read out sd卡读请求
sd_sec_read_addr out sd卡读请求扇区地址
sd_sec_read_data in sd卡读到的数据
sd_sec_read_data_valid in sd卡读数据有效
sd_sec_read_end in sd卡读请求完成
fifo_wr_cnt in fifo写端口已经使用量
wav_data_wr_en out wav文件写使能
wav_data out wav文件的音频数据

4. 实验现象

1)格式化sd卡(fat32格式),sd卡必须是2.0以上的版本(容量大于4G)

2)我们已经在demo的目录下为大家准备了一下的2个wav文件,把wav格式文件放到sd卡中,注意:这里的wav文件是立体声双声道,48K采样率,16bit的音频文件。

3)将准备好的sd卡注入开发板的sd卡槽(sd卡不能带电插拔),音频模块接开发板J9扩展口,上电,下载实验程序,等待LED1灭、LED2、LED3、LED4亮(4'b0001)时,按下KEY2,这个时候等待LED1亮、LED2灭、LED3、LED4亮(4'b0010),表示正在搜索wav文件,如果找到LED1、LED2灭、LED3、LED4亮,这时候就可以听到音乐了。

原文地址:https://www.cnblogs.com/alinx/p/14416804.html