【正文】
n 37=tone_index=12。 when 35=tone_index=10。 when 33=tone_index=12。 when 31=tone_index=10。 when 29=tone_index=0。 when 27=tone_index=9。 when 25=tone_index=8。 when 23=tone_index=9。 when 21=tone_index=10。 when 19=tone_index=12。 when 17=tone_index=9。 when 15=tone_index=8。 when 13=tone_index=10。 when 11=tone_index=9。 when 9=tone_index=12。 when 7=tone_index=0。 when 5=tone_index=10。 when 3=tone_index=9。 when 1=tone_index=10。139。 process(clk10) begin if(clk1039。 end if。 else time=time+1。139。 process(clk10) begin if(clk1039。 end if。 if(clk10_count=163fff) then clk10=not clk10。139。 begin process(clk) begin if(clk39。 signal time : integer range 0 to 200。 signal tone_index : integer range 0 to 18。architecture behave of tb is signal tone : std_logic_vector(10 downto 0)。 s1 : in std_logic)。 keyc : out std_logic_vector(15 downto 0)。 Clock Signal spk : buffer std_logic。use 。use 。通過程序設(shè)置可以實(shí)現(xiàn)每個(gè)音階對(duì)應(yīng)一種點(diǎn)亮情況,從而實(shí)現(xiàn)音樂流水燈的律動(dòng)。因此要實(shí)現(xiàn)在蜂鳴器上播放出有一定規(guī)律節(jié)奏的簡(jiǎn)單歌曲,就需要了解各個(gè)音階的頻率,以及怎樣將這些頻率轉(zhuǎn)換為開發(fā)系統(tǒng)以及蜂鳴器能夠識(shí)別的代碼。而要準(zhǔn)確地演奏出一首樂曲,僅僅讓揚(yáng)聲器能夠發(fā)聲是不夠的,還必須準(zhǔn)確地控制樂曲的節(jié)奏,即每個(gè)音符的持續(xù)時(shí)間。而樂曲中的每一音符對(duì)應(yīng)著一個(gè)確定的頻率,因此,要想FPGA發(fā)出不同音符的音調(diào),實(shí)際上只要控制它輸出相應(yīng)音符的頻率即可。本次設(shè)計(jì)流水燈依次點(diǎn)亮的方式來閃爍。因此在這里選取索引值來作為存儲(chǔ)碼以減小容量。(3)樂曲的頻率變化多端,對(duì)應(yīng)的分頻系數(shù)也不斷變化,因此需要將播放的樂曲的分頻系數(shù)事先存放在ROM中便于讀取。音階頻率表如表1所示,各音階計(jì)數(shù)初值表如表2所示:音階頻率(Hz)音階頻率(Hz)低音1262中音2578低音2294中音3659低音3330中音5784低音5392中音6880低音6440高音11046低音7494高音21175中音1523高音31318表1 音階頻率表音階計(jì)數(shù)初值對(duì)應(yīng)初始值低音101100000101773低音201110010000912低音3100000011001036低音5100101011011197低音6101000010101290低音7101010111001372中音1101100000101410中音2101110010001480中音3110000001101542中音5110010101101622中音6110100001001668高音1110110000001728高音2110111000111763高音3111000000101794表2 音階初始值表(2)經(jīng)過分頻后的信號(hào)是一個(gè)脈寬極窄的時(shí)鐘信號(hào),必須對(duì)其進(jìn)行脈沖寬度調(diào)整,增大占空比,才能有效地驅(qū)動(dòng)蜂鳴器。采用時(shí)鐘的頻率越高,分頻系數(shù)越大,分頻后的音階頻率就越準(zhǔn)確。 原理框圖總體設(shè)計(jì)流程如下:(1)分頻主要是通過一個(gè)可控分頻器實(shí)現(xiàn)的。音階的各個(gè)頻率可以通過高頻時(shí)鐘進(jìn)行分頻得到。樂音實(shí)際上是有固定頻率的信號(hào)。擴(kuò)展內(nèi)容:1 利用數(shù)碼管顯示播放時(shí)間2利用16*16點(diǎn)陣顯示播放歌曲名稱3利用44鍵盤陣列鍵盤實(shí)現(xiàn)播放歌曲的切換一、二、設(shè)計(jì)原理及方案音樂流水燈主要是點(diǎn)綴公共場(chǎng)合的裝飾品,音樂的播放和流水燈有節(jié)奏地閃爍,同時(shí)達(dá)到聽覺和視覺的完美結(jié)合,成為構(gòu)成其必不可少的條件。在本課程設(shè)計(jì)中使用Altera公司的EP2C35系列的EP2C35F484C7 FPGA芯片,利用SOPCNIOSIIEP2C35開發(fā)板上的資源,實(shí)現(xiàn)一個(gè)音樂流水燈。本課程設(shè)計(jì)通過Altera公司的Quartus II軟件配合武漢凌特電子技術(shù)有限公司生產(chǎn)的LTESOPC02FD型OPC實(shí)驗(yàn)開發(fā)系統(tǒng)來完成設(shè)計(jì)。 音樂流水燈目錄一、緒論 2 2 2二、設(shè)計(jì)原理及方案 3 3 3三、設(shè)計(jì)步驟 5 5 16*16點(diǎn)陣及按鍵選擇模塊 21 37四、設(shè)計(jì)結(jié)果 49五、心得體會(huì) 52六、參考文獻(xiàn) 53附錄A 管腳分配表 54附錄B 動(dòng)態(tài)時(shí)序仿真圖 56一、緒論EDA是電子設(shè)計(jì)自動(dòng)化(Electronic Design Automation)的縮寫,EDA技術(shù)就是以計(jì)算機(jī)為工具,設(shè)計(jì)者在EDA軟件平臺(tái)上,用硬件描述語言完成設(shè)計(jì)文件,然后由計(jì)算機(jī)自動(dòng)地完成邏輯編譯、化簡(jiǎn)、分割、綜合、優(yōu)化、布局、布線和仿真,直至對(duì)于特定目標(biāo)芯片的適配編譯、邏輯映射和編程下載等工作。EDA技術(shù)的出現(xiàn),極大地提高了電路設(shè)計(jì)的效率和可操作性。通過此實(shí)驗(yàn)讓我們進(jìn)一步了解,熟悉和掌握CPLD/FPGA開發(fā)軟件的使用方法及VHDL的編程方法。本設(shè)計(jì)的任務(wù)要求通過編程實(shí)現(xiàn)一段音樂旋律的循環(huán)播放,在音樂播放的過程中,流水燈根據(jù)旋律閃爍。要了解如何產(chǎn)生不同音階的音樂,首先要對(duì)樂音的特性有所了解。在樂曲的構(gòu)成中,樂音的頻率和持續(xù)的時(shí)間是其構(gòu)成的要素。音頻的高低可以通過外部的LED燈的閃爍來顯示,這樣在音樂和流水燈的配合下可以使人產(chǎn)生強(qiáng)烈的節(jié)奏感。要得到不同頻率的方波,就可以根據(jù)此頻率計(jì)算出分頻過程中需要計(jì)數(shù)的點(diǎn)數(shù),從而通過改變可控分頻器的計(jì)數(shù)初值,在達(dá)到計(jì)數(shù)最大值后對(duì)spk端口的信號(hào)取反輸出不同頻率的方波。但同時(shí)由于分頻系數(shù)大使用的計(jì)數(shù)單元增加,從而耗費(fèi)更多的硬件邏輯單元,本次設(shè)計(jì)采用1MHZ的時(shí)鐘信號(hào)。在脈沖寬度調(diào)整時(shí)會(huì)對(duì)此信號(hào)再次二分頻,所以在計(jì)算時(shí),以樂音音階的二倍頻率去求取在特定時(shí)鐘信號(hào)下的分頻系數(shù),以便在調(diào)整占空比后得到正確的音階頻率。如果將分頻系數(shù)直接作為存儲(chǔ)碼存放在寄存器中,勢(shì)必會(huì)占有更大的容量。音階索引表如表3所示:音階低音1低音2低音3低音5索引值1235音階低音6低音7中音1中音2索引值6789音階中音3中音5中音6高音1索引值10121315音階高音2 高音3索引值16 17表3 音階索引表(4)開發(fā)平臺(tái)上的LED燈數(shù)量有限,可以選用有規(guī)律的閃爍。三、設(shè)計(jì)步驟我們知道,聲音的頻譜范圍約在幾十到幾千赫茲,若能利用程序來控制FPGA某個(gè)引腳輸出一定頻率的矩形波,接上揚(yáng)聲器就能發(fā)出相應(yīng)頻率的聲音。樂曲都是由一連串的音符組成,因此按照樂曲的樂譜依次輸出這些音符所對(duì)應(yīng)的頻率,就可以在揚(yáng)聲器上連續(xù)地發(fā)出各個(gè)音符的音調(diào)。由此可見,樂曲中每個(gè)音符的發(fā)音頻率及其持續(xù)的時(shí)間是樂曲能夠連續(xù)演奏的兩個(gè)基本要素,獲取這兩個(gè)要素所對(duì)應(yīng)的數(shù)值以及利用這些數(shù)值實(shí)現(xiàn)所希望樂曲的演奏效果是本實(shí)驗(yàn)的關(guān)鍵。在LED0~LED11引腳上按照簡(jiǎn)單音樂的節(jié)奏有規(guī)律的的輸出流水?dāng)?shù)據(jù),如原來輸出的數(shù)據(jù)是000000000001則表示點(diǎn)亮LED1(共陰接法),流水一次后,輸出的數(shù)據(jù)應(yīng)該為00000000011,而此時(shí)則應(yīng)點(diǎn)亮LED1~LED2兩個(gè)發(fā)光二極管。library ieee。use 。entity tb is port( clk : in std_logic。 speaker driver led : out std_logic_vector(11 downto 0)。 keyr : out std_logic_vector(15 downto 0)。end tb。 signal tone_count : std_logic_vector(10 downto 0)。 signal clk10_count : std_logic_vector(17 downto 0)。 signal clk10 : std_logic。event and clk=39。) then clk10_count=clk10_count+1。 end if。 end process。event and clk10=39。) then if(time=200) then time=0。 end if。 end process。event and clk10=39。) then case time is when 0=tone_index=10。 when 2=tone_index=10。 when 4=tone_index=10。 when 6=tone_index=0。 when 8=tone_index=10。 when 10=tone_index=10。 when 12=tone_index=10。 when 14=tone_index=8。 when 16=tone_index=8。 when 18=tone_index=10。 when 20=tone_index=10。 when 22=tone_index=9。 when 24=tone_index=9。 when 26=tone_index=9。 when 28=tone_index=0。 when 30=tone_index=10。 when 32=tone_index=10。 when 34=tone_index=12。 when 36=tone_index=13。 when 38=tone_index=12。 when 40=tone_index=12。 when 42=tone_index=10。 when 44=tone_index=12。 when 46=tone_index=12。 when 48=tone_index=10。 when 50=tone_index=9。 when 52=tone_index=12。 when 54=tone_index=10。 when 56=tone_index=9。 when 58=tone_i