軟件:Quartus
語言:Verilog
代碼功能:
設(shè)計音樂播放器,要求至少包含2首歌曲,使用按鍵切換歌曲,使用開發(fā)板的蜂鳴器播放音樂,使用Quartus內(nèi)的ROM IP核存儲音樂文件,簡譜存儲在ROM中,共2首歌曲。
《茉莉花》的簡譜存儲在ROM中,具體值可以打開music.mif文件查看
《兩只老虎》的簡譜存儲在ROM2中,具體值可以打開music2.mif文件查看
mif文件說明:
8表示簡譜1
9表示簡譜2
10表示簡譜3
以此類推
每個簡譜對應(yīng)4個相同的值
演示視頻:
部分代碼展示
//播放器控制模塊 module?music_ctrl(sysclk,stop_key,select,start_key,tonecode,tonestep,led,spkout); ???input???????????sysclk;//50M晶振 input???????????stop_key;//reset input???????????select;//歌曲選擇,0和1對應(yīng)不同歌曲 input???????????start_key;//開始 input???????[9:0]?tonestep; ???output??????[7:0]?tonecode; output???????led;//指示燈 output??????????spkout;//蜂鳴器輸出 ??? reg?spkout=0; ???reg?[10:0]??????addr='d0;//分頻控制字--addr[21:0] ???reg?[24:0]??????divclk_counter='d0; ???reg?????????????musicclk=0; ??? ???wire?[9:0]??????step; ???reg?[7:0]???????tonecode='d0; ???wire?[9:0]??????tonestep; ???reg?[7:0]???????codeaddr1='d0; reg?[7:0]???????codeaddr2='d0; ??? wire?[7:0]?ROM_data1; wire?[7:0]?ROM_data2; //ROM(歌曲茉莉花) ROM?i1_ROM( .address(codeaddr1), .clock(musicclk), .q(ROM_data1) ); //ROM(歌曲兩只老虎) ROM2?i2_ROM( .address(codeaddr2), .clock(musicclk), .q(ROM_data2) ); reg??music_select=1'd0; assign?led=music_select; always@(posedge?sysclk?or?negedge?stop_key?or?negedge?start_key) if(!stop_key) music_select<=0;//停止 else?if(!start_key) music_select<=1;//開始 ???assign?step?=?tonestep; ???always?@(posedge?sysclk)????? ??????begin addr?<=?addr?+?step;//step是根據(jù)音樂文件產(chǎn)生的頻率控制字,不同step產(chǎn)生不同頻率的spkout ??????end ???always?@(posedge?sysclk)????? ??????begin ?????????if?(divclk_counter?==?179)//50M/(1799999*2)=分頻到13.9Hz---仿真將1799999改小為179 ?????????begin ????????????musicclk?<=?(~musicclk);//musicclk=13.9Hz ????????????divclk_counter?<=?0; ?????????end ?????????else ????????????divclk_counter?<=?divclk_counter?+?1; ??????end always?@(posedge?sysclk)? if(music_select==0)begin spkout<=1'b1;//0時蜂鳴器拉高,不唱 end else?begin spkout<=addr[10];//addr的最高位就是輸出蜂鳴器的頻率--仿真將addr[21]改成addr[10] end ???always?@(posedge?musicclk?or?negedge?stop_key) ???begin if(!stop_key) codeaddr1?<=?0;//停止 else?if(select==0)begin//歌曲1 ?????????if?(music_select) ???????????????begin ??????????????????tonecode?<=?ROM_data1;//播放歌曲 ??????????????????if?(codeaddr1?==?255) ?????????????????????codeaddr1?<=?0;//播放完后循環(huán) ??????????????????else ?????????????????????codeaddr1?<=?codeaddr1?+?1; ???????????????end end
設(shè)計文檔:
1. 工程文件
2. 程序文件
ROM文件
Mif文件
3. 程序編譯
4. RTL圖
5. Testbench
6. 仿真圖
整體仿真圖
音樂控制模塊
頻率控制模塊
數(shù)碼管顯示模塊
點擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=194
閱讀全文