基于FPGA的音樂播放器設(shè)計報告_第1頁
基于FPGA的音樂播放器設(shè)計報告_第2頁
基于FPGA的音樂播放器設(shè)計報告_第3頁
基于FPGA的音樂播放器設(shè)計報告_第4頁
基于FPGA的音樂播放器設(shè)計報告_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、中國地質(zhì)大學(xué)(武漢) 基于FPGA的音樂播放器設(shè)計 專 業(yè) 班 級 小組成員 指導(dǎo)老師 2015.06目錄一、 實現(xiàn)功能2二、 成員及任務(wù)分工2三、詳細設(shè)計及原理31.系統(tǒng)硬件結(jié)構(gòu)設(shè)計32.程序流程4四、 具體實現(xiàn)51.SD卡文件系統(tǒng)的初始化52.按鍵選歌模式63.自動播放模式74.快進、快退、播放/暫停功能75.LCD顯示歌曲名及歌詞模塊86.LED顯示功能107.數(shù)碼管顯示當前曲目、總歌曲數(shù)和時間功能11五、碰到的問題及解決過程121.問題一122.問題二123. 問題三134. 問題四13六、運行效果13七、設(shè)計小結(jié)22一、 實現(xiàn)功能 1. 支持SD卡文件讀取功能;2. 支持WAV格式音

2、頻功能;3. 支持歌詞同步顯示功能;3. 支持歌曲名稱顯示功能;4. 支持“播放/暫停”控制功能;5. 支持歌曲選擇功能;6. 支持LED燈顯示音量功能;7. 支持返回功能;8. 支持硬啟動從ROM啟動;9.支持數(shù)碼管顯示總歌曲數(shù)和第幾首歌曲功能;10.支持數(shù)碼管顯示歌曲的播放進度功能;11. 支持LED燈指示撥碼開關(guān)07狀態(tài)功能;12. 支持前6首歌曲直接選擇功能。 2、 成員及任務(wù)分工 姓名所做任務(wù)熟悉Nios II 系統(tǒng)開發(fā)流程,看懂原工程文件。了解SD卡FAT文件系統(tǒng)大致的讀寫流程;格式化SD卡為FAT16格式并將.wav和.lrc文件復(fù)制到SD卡根目錄下。到實驗室去測試原工程文件的硬

3、件設(shè)置和軟件功能。測試軟件功能,明確各個按鍵對應(yīng)的功能。一起討論如何更改原來的功能,并添加新功能。完成實驗任務(wù),分工書寫課程設(shè)計報告。 三、詳細設(shè)計及原理1.系統(tǒng)硬件結(jié)構(gòu)設(shè)計本設(shè)計采用DE2 開發(fā)板,充分利用NiosII 軟核的特性,結(jié)合自定義用戶組件、自定義用戶外設(shè)。在FPGA 中使用軟核處理器的優(yōu)勢在于靈活高效,硬核實現(xiàn)沒有靈活性,通常無法使用最新的技術(shù)。而應(yīng)用Nios II 軟核處理器,開發(fā)者能夠完全定制CPU 和外設(shè),獲得恰好滿足需求的處理器,充分利用了Nios II 處理器靈活和高效的特性。通過DE2 開發(fā)板上的SD 卡插槽,讀取SD 卡上的音頻數(shù)據(jù)后,送到音頻編/解碼器,對音質(zhì)進行

4、相關(guān)處理后輸出,進行音樂的播放 SD 卡音樂播放是由NiosII 處理器通過軟件完成的。該音樂播放器主要分兩種播放模式: 按鍵選歌模式和自動播放模式。根據(jù)系統(tǒng)所劃分的功能,處理器、音頻設(shè)備、存儲器、輸入、輸出和交互接口都必須選用硬件設(shè)備實現(xiàn)。其中硬件部分如處理器用Altera公司的Nios II軟核來實現(xiàn),MP3音樂文件存儲于外部的SD卡中,DE2開發(fā)板上有4個為用戶預(yù)留的按鈕可以用來輸入,作為MP3播放器的功能鍵,輸出可以使用開發(fā)板上的輸出口來接音頻設(shè)備,用戶與開發(fā)板的交互可以使用開發(fā)板上RS-232串行口和JTAG口。整個系統(tǒng)分為四個部分:CPU模塊(包括外圍配置芯片、擴展芯片等)、存儲器

