原創聲明:
本原創教程由芯驛電子科技(上海)有限公司(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亮,這時候就可以聽到音樂了。
-
FPGA
+關注
關注
1606文章
21344瀏覽量
594175 -
音頻
+關注
關注
28文章
2616瀏覽量
80135 -
SD
+關注
關注
1文章
136瀏覽量
33353 -
開發板
+關注
關注
25文章
4528瀏覽量
94573 -
紫光同創
+關注
關注
5文章
71瀏覽量
27297
發布評論請先 登錄
相關推薦
評論