資源描述:
《《梁祝音樂實驗報告》word版》由會員上傳分享,免費在線閱讀,更多相關內容在應用文檔-天天文庫。
1、應用實驗二梁祝音樂演奏實驗應用實驗二梁祝音樂演奏實驗一、實驗目的:1、了解普通揚聲器的工作原理。2、使用FPGA產(chǎn)生不同的音樂頻率。3、進一步體驗FPGA的靈活性。二、硬件要求:1、375KHz的信號源。(經(jīng)過實驗過程中的摸索,我個人覺得1.5MHz或者3MHz比較合適,梁祝這首曲子聽起來也比較優(yōu)美)2、FPGAEP1K10TC100-3主芯片。3、揚聲器。三、實驗原理:本實驗是要完成一小段音樂程序的開發(fā),然后再用揚聲器進行試聽。下面主要介紹一下完成本實驗的幾個主要部分的工作原理.音符的產(chǎn)生:音符的產(chǎn)生是利用計數(shù)器對輸入的時鐘信號進行分頻,然后
2、輸出不同的頻率來控制揚聲器發(fā)出不同的聲音。計數(shù)器必須是??勺兊挠嫈?shù)器,也就是其初始值可變,這樣便可以對其進行初始化,使其從不同的初始值開始計數(shù),實現(xiàn)對輸出時鐘信號的不同分頻。節(jié)拍的產(chǎn)生:節(jié)拍也是利用計數(shù)器來實現(xiàn)的,如果某一個音符需要維持的時間比較長,那么就可以在此計數(shù)器從計數(shù)值A到計數(shù)值B之間都維持該音符,很顯然,A和B之間的間隔越大,那么該音符維持的時間也就越長。樂譜的存儲:樂譜是一個固定的組合電路,根據(jù)不同的輸入值,然后輸出一個固定的值,該值就是音符產(chǎn)生計數(shù)器的分頻的初始值。適當?shù)倪x擇這些計數(shù)器和組合電路,便可完成不同的樂曲和不同的節(jié)奏。四
3、、實驗內容及步驟:本實驗要完成的任務是設計一個驅動揚聲器產(chǎn)生梁祝音樂的程序,設計步驟如下:1、編寫音樂輸出的VHDL語言代碼。2、用Quartus-II對其進行編譯仿真,知道程序中沒有錯誤為止。3、在仿真確定無錯誤后,選定FPGA的芯片類型是ACEXIKEP1K10TC100-3,在“DeviceandPinOption”的選項內把還沒有用的管腳的輸入形式改為“三態(tài)輸入”,配置設備最好是選用“EPCS4”的這種類型。4、對應于上面選定的芯片進行管腳配置,在次基礎上再次進行編譯,主要是將管腳的配置信息整合的程序中去。5、根據(jù)自己配置好的管腳信息,
4、在實驗箱上對揚聲器接口、時鐘接口和我們已經(jīng)選定的FPGA進行正確連線。6、在軟件上進行實驗所需硬件進行加載,加載后把已經(jīng)編譯好的音樂輸出的VHDL語言代碼下載到我們已經(jīng)選定的FPGA中,下載完成后我們就可以開始觀察實驗結果了,不斷調整輸入的時鐘頻率,直到音樂可以比較流暢、緩和地播放出來為止。應用實驗二梁祝音樂演奏實驗圖1編寫音樂輸出的VHDL語言代碼圖2編譯VHDL語言代碼應用實驗二梁祝音樂演奏實驗圖3編譯成功圖4選擇芯片并配置管腳應用實驗二梁祝音樂演奏實驗圖5再次編譯圖6加載硬件并下載VHDL語言代碼一、實驗連線:時鐘(clk):時鐘輸入信號
5、是接在375KHz的時鐘源上。揚聲器(Spk):FPGA的輸出是連接在揚聲器的輸入端,即Spk端。二、實驗VHDL語言代碼:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;--------------------------------------------------------------------應用實驗二梁祝音樂演奏實驗entitypmusicisport(clk:instd_logic
6、;--ClockSignalspk:bufferstd_logic);--speakerdriverendpmusic;--------------------------------------------------------------------architecturebehaveofpmusicissignaltone:std_logic_vector(10downto0);signaltone_count:std_logic_vector(10downto0);signaltone_index:integerrange0to15;
7、signalclk10_count:std_logic_vector(17downto0);signaltime:integerrange0to150;signalclk10:std_logic;beginprocess(clk)--generate10hzclocksignalbeginif(clk'eventandclk='1')thenclk10_count<=clk10_count+1;if(clk10_count=16#3fff#)thenclk10<=notclk10;endif;endif;endprocess;process(c
8、lk10)beginif(clk10'eventandclk10='1')thenif(time=150)thentime<=0;elsetime<=