5、(SD卡)模塊、LCD顯示模塊、GPIO接口模塊。 圖1 mp3播放器硬件整體框圖2.程序流程 圖2 程序流程圖 對于MP3播放器來說,它應(yīng)該在板子加電時自動加載到SRAM,然后到一個約定的地方讀取音樂數(shù)據(jù)就可以了。 本系統(tǒng)會播放幾個音樂文件,所以MP3播放器就需要通過一個機制來管理或定位這些音樂文件,也就是通過一個文件系統(tǒng)管理功能的程序,讓這個文件系統(tǒng)軟件和MP3播放器配合使用。 音樂文件的存放應(yīng)該配合MP3音樂的播放,音樂文件的播放和顯示通過文件系統(tǒng)獲得相應(yīng)的播放音樂文件的地址和相關(guān)信息,存儲也應(yīng)該符合系統(tǒng)文件的定義來存放。也就是說文件系統(tǒng)是存放音樂和播放音樂的一個中間層,是音樂文件播放和

6、音樂文件存放的一個默認標準,所以文件系統(tǒng)的結(jié)構(gòu)定義是文件讀取和存儲的關(guān)鍵。4、 具體實現(xiàn)1.SD卡文件系統(tǒng)的初始化 調(diào)用函數(shù)SD_card_init();(1)SD卡簡介及FAT16文件系統(tǒng)構(gòu)成介紹:SD卡(Secure Digital Memory Card)是一種基于半導(dǎo)體快閃記憶器的新一代記憶設(shè)備,不需要額外的電源來保持其上記憶的信息。而且它是一體化固體介質(zhì),沒有任何移動部分,所以不用擔(dān)心機械運動的損壞。SD卡的結(jié)構(gòu)能保證數(shù)字文件傳送的安全性,也很容易重新格式化,所以有著廣泛的應(yīng)用領(lǐng)域,它被廣泛地于便攜式裝置上使用,例如數(shù)碼相機、個人數(shù)碼助理(PDA)和多媒體播放器等。(2)FAT16文

7、件系統(tǒng)構(gòu)成 MBR區(qū)裝有用于啟動系統(tǒng)的代碼和有關(guān)文件系統(tǒng)的重要信息; 在主引導(dǎo)扇區(qū)的末尾處含有分區(qū)表,分區(qū)表用于標識每個分區(qū)開始和結(jié)束的表項,最多可以有4個分區(qū), 每個分區(qū)可以包含不同的文件系統(tǒng)。分區(qū)引導(dǎo)扇區(qū)記錄各個分區(qū)啟動的引導(dǎo)程序。FAT表記錄SD存儲卡以簇為單位進行記錄的存儲空間的信息,簇的大小根據(jù)實際系統(tǒng)的電子盤特性設(shè)定。根目錄區(qū)記錄文件名和目錄名。 用戶數(shù)據(jù)區(qū)用于存放用戶數(shù)據(jù)及子目錄。 SD卡格式化時,系統(tǒng)采用了FAT16文件格式。主引導(dǎo)區(qū)位于整個SD卡的0柱面0磁頭,1扇區(qū)存放引導(dǎo)程序用于啟動和引導(dǎo)操作系統(tǒng),同時存放SD卡的主分區(qū)表,記錄卡的分區(qū)信息。在總共512字節(jié)的主引導(dǎo)記錄中

8、,MBR 的引導(dǎo)程序占了其中的446個字節(jié)(相對于扇區(qū)首地址的偏移量0H1BDH),隨后的64字節(jié)(偏移量1BEH1FDH)為DPT(Disk Partition Table,硬盤分區(qū)表),最后的兩個字節(jié)“55 AA”(偏移量1FEH1FFH)是分區(qū)有效的結(jié)束標志。FAT16文件系統(tǒng)最多支持4個分區(qū)項,對應(yīng)于4個分區(qū)表。在DPT部分共64字節(jié)中,以16字節(jié)為分區(qū)表項單位描述一個分區(qū)的屬性。在本系統(tǒng)能夠SD卡只作為一種存儲介質(zhì)使用,且整個系統(tǒng)作為一個分區(qū)處理。2.按鍵選歌模式(1) 進入按鍵選歌 當swit0為0,即無撥碼開關(guān)置為1時,LCD提示“Press key3 to choose a s

