• 方案介紹
  • 附件下載
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

音樂播放器一首歌蜂鳴器ROM存儲(chǔ)Verilog代碼

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

1-23101R315023F.doc

共1個(gè)文件

名稱:音樂播放器一首歌蜂鳴器ROM存儲(chǔ)歌曲(代碼在文末付費(fèi)下載)

軟件:Quartus

語言:Verilog

代碼功能:

設(shè)計(jì)音樂播放器,播放一首歌,使用開發(fā)板的蜂鳴器播放音樂,使用Quartus內(nèi)的ROM IP核存儲(chǔ)音樂文件,簡(jiǎn)譜存儲(chǔ)在ROM中,歌曲為《茉莉花》,簡(jiǎn)譜存儲(chǔ)在ROM中,具體值可以打開music.mif文件查看。

mif文件說明:

8表示簡(jiǎn)譜1

9表示簡(jiǎn)譜2

10表示簡(jiǎn)譜3

以此類推

每個(gè)簡(jiǎn)譜對(duì)應(yīng)4個(gè)相同的值

演示視頻:

部分代碼展示

//播放器控制模塊
module?music_ctrl(sysclk,stop_key,start_key,tonecode,tonestep,led,spkout);
???input???????????sysclk;//50M晶振
input???????????stop_key;//reset
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;
???
wire?[7:0]?ROM_data;
ROM?i_ROM(
.address(codeaddr1),
.clock(musicclk),
.q(ROM_data)
);
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時(shí)蜂鳴器拉高,不唱
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?(music_select)
???????????????begin
??????????????????tonecode?<=?ROM_data;//播放歌曲
??????????????????if?(codeaddr1?==?255)
?????????????????????codeaddr1?<=?0;//播放完后循環(huán)
??????????????????else
?????????????????????codeaddr1?<=?codeaddr1?+?1;
???????????????end
???end
???
endmodule

設(shè)計(jì)文檔:

1. 工程文件

2. 程序文件

ROM文件

3. 程序編譯

4. RTL圖

5. Testbench

6. 仿真圖

整體仿真圖

音樂控制模塊

頻率控制模塊

數(shù)碼管顯示模塊

附簡(jiǎn)譜:

點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=195

  • 1-23101R315023F.doc
    下載

相關(guān)推薦