9、ong”,按下KEY3 后,LCD先顯示歌曲總數(shù)和歌詞總數(shù),繼而顯示當前所選歌名。 LCD_Init(); LCD_Show_Text(title0); lcd_write_cmd(LCD_16207_0_BASE,0xC0); LCD_Show_Text(title1); while(1)/檢測進入選歌界面 key=IORD(BUTTON_PIO_BASE,0); key3=key&0x08; if(key3) break; (2)歌曲選擇功能上一首 / 下一首功能分別由按鍵KEY2和按鍵KEY1實現(xiàn),播放至最后一首歌時按KEY1按鍵則將播放第一首歌曲;直接選歌功能由撥碼開關(guān)SW10

10、15實現(xiàn),可選擇第16首歌曲。a代表當前為第幾首歌,num_music為歌曲總數(shù)。 key=IORD(BUTTON_PIO_BASE,0); key=key&0x0e; key3=key&0x08; key2=key&0x04; key1=key&0x02; swit2=IORD(SWITCH_PIO_BASE,0); swit2=swit2&0xfc00; switch(swit2) case 0x0400: a=0; break; case 0x0800: a=1; break; case 0x1000: a=2; break; case 0x200

11、0: a=3; break; case 0x4000: a=4; break; case 0x8000: a=5; break; default: if(key1)a=(a+1)%num_music; else if(key2)a=(a+num_music-1)%num_music; break; 后一首 a=(a+1)%num_music; 前一首 a=(a+num_music-1)%num_music;(3) 確認選歌按下KEY3按鍵,確認當前所選歌曲,開始播放音樂。 if(key3) break;3.自動播放模式(1) 循環(huán)播放模式 else if(swi0)/連續(xù)播放 a=(a+1)%

12、num_music; time(0,a+1,num_music);當開關(guān)swi0撥動到1位置時,為循環(huán)播放模式,播放下一首歌曲。(2) 單曲循環(huán)模式 else if(swi1)/循環(huán)播放 a+=0; time(0,a+1,num_music); /顯示時間 當開關(guān)swi1撥動到1位置時,為單曲循環(huán)模式,循環(huán)播放當前歌曲。(3) 隨機播放模式 else if(swi2)/隨機播放 a=(num_lyrics+Tmp1+Tmp2+musica.m_name0)%num_music; time(0,a+1,num_music); /顯示時間 當開關(guān)swi2撥動到1位置時,為隨機播放模式,隨機播放歌曲

13、。4.快進、快退、播放/暫停功能(1) 快進 if(swi4)/快進 b=(b+4)%cluster_num; time(b*clupsec_num,a+1,num_music); /顯示時間 usleep(20000); continue; 當開關(guān)swi4撥動到1位置時,b是第幾個簇,執(zhí)行b=(b+4)%cluster_num實現(xiàn)快進。(2) 快退 else if(swi5)/快退 b=(b+cluster_num-4)%cluster_num; time(b*clupsec_num,a+1,num_music); /顯示時間 usleep(20000); continue; 當開關(guān)swi5

14、撥動到1位置時,執(zhí)行b=(b+cluster_num-4)%cluster_num實現(xiàn)快退。(3)播放/暫停功能由開關(guān)swi6實現(xiàn),實現(xiàn)代碼: else if(swi6)/暫停 b=(b+cluster_num-1)%cluster_num; usleep(20000); continue; 當開關(guān)swi6撥動到1位置時,執(zhí)行b=(b+cluster_num-1)%cluster_num,實現(xiàn)暫停。5.LCD顯示歌曲名及歌詞模塊(1)顯示歌名選歌定播放歌曲后,歌曲名會顯示在LCD上,調(diào)用函數(shù): void show_name(char *name) UINT16 i,j,length_temp,

15、length_n;/歌名顯示的頁面數(shù) LCD_Init(); length_temp=strlen(name); if(length_temp<=32) length_n=1; else length_n=(length_temp-32)/16+1; for(i=0;i<length_n;i+)/歌名顯示的頁面數(shù),歌名滾動顯示 lcd_write_cmd(LCD_16207_0_BASE,0x80);/寫第一行 usleep(100); for(j=0;j<16;j+) lcd_write_data(LCD_16207_0_BASE,namej+i*16); usleep(1

16、00); lcd_write_cmd(LCD_16207_0_BASE,0xC0);/寫第二行 usleep(100); for(j=0;j<16;j+) lcd_write_data(LCD_16207_0_BASE,namej+i*16+16); usleep(100); if(length_n>1) usleep(1000000); else usleep(300000); (2)顯示歌詞歌曲播放時LCD則會顯示歌曲的歌詞,先讀取歌詞后顯示歌詞,調(diào)用函數(shù):num_lyrics=read_lyrics(musica.m_name,lyric,&lyrics,num_ly

17、ric,&clupsec_num, &data_sect);/讀歌詞 for(k=0;k<num_lyrics;k+)/顯示歌詞 time_base=j_base-lyrics.timek-2; if(j+j_base=lyrics.timek) lcd_write_cmd(LCD_16207_0_BASE,0x80); break; else if(j+j_base=lyrics.timek+36) lcd_write_cmd(LCD_16207_0_BASE,0xc0); break; else if(j%2=0&&(j+j_base>=lyri

18、cs.timek+2) &&(j+j_base<=lyrics.timek+34) lcd_write_data(LCD_16207_0_BASE, lyrics.textk(j+time_base)/2); break; else if(j%2=0&&(j+j_base>=lyrics.timek+38) &&(j+j_base<lyrics.timek+70) lcd_write_data(LCD_16207_0_BASE, lyrics.textk(j+time_base)/2-2); break; 該函數(shù)中首先匹配歌曲名

19、字和歌詞名字,找到匹配歌詞后,讀扇區(qū),讀入一個簇的歌詞。如果歌詞時間沒有重復(fù),即一句歌詞對應(yīng)一個時間標志的情況,從歌詞開始標志開始讀,一個扇區(qū)的數(shù)據(jù)讀完,讀取下一個扇區(qū),讀時間,計算歌詞的長度是32的多少倍,將歌詞補滿32的整數(shù)倍個;如果歌詞時間有重復(fù),即一句歌詞對應(yīng)多個時間標志的情況,有幾個時間信息,取出這句歌詞對應(yīng)的所有時間信息,如果一個扇區(qū)的數(shù)據(jù)讀完,讀取下一個扇區(qū),進行時間轉(zhuǎn)換,轉(zhuǎn)換成這句歌詞時間對應(yīng)的扇區(qū)數(shù),計算歌詞的長度是32的多少倍,將歌詞補滿32的整數(shù)倍個;重復(fù)歌詞讀取。將讀出來的歌詞及其時間按時間順序排序,將讀出來的長歌詞轉(zhuǎn)換為短歌詞,函數(shù)返回數(shù)值numb1。6.LED顯示功

20、能(1)紅燈顯示音量將送入播放器的電平Buffer的值取出后按比例縮小,使其最大值為16,然后將縮小后的值通過處理后由LED燈顯示。Buffer的值越大,表示當前電平值越大,則LED燈點亮的個數(shù)越多。 SD_read_lba(Buffer,j,1); i=0; while(i<512) if(!IORD(AUDIO_0_BASE,0) Tmp1=(Bufferi+1<<8)|Bufferi; IOWR(AUDIO_0_BASE,0,Tmp1); i+=2; if(j%64=0) Tmp2=(BYTE)(Bufferi-2/16); Tmp2=0xffff>>(16

21、-Tmp2); Tmp2=Tmp2&0xffff; IOWR(LED_RED_BASE,0,Tmp2);(2)綠燈指示撥碼開關(guān)狀態(tài)DE2平臺上只有9個綠色的LED燈,所以只能夠指示撥碼開關(guān)swi08的狀態(tài),開關(guān)狀態(tài)為“0”,則對應(yīng)的燈滅;開關(guān)狀態(tài)為“1”,則對應(yīng)的燈亮。swit1=IORD(SWITCH_PIO_BASE,0);IOWR(LED_GREEN_BASE,0,swit1);7.數(shù)碼管顯示當前曲目、總歌曲數(shù)和時間功能DE2開發(fā)平臺上共8個數(shù)碼管,1、2兩個數(shù)碼管顯示當前曲目,3、4數(shù)碼管顯示歌曲總數(shù),5、6、7、8四個數(shù)碼管顯示當前歌曲的播放時間。數(shù)碼管顯示時調(diào)用函數(shù): vo

22、id time(int j,int n,int num) int tim2,h2,m2,s2,b2; unsigned int display; j=j/375; tim0=j/60; /min tim1=j%60; /s m1=tim0%10; m0=tim0/10; s1=tim1%10; s0=tim1/10; b1=n%10; b0=n/10; h1=num%10; h0=num/10; display = b0*16*16*16*16*16*16*16+b1*16*16*16*16*16*16+h0*16*16*16*16*16+h1*16*16*16*16+m0*16*16*16+

23、m1*16*16+s0*16+s1; IOWR(SEG7_DISPLAY_BASE,0,display);該函數(shù)的傳入?yún)?shù)j是簇中第幾個扇區(qū),n為當前播放的歌曲序號,num為歌曲總數(shù)。函數(shù)中完成根據(jù)j計算當前時間,并將歌曲序號、歌曲總數(shù)和時間顯示到對應(yīng)數(shù)碼管上。五、碰到的問題及解決過程1.問題一在原始軟件工程上直接編譯,出現(xiàn)system_0.ptf的存儲路徑與NIOS II工程不相符,導(dǎo)致運行時找不到.ptf文件,錯誤如下所示。 解決方法:熟悉軟件開發(fā)流程,在軟件工程編譯時需要用到相對應(yīng)的硬件平臺的配置信息。新建一個NIOS II工程,在添加 SOPC Builder System PTF F

24、ile 時,添加正確的ptf文件,添加所需的.c和.h文件,再次編譯。2.問題二編譯工程時,出現(xiàn)gnu_rules.mk和gtf_rules.mk文件不存在的問題,錯誤如下圖所示。解決方法:在網(wǎng)上搜索了一下所遇到的問題,網(wǎng)友給出的回答是軟件與電腦操作系統(tǒng)不兼容,于是將軟件的兼容模式設(shè)置為 Windows 7,再次編譯工程,錯誤消失,編譯成功。3. 問題三在修改NIOS II工程時,不了解SD卡的扇區(qū)、簇等概念。解決方法:在網(wǎng)上搜索了關(guān)于“SD卡中FAT16文件分析”的文章,了解SD卡的FAT16文件系統(tǒng)。每個扇區(qū)通常有512個字節(jié),每個簇可以包括2、4、8、16、32或64個扇區(qū),一個簇中只能

25、放置一個文件的內(nèi)容,因此文件所占用的空間,只能是簇的整數(shù)倍,如果文件實際大小小于一簇,它也要占一簇的空間;如果文件實際大小大于一簇,根據(jù)邏輯推算,那么該文件就要占兩個簇的空間。一個簇只能容納一個文件占用,即使這個文件只有0字節(jié),也決不允許兩個文件或兩個以上的文件共用一個簇,不然會造成數(shù)據(jù)混亂。因此,單片機讀SD卡上的文件時是以簇為單位的。4. 問題四SD卡沒有格式化為FAT格式,2G的SD顯示為3.18G,導(dǎo)致DE2開發(fā)平臺無法識別SD卡,程序停在SD卡初始化位置。解決方法:將SD卡在電腦上格式為FAT格式,內(nèi)存大小恢復(fù)到2G一下,再插入到DE2開發(fā)平臺上,SD卡被成功識別,程序運行正確。六、

26、運行效果1、開機界面 2、歌曲選擇模式 3、前一首/后一首功能;按KEY2鍵選擇前一首歌,如果當前為第一首,則前一首為最后一首歌。按KEY1鍵選擇下一首歌,如果當前為最后一首,則下一首為第一首歌。按確認鍵KEY3選擇當前歌曲,繼而播放當前歌曲。數(shù)碼管顯示當前歌曲為第幾首歌、總歌曲數(shù)、當前歌曲播放時長;LCD屏顯示播放時長及歌詞。4、返回功能撥碼開關(guān)SW17的狀態(tài)改變后,直接跳到選歌界面。SW1狀態(tài)為“1”時,撥碼開關(guān)SW17的狀態(tài)改變后,直接跳到循環(huán)播放模式。SW2狀態(tài)為“1”時,撥碼開關(guān)SW17的狀態(tài)改變后,直接跳到單曲循環(huán)模式。SW3狀態(tài)為“1”時,撥碼開關(guān)SW17的狀態(tài)改變后,直接跳到隨機播放模式。5直接選歌功能撥動撥碼開關(guān)SW1015,直接選擇歌曲16。七、設(shè)計小結(jié) 本次課程設(shè)計完成了以下工作:1. 研究了軟硬件協(xié)同技術(shù),具體研究了軟硬件的系統(tǒng)描述、軟硬件劃分等方面的技術(shù)。了解Ni

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論