版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 目 錄</b></p><p><b> 1 緒論2</b></p><p> 1.1 研究背景2</p><p> 1.2 可編程邏輯控件FPGA2</p><p> 1.3 開發(fā)語言VHDL4</p><p> 1.4 開
2、發(fā)環(huán)境MAX+PLUSⅡ5</p><p> 1.5 研究思路及主要工作6</p><p><b> 2 系統設計6</b></p><p> 2.1 系統原理6</p><p> 2.1.1 音調的控制7</p><p> 2.1.2 音長的控制8</p>&
3、lt;p> 2.2 系統結構8</p><p> 3 各模塊設計與仿真9</p><p> 3.1 定制音符數據9</p><p> 3.1.1定制音符數據ROM的mif文件9</p><p> 3.1.2在MAX+PLUSⅡ下定制的LPM_ROM10</p><p> 3.2 音符數據地址
4、發(fā)生器模塊NOTETABS11</p><p> 3.3 預置數查表電路模塊TONETABA12</p><p> 3.4 發(fā)聲頻率產生模塊SPEAKERA14</p><p> 3.5樂曲播放電路頂層電路16</p><p><b> 4 硬件測試16</b></p><p>
5、<b> 5 心得體會17</b></p><p><b> 參考文獻18</b></p><p><b> 附錄19</b></p><p><b> 緒論</b></p><p><b> 1.1 研究背景</b>
6、</p><p> 隨著電子技術的飛速發(fā)展,微電子技術的進步主要表現在大規(guī)模集成電路加工技術即半導體工藝技術的發(fā)展上,使得本征半導體的工藝水平的線寬已經達到了60nm,并在不斷地縮小,面在硅片單位面積上,集成了更多的晶體管。集成電路設計正在不斷地向超大規(guī)模,極低功耗和超高速的方向發(fā)展,電子產品的功能越來越強大,體積越來越小,功耗越來越低。</p><p> 順應電子技術的發(fā)展趨勢,可編
7、程邏輯器件和EDA 技術使設計方法發(fā)生了質的變化。把以前“電路設計+硬件搭試+調試焊接”轉化為“功能設計+軟件模擬+仿真下載”。利用EDA 開發(fā)平臺,采用可編程邏輯器件CPLD/FPGA 使硬件的功能可通過編程來實現,這種新的基于芯片的設計方法能夠使設計者有更多機會充分發(fā)揮創(chuàng)造性思維,實現多種復雜數字邏輯系統的功能,將原來由電路板設計完成的工作放到芯片的設計中進行,減少了連線和體積,提高了集成度,降低了干擾,大大減輕了電路設計和PCB設
8、計的工作量和難度,增強了設計的靈活性,有效地提高了工作效率,增加了系統的可靠性和穩(wěn)定性,提高了技術指標。</p><p> 這些技術使得各種電子產品迅速的進入了我們的生活,我們處在一個被電子產品深度包圍的時代,在一個普通老百姓的家里,衣食住行,每一個產品的誕生都離不開EDA技術,從彩色電視機,到智能冰箱,到全自動洗衣機,電飯煲,到微波爐,電磁爐,電子琴,再到個人隨身用的手機,MP3音樂播放器都需要EDA技術提供
9、支持。</p><p> 本文應用VHDL硬件描述語言,設計一個樂曲硬件播放電路,它能將預先設置存儲好的樂曲自動播放出來,下面對樂曲播放電路的設計與實現中涉及的EDA技術,以及EDA技術中常用的開發(fā)器件CPLD/FPGA可編程邏輯器件,開發(fā)語言VHDL以及開發(fā)軟件MAX+PLUSII作簡單介紹。</p><p> 1.2 可編程邏輯控件FPGA</p><p>
10、 本設計中選用FPGA,主要是因為它與傳統的MCU相比有以下幾個方面的優(yōu)點:</p><p> ?、倬幊谭绞胶啽阆冗M。FPGA產品中部分是采用菊花鏈在系統編程方式的。這種先進的編程方式已成為當今世界上各類可編程器件發(fā)展的趨勢。因為它省卻了價格昂貴,操作不便的專用編程器,只需要一個十分簡單的下載編程電路和一條PC機的打印機通訊線就行了。它無須編程高壓,在TTL電平下隨時可進行在線編程,并可進行所謂菊花鏈式多片串行
11、編程。</p><p> ?、诟呖煽啃?。在高可靠應用領域,MCU的缺憾為FPGA的應用留下了很大的用武之地。這族器件盡管在功能開發(fā)上是通過EDA軟件實現的。但物理機制卻像一片74LS164那樣純屬硬件電路,十分可靠。通過合理設計,大多數應用中,無須考慮復雜的復位和初始化。設計中只需利用簡單的語句將閑置狀態(tài)導入同一初始入口,就能有效防止任何可能的“死機”現象。由于是并行工作,它的任一輸入腳都可用作類似于MCU的中斷
12、監(jiān)測引腳,且反應速度僅為納妙級。FPGA的高可靠性還表現在幾乎可將整個系統下載于同一芯片中,從而大大縮小了體積,易于管理和屏蔽。</p><p> ?、鄹咚?。FPGA的時鐘延遲可達納秒級,結合其并行工作方式,在超高速應用領域和實時測控方面有非常廣闊的應用前景。</p><p> ?、芄δ軓姶?應用廣闊。目前,FPGA的可選擇范圍很大,可根據不同的應用選用不同容量的芯片,如Lattice的i
13、spLSI和AMD公司的MACH,最小芯片的等效邏輯門為1000門,最大達數十萬門。ALTERA和XILINX公司推出的百萬門的FPGA可實現幾乎任何形式的數字電路或數字系統的設計。隨著這類器件的廣泛應用和成本的大幅下降,以及產品上市速率的提高,FPGA在系統中的直接應用率正直逼ASIC的開發(fā)。</p><p> ?、菀讓W易用,開發(fā)便捷。單片機應用系統的設計對于行家里手來說是十分簡單的事。然而,對于初學者,諸如C
14、PU的工作方式、眾多特殊寄存器的用法、中斷概念等等,著實不是一件容易的事。相比之下,FPGA應用的學習卻不需要太多的預備知識,只要稍具一點數字電路和計算機軟件設計的基礎知識,就能在短期內掌握基本的設計方法和開發(fā)技巧。而且反過來去學用單片機,就顯得輕車熟路多了。這無疑是高技術為我們的學習提供了捷徑,站在巨人的肩膀當然能更快地獲得成功??梢灶A言,我國EDA技術的學習熱潮和FPGA的應用熱潮決不會遜色于過去10年的單片機熱潮。</p&g
15、t;<p> ?、揲_發(fā)周期短。由于相應的EDA軟件功能完善而強大,仿真能力便捷而實時,開發(fā)過程形象而直觀,兼之硬件因素涉及甚少,因此可以在很短時間內完成十分復雜的系統設計,這是產品快速進入市場的最寶貴的特征。一些EDA專家預言,未來的大系統的FPGA設計僅僅是各類再應用邏輯與IP核(CORE)的拼裝,其設計周期僅以小時計。TI公司認為,一個ASIC百分之八十的功能可用IP核等現成邏輯合成。</p><p
16、> 1.3 開發(fā)語言VHDL</p><p> VHDL是非常高速集成電路硬件描述語言,是可以描述硬件電路的功能、信號連接關系及定時關系的語言.它能比電路原理圖更有效地表示硬件電路的特性。使用VHDL語言,可以就系統的總體要求出發(fā),自上至下地將設計內容細化,最后完成系統硬件的整體設計。VHDL語言的主要特點是:</p><p> ?、俟δ軓姶?靈活性高:VHDL語言是一種功能強大
17、的語言結構,可用簡潔明確的代碼來進行復雜控制邏輯的設計。同時VHDL語言還支持層次化的設計,支持設計庫和可重復使用的元件生成。目前,VHDL語言已成為一種設計、仿真、綜合的標準硬件描述語言。</p><p> ?、谄骷o關性:VHDL語言允許設計者在生成一個設計時不需要首先選擇一個具體的器件。對于同一個設計描述,可以采用多種不同器件結構來實現其功能。因此設計描述階段,可以集中精力從事設計構思。當設計、仿真通過后,
18、指定具體的器件綜合、適配即可。</p><p> ?、劭梢浦残裕篤HDL語言是一種標準的語言,故采用VHDL進行的設計可以被不同的EDA工具所支持。從一個仿真工具移植到另一個仿真工具,從一個綜合工具移植到另一個綜合工具,從一個工作平臺移植到另一個工作平臺。在一個EDA工具中采用的技術技巧,在其它工具中同樣可以采用。</p><p> ?、茏皂斚蛳碌脑O計方法:傳統的設計方法是,自底向上的設計
19、或平坦式設計。自底向上的設計方法是先從底層模塊設計開始,逐漸由各個模塊形成功能復雜的電路。這種設計方法優(yōu)點是很明顯的,因為它是一種層次設計電路,一般電路的子模塊都是按照結構或功能劃分,因此這種電路層次清楚,結構明確,便于多人合作開發(fā),同時設計文件易于存檔,易于交流。自底向上設計方法的缺點也很明顯,往往由于整體設計思路不對而使的花費幾個月的低層設計付之東流。平坦式設計是整個電路只含有一個模塊,電路的設計是平鋪直敘的,沒有結構和功能上的劃分
20、,因此不是層次電路的設計方式。優(yōu)點是小型電路設計時可以節(jié)省時間和精力,但隨著電路復雜程度的增加,這種設計方式的缺點變的異常突出。自頂向下的設計方法是將要設計的電路進行最頂層的描述(頂層建模),然后利用EDA軟件進行頂層仿真,如果頂層設計的仿真結果滿足要求,則可以繼續(xù)將頂層劃分的模塊進行低一級的劃分并仿真,這樣一級一級設計最終將完成整個電路的設計。自頂向下的設計方法與前面兩種方法相比優(yōu)點是很明顯的。</p><p>
21、; ⑤數據類型豐富:作為硬件描述語言的一種VHDL語言的數據類型非常豐富,除了VHDL語言自身預定義的十種數據類型外,在VHDL語言程序設計中還可以由用戶自定義數據類型。特別是std_logic數據類型的使用,使得VHDL語言能最真實模擬電路中的復雜信號。</p><p> ?、捱\行庫和程序包豐富:目前支持VHDL語言的程序包很豐富,大多以庫的形式存放在特定的目錄下,用戶可隨時調用。如IEEE庫收集了std_l
22、ogic_1164、std_logic_arith、std_logic_unsigned等程序包。在FPGA綜合時,還可以使用EDA軟件商提供的各種庫和程序包。而且用戶利用VHDL語言編寫的各種成果都可以以庫的形式存放,在后續(xù)的設計中可以繼續(xù)使用。</p><p> ?、呓7奖悖河捎赩HDL語言中可綜合的語句和用于仿真的語句齊備,行為描述能力強,因此VHDL語言特別適合信號建模。VHDL語言無論仿真還是綜合都是
23、非常合適的描述語言。</p><p> ?、?VHDL語言是一種硬件電路的建模描述語言,因此與普通的計算機語言有較大差別,普通計算機語言是CPU按照時鐘的節(jié)拍,一條指令執(zhí)行完后才能執(zhí)行下一條指令,因此指令執(zhí)行是有先后順序的,也即是順序執(zhí)行,而每條指令的執(zhí)行占用特定的時間。而與VHDL語言描述結果相對應的是硬件電路,它遵循硬件電路的特點,語句的執(zhí)行沒有先后順序,是并發(fā)的執(zhí)行的;而且語句的執(zhí)行不象普通軟件那樣每條指令
24、占用一定的時間,只是遵循硬件電路自身的延遲時間。</p><p> 1.4 開發(fā)環(huán)境MAX+PLUSⅡ</p><p> MAX+PLUSⅡ提供了全面的邏輯設計能力,包括電路圖、文本和波形的設計輸入以及編譯、邏輯綜合、仿真和定時分析以及器件編程等諸多功能。特別是在原理圖輸入等方面,MAX+PLUSⅡ被公認為是最易使用、人機界面最友好的PLD 開發(fā)軟件。這樣靈活多變的輸入方式,給設計使用
25、者帶來了極大的方便。</p><p> 1.5 研究思路及主要工作</p><p> 本文按照EDA開發(fā)流程,采用VHDL硬件描述語言開發(fā),將樂曲硬件播放電路設計進行模塊化分解,層次化設計,分成幾個單獨的結構體,每個結構體實現部分功能,最后,經頂層文件將各單獨結構體進行綜合,實現樂曲硬件播放。</p><p> 主要工作:根據硬件播放電路的功能進行全局分析,采
26、用自上至下的設計方法,從系統總體要求出發(fā),逐步將設計內容細化,最后完成系統結構的整體設計,實現預先設置樂曲的播放功能。</p><p> 實現功能樂曲播放,需要完成以下設計:</p><p> ?、伲A置樂曲,本文選取了《梁?!放c《歡樂頌》作預置,作預置時,需要將樂曲音符轉換成相應的代碼,通過計算逐一將音符轉換成代碼,通過EDA開發(fā)平臺MAX+PLUSII進行樂曲定制;</p>
27、;<p> ②.為了提供樂曲發(fā)音所需要的發(fā)音頻率,編寫數控分頻器程序,對單一輸入高頻,進行預置數分頻,生成每個音符發(fā)音的相應頻率;</p><p> ③.為了給分頻提供預置數,需要計算分頻預置數;</p><p> ?、埽畬γ坎糠纸Y構單元逐一進行編譯,生成相應的元器件符號,并對獨立結構單元功能進行仿真;</p><p> 啟動MAX+PLUSII
28、全程編譯,生成具體輸入,輸出端口的圖形文件。啟動全程功能仿真,生成仿真波形文件。生成下載文件,在ZYE1502D實驗開發(fā)板上利用Altera公司的FLXE10K—EPF10K10LC84—4芯片進行功能驗。</p><p><b> 系統設計</b></p><p><b> 2.1 系統原理</b></p><p>
29、 傳統數字邏輯設計方法相比,本設計借助于功能強大的EDA工具和硬件描述語言來完成,如果只以純硬件的方法完成樂曲播放電路的設計,將是難以實現的。本設計采用了《梁祝》與《歡樂頌》的曲子來完成。</p><p> 表2.1 簡譜中的音名與頻率的關系表</p><p> 為了便于理解,首先介紹一下硬件電路的發(fā)聲原理。我們知道,聲音的頻譜范圍約在幾十到幾千赫茲,若能利用程序來控制FPGA某個引
30、腳輸出一定頻率的矩形波,接上揚聲器就能發(fā)出相應頻率的聲音。而樂曲中的每一音符對應著一個確定的頻率,因此,要想FPGA發(fā)出不用音符的音調,實際上只要控制它輸出相應音符的頻率即可(音符和頻率的關系見表2.1)。樂曲都是由一連串的音符組成,因此按照樂曲的樂譜依次輸出這些音符所對應的頻率,就可以在揚聲器上連續(xù)地發(fā)出各個音符的音調。而要準確地播放出一首樂曲,僅僅讓揚聲器能夠發(fā)聲是不夠的,還必須準確地控制樂曲的節(jié)奏,即每個音符的持續(xù)時間。由此可見,
31、樂曲中每個音符的發(fā)音頻率及其持續(xù)的時間是樂曲能夠連續(xù)播放的兩個關鍵因素。</p><p> 2.1.1 音調的控制</p><p> 頻率的高低決定了音調的高低。計算出簡譜中從低音1到高音1之間每個音名對應的頻率,所有不同頻率的信號都是從同一個基準頻率分頻得到的。由于音階頻率多為非整數,而分頻系數又不能為小數,因此必須將計算得到的分頻數四舍五入取整。若基準頻率過低,則由于分頻比太小,四
32、舍五入取整后的誤差較大;若基準頻率過高,雖然誤差較小,但分頻數將變大。實際的設計應綜合考慮這兩方面的因素,在盡量減小頻率誤差的前提下取合適的基準頻率。因此,要想FPGA發(fā)出不同音符的音調,實際上只要控制它輸出相應音符的頻率即可。綜合考慮各因素,本文中選取12MHZ作為CLK的分頻計數器的輸入分頻信號。樂曲都是由一連串的音符組成,因此按照樂曲的樂譜依次輸出這些音符所對應的頻率,就可以在揚聲器上連續(xù)地發(fā)出各個音符的音調。</p>
33、<p> 2.1.2 音長的控制</p><p> 音符的持續(xù)時間須根據樂曲的速度及每個音符的節(jié)拍數來確定。因此,在想控制音符的音長,就必須知道樂曲的速度和每個音符所對應的節(jié)拍數,在這個設計中所播放的樂曲的最短的音符為四分音符,如果將全音符的持續(xù)時間設為1s的話,那么一拍所應該持續(xù)的時間為0.25秒,則只需要再提供一個4HZ的時鐘頻率即可產生四分音符的時長。要想讓系統知道現在應該播放哪個音符,而
34、這個音符持續(xù)的時間應該是多少,就必須編寫樂曲文件,在樂曲文件中音符是按地址存放的,當系統工作時就按4Hz的頻率依次讀取簡譜,當系統讀到某個音符的簡譜時就對應發(fā)這個音符的音調,持續(xù)時間為0.25秒,而如果在曲譜文件中這個音符為三拍音長,那又該如何控制呢?其實只要將該音符連續(xù)書寫三遍,這時系統讀樂曲文件的時候就會連續(xù)讀到三次,也就會發(fā)三個0.25秒的音長,這時我們聽上去就會持續(xù)了三拍的時間,通過這樣一個簡單的操作就可以控制音樂的音長了。&l
35、t;/p><p><b> 2.2 系統結構</b></p><p> 本系統主要由三個功能模塊組成:NOTETABS.VHD,TONETABA.VHD和 SPEAKER.VHD。第一部分NOTETABS,地址發(fā)生器,實現按節(jié)拍讀樂譜的功能;第二部分TONETABA,查表電路,為SPEAKER提供分頻預置數,實現樂曲譯碼輸出CODE[4:0];第三部分SPEAKERA
36、,產生發(fā)音頻率,實現樂曲播放;其結構如圖2.1所示。</p><p> 圖2.1 樂曲播放電路結構方框圖</p><p><b> 各模塊設計與仿真</b></p><p> 3.1 定制音符數據</p><p> 3.1.1定制音符數據ROM的mif文件</p><p> 為了實現樂曲
37、的播放,首先需要將曲譜定制到音符數據ROM里面,然后才能按照一定的節(jié)拍從ROM中讀出曲譜。以下定制的是《梁?!放c《歡樂頌》的mif 文件(《梁?!放c《歡樂頌》的簡譜見附錄E、F)。</p><p><b> WIDTH=5;</b></p><p> DEPTH=256;</p><p> ADDRESS_RADIX=DEC;</p
38、><p> DATA_RADIX=DEC;</p><p> CONTENT BEGIN――注意:實用文件中是展開以下數據的,每一組占一行;</p><p> 00:3;01:3;02:3;03:3;04:5;05:5;06:5;07:6;08:8;09:8;10:8;11:9;12:6;</p><p> 13:8;14:5;15:5;
39、16:12;17:12;18:12;19:15;20:13;21:12;22:10;23:12;</p><p> 24:9;25:9;26:9;27:9;28:9;29:9;30:9;31:0;32:9;33:9;34:9;35:10;36:7;</p><p> 37:7;38:6;39:6;40:5;41:5;42:5;43:6;44:8;45:8;46:9;47:9;48:3;
40、49:3;</p><p> 50:8;51:8;52:6;53:5;54:6;55:8;56:5;57:5;58:5;59:5;60:5;61:5;62:5;</p><p> 63:5;64:10;65:10;66:10;67:12;68:7;69:7;70:9;71:9;72:6;73:8;74:5;</p><p> 75:5;76:5;77:5;78
41、:5;79:5;80:3;81:5;82:3;83:3;84:5;85:6;86:7;87:9;</p><p> 88:6;89:6;90:6;91:6;92:6;93:6;94:5;95:6;96:8;97:8;98:8;99:9;100:12</p><p> 101:12;102:12;103:10;104:9;105:9;106:10;107:9;108:8;109:8;11
42、0:6;</p><p> 111:5;112:3;113:3;114:3;115:3;116:8;117:8;118:8;119:8;120:6;121:8;</p><p> 122:6;123:5;124:3;125:5;126:6;127:8;128:5;129:5; 130:10;131:10;</p><p> 132:10;133:10;134:
43、11;135:11;136:12;137:12;138:12;139:12;140:11;</p><p> 141:11;142:10;143:10;144:9;145:9;146:8;147:8;148:8;149:8;150:9;</p><p> 151:9;152:10;153:10;154:10;155:10;156:10;157:9;158:9;159:9;160:9;&
44、lt;/p><p> 161:9;162:10;163:10;164:10;165:10;166:11;167:11;168:12;169:12;</p><p> 170:12;171:12;172:11;173:11;174:10;175:10;176:9;177:9;178:8;179:8;</p><p> 180:8;181:8;182:9;183:9;
45、184:10;185:10;186:9;187:9;188:9;189:8;190:8;</p><p> 191:8;192:8;193:8;194:9;195:9;196:9;197:9;198:10;199:10;200:8;201:8;</p><p> 202:9;203:9;204:10;205:11;206:10;207:10;208:8;209:8;210:9;211:
46、9;</p><p> 212:10;213:11;214:10;215:10;216:8;217:8;218:8;219:8;220:9;221:9;</p><p> 222:5;223:5;224:10;225:10;226:10;227:10;228:10;229:10;230:11;231:11;</p><p> 232:12;233:12;234
47、:12;235:12;236:11;237:11;238:10;239:10;240:9;241:9;</p><p> 242:8;243:8;244:8;245:8;246:9;247:9;248:10;249:10;250:9;251:9;252:9;</p><p> 253:8;254:8;255:8;</p><p><b> END;&
48、lt;/b></p><p> 其中WIDTH=5,表示數據輸出位寬為5;DEPTH=256,表示共有256個5位數據點;ADDRESS-RADIX=DEC,表示地址信號用十進制;DATA-RADIX=DEC,表示輸出數據是十進制數。</p><p> 形成ROM中的配置數據(初始化數據)文件的方法如下:在MAX+PLUSⅡ中編輯.mif文件。首先在File菜單下的New菜單上選
49、擇Text Editor File命令,進入文本編輯器,然后輸入以上格式的數據文件。文件中的關鍵詞WIDTH設置ROM的數據寬度;DEPTH設置ROM數據的深度,文件中設置的5即為5位數據的數量,256等效于8位地址線寬度;ADDRESS-RADIX=DEC和DATA-RADIX=DEC表示設置地址和數據的表達式格式都是十進制;地址/數據表以CONTENT BEGIN開始,以END結束;其中的地址/數據表達方式是冒號左邊寫ROM地址值,
50、冒號右邊寫對應此地址放置的十進制數據,如45:8,表示45為地址,8為該地址中的數據。這樣每讀到一個地址,即可輸出其相應的數據。文件編輯好后,保存時取文件名為“songer.mif”,存盤的路徑為“c:\music \ songer.mif”。</p><p> 3.1.2在MAX+PLUSⅡ下定制的LPM_ROM</p><p><b> 1)具體步驟如下:</b&g
51、t;</p><p> (1) 進入MAX+PLUSⅡ,選菜單 TOOL->megawizard plug-in manager,選擇“creat a new…”,然后按“next”鍵,選擇LPM-ROM;最后在browse下的欄中鍵入路徑與輸出文件名:c:\music \ songer.vhd,注意后綴vhd小寫。</p><p> (2) 單擊“next”
52、鍵,,選擇ROM數據位寬度為5,地址線寬為8,即設置此ROM能存儲5位二進制數據共256個。</p><p> (3) 通過“ browse” 鈕,找到ROM中的加載文件路徑和文件名:c:\music \ songer.mif注意ROM元件的inclock是地址鎖存時鐘。</p><p> (4) 打開已定制的ROM文件songer.vhd,將它設置為工程,并確定目
53、標器件,進行測試仿真波形。</p><p> 2)定制好的ROM文件VHDL程序見附錄A。</p><p> 已定制的ROM文件songer.vhd的仿真波形如圖3.1所示:</p><p> 圖3.1 songer模塊仿真波形圖</p><p><b> 波形分析:</b></p><p&g
54、t; 此樂譜發(fā)生器模塊的功能是輸出存儲在LPM-ROM中的各個音符數據,由上面的仿真波形圖可看到“梁祝”樂曲中的第一個音符為“3”即為“00011”此音在邏輯中停留了4個時鐘,那么相應隨著程序中的地址計數器按4Hz的時鐘頻率作加法計數時,即隨地址遞增時,將從音符數據ROM中將連續(xù)取出4個音符“00011”,樂曲中的第二個音符為“5”即為“00101”此音在邏輯中停留了3個時鐘,相應地,將從音符數據ROM中將連續(xù)取出3個音符“00101
55、”等其它狀態(tài)時,仿真波形圖證明了模塊的功能。</p><p> 3.2 音符數據地址發(fā)生器模塊NOTETABS</p><p> 1)功能:NOTETABS模塊設置了一個8位二進制計數器(計數最大值為256),作為音符數據ROM的地址發(fā)生器。每來一個時鐘脈沖信號(Clk),8位二進制計數器就計數一次,ROM文件中的地址也就隨著遞增,音符數據ROM中的音符也就一個接一個連續(xù)的取出來了。&
56、lt;/p><p> 在地址發(fā)生器的VHDL設計中,這個計數器的計數頻率選為4Hz,即每一計數值的停留時間為0.25秒,恰為當全音符設為1秒,四四拍的4分音符持續(xù)時間。例如,地址發(fā)生器在以下的VHDL邏輯描述中,“梁祝”樂曲的第一個音符為“3”,此音在邏輯中停留了4個時鐘節(jié)拍,即1秒時間。那么相應隨著程序[1]中的計數器按4Hz的時鐘頻率作加法計數時,即隨地址遞增時,將從音符數據ROM中將連續(xù)取出4個音符“3”通過
57、toneindex[4..0]端口輸向分頻預置數模塊。這樣梁祝樂曲中的音符就一個接一個的通過toneindex[4..0]端口輸向分頻預置數模塊。</p><p> 音符數據地址發(fā)生器模塊NOTETABS生成元件符號(見圖3.2):</p><p> 圖3.2 NOTETABS生成元件符號</p><p><b> 端口說明:</b>&l
58、t;/p><p> CLK 4HZ端口:作為節(jié)拍脈沖信號輸入端口;</p><p> RST端口:作為從頭開始播放歌曲脈沖信號輸入端口;</p><p> SEL端口:作為播放第二首歌脈沖信號輸入端口; </p><p> TONEINDE[4..0]端口:作為音符數據地址的輸出端口;</p><p>
59、 對應的程序見附錄B。</p><p> 音符數據地址發(fā)生器模塊NOTETABS的仿真波形如(圖3.3)所示:</p><p> 圖3.3 NOTETABS的仿真波形圖</p><p> 3.3 預置數查表電路模塊TONETABA</p><p> 1)功能:音樂預置數查表電路電路模塊是樂曲簡譜碼對應的分頻預置數查表電路。它提供了每個
60、音符所對應的分頻預置數,即給數控分頻模塊提供計數初值,這里列出了在樂曲中所用到的22個音符的分頻預置數見(表3.1)。</p><p> 在這個模塊的VHDL邏輯描述中設置了四四拍樂曲中全部音符所對應的分頻預置數,共22個,每一音符的停留時間由音樂節(jié)拍和地址發(fā)生器模塊的時鐘(Clk)的輸入頻率決定,在此為4Hz。這22個值的輸出由附錄三的程序的4位輸入值index[4..0]確定。輸向附錄四的程序中index[
61、4..0]的值又由地址發(fā)生器模塊的輸出toneindex[4..0]的輸出值和持續(xù)時間決定。</p><p> 表3.1 各音階對應的分頻預置數關系表</p><p> 預置數查表電路電路模塊TONETABA生成元件符號(見圖3.4):</p><p> 圖3.4 TONETABA生成元件符號</p><p><b> 端口
62、說明:</b></p><p> INDEX[4..0]端口:作為上一級音符數據地址的輸入端;</p><p> CODE[4..0]端口:作為音符數據簡譜碼的輸出顯示端;</p><p> HIGH端口:作為音符數據簡譜碼高8度的輸出顯示端; </p><p> TONE[10..0]端口:作為音符數據分頻預置數的輸出端
63、;</p><p> 對應的程序見附錄C。</p><p> 音符數據地址發(fā)生器模塊NOTETABA的仿真波形如(圖3.5)所示:</p><p> 圖3.5 NOTETABA的仿真波形圖</p><p><b> 波形分析:</b></p><p> 模塊的功能是輸出各個音符所對應的分
64、頻預置數,即當index是“00000”,tone輸出為2047,即休止符的分頻預置數;當index是“00101”時, tone輸出為1197即低音5的分頻預置數;當index是“01010”時, tone輸出為1542即高音1的分頻預置數等等其它狀態(tài)時,tone分別輸出相應音符的13分頻預置數,仿真波形圖證明了程序實現了模塊的功能。</p><p> 3.4 發(fā)聲頻率產生模塊SPEAKERA</p&g
65、t;<p> 1)音符的頻率由數控分頻模塊獲得,這是一個數控分頻電路。它是由一個初值可變的加法計數器構成。該計數器的模為2047,當計數器記滿時,計數器產生一個溢出信號FULL,此溢出信號就是用作發(fā)音的頻率信號。在計數器的輸入端給定不同的初值,而此預置數就是表3.1中的計數初值,就可得到不同音符的發(fā)音頻率信號。它計滿時所需要的計數初值、分頻系數可由下列式子來表示。</p><p> 計數初值(T
66、one)=2047-分頻系數</p><p> 分頻系數=基準頻率/音符的發(fā)生頻率</p><p> 低音時Tone值小,分頻系數大,溢出信號周期長,揚聲器發(fā)出的聲音低,Tone隨音樂的樂譜變化大,自動控制分頻比,實現了數控分頻,發(fā)生信號的頻率與音調Tone成正比。這就是利用數控分頻器自動播放音樂的原理。</p><p> 時鐘(Clk)端輸入的是在十六進制模
67、塊里對12MHz的信號進行16分頻得到的750KHz,750KHz的信號根據分頻預置數模塊中所提供的計數初值,分別得出相應音符頻率的兩倍值。此時從數控分頻器中出來的輸出信號是脈寬極窄的脈沖式信號,為了有利于驅動揚聲器,需另加一個D觸發(fā)器以均衡其占空比,這時的頻率就變?yōu)樵瓉淼?/2,剛好就是相應音符的頻率。數控分頻模塊中對Clk輸入信號的分頻比由11位預置數tone[10..0]決定。SPKOUT的輸出頻率將決定每一個音符的音調,這樣,分
68、頻計數器的預置值tone[10..0]與SPKOUT的輸出頻率就有了對應關系。</p><p> 發(fā)聲頻率產生模塊SPEAKERA生成元件符號(見圖3.6):</p><p> 圖3.6 SPEAKERA生成元件符號</p><p><b> 端口說明:</b></p><p> CLK12MHZ端口:作為發(fā)音頻
69、率初始信號輸入端口;</p><p> TONE[10..0]端口:作為音符數據分頻預置數的輸入端;</p><p> SPKS端口:作為樂曲的聲音輸出端口; 圖3.6 SPEAKERA生成元件符號</p><p> 對應的程序見附錄D。</p><p> 發(fā)聲頻率產生模塊SPEAKERA的仿真波形如(圖3.
70、7)所示:</p><p> 圖3.7 SPEAKERA的仿真波形圖</p><p><b> 波形分析:</b></p><p> Speakera 音樂符數控分頻此模塊的功能是根據初始值Tone的值,對輸入時鐘信號Clk的頻率進行分頻,得到想要的音符的發(fā)聲頻率其時鐘(Clk)端輸入的是在十六進制模塊里對12MHz的信號進行16分頻得到
71、的750KHz,750KHz的信號根據分頻預置數模塊中所提供的計數初值,分別得出相應音符頻率的兩倍值。在分頻預置數模塊中若取 tone[10..0]=912,將發(fā)出音符為低音2的信號頻率的發(fā)聲頻率等等其它狀態(tài),因此這個程序實現了模塊的功能。</p><p> 3.5樂曲播放電路頂層電路</p><p> 根據各個模塊產生的元件符號,連接組成樂曲播放電路頂層文件,其頂層電路分為三個模塊,
72、音符數據地址發(fā)生器模塊NOTETABS,預置數查表電路電路模塊TONETABA,發(fā)聲頻率產生模塊SPEAKERA,圖3.8所示的是頂層電路組成圖。</p><p> 圖3.8 頂層電路組成圖</p><p><b> 硬件測試</b></p><p> 本設計目標器件選用ZYE1502D實驗開發(fā)板上利用Altera公司的FLXE10K—E
73、PF10K10LC84—4芯片進行功能驗證(引腳鎖定的對應關系如表4.1所示),通過EDA開發(fā)工具MAX+PLUSII對各個模塊的VHDL源程序及頂層電路進行編譯、邏輯綜合,完成電路的糾錯、驗證、仿真等各種測試工作,將設計的頂層電路組成圖music.gdf文件內容下載到對應的配置芯片中,外接揚聲器,系統成功實現了樂曲《梁?!放c《歡樂頌》的播放,能自動從頭開始循環(huán)播放,也可隨時起停、整體復位、按鍵選擇播放方式、循環(huán)演奏以及發(fā)光管二極管動態(tài)
74、顯示播放的音符和高8度音調。經實際電路測試驗證,達到了設計的要求。</p><p> 表4.1 實驗箱主板與下載板元件的連接封裝關系表</p><p><b> 心得體會</b></p><p> (1) 本次基于VHDL音樂播放器的設計經過了整體分析、模塊化分析、整體與模塊的仿真分析這樣三個步驟,硬件實現了整體復位、按鍵選擇播放方式、循
75、環(huán)演奏以及發(fā)光管顯示樂譜的功能。</p><p> (2) 在做數控分頻器模塊的仿真時一定要處理好時序問題。</p><p> (3) 本次設計可以說達到了設計要求,但尚有需要改進的地方。隨著樂譜的復雜程度加大,如果依然在音調發(fā)生器的程序中通過時鐘計數來決定音符的輸出,會加大編程的繁雜度,這時一個很好的解決辦法就是把將要演奏的樂譜存放在人為開辟的存儲空間里,這樣只需要在相應地址中讀出音
76、符即可。</p><p> ?。?)通過本次論文設計,讓我進一步了解了數控分頻器的工作原理和功能作用,并學會了利用LPM模塊制作ROM文件的方法,也更深一層地懂得了頂層文件通過例化語句與其他模塊結合的好處,同時對EDA實驗箱的操作有了進一步的了解,熟悉掌握了EDA的文本編程設計方法和仿真波形的編輯。</p><p><b> 參考文獻</b></p>
77、<p> [1]李國洪,沈明山,胡輝編.可編程器件EDA技術與實踐.機械工業(yè)出版社,2005.8.1.</p><p> [2]潘松,黃繼業(yè)編著,EDA技術實用教程.科學出版社,2007.12.</p><p> [3]徐志軍,徐光輝,CPLD/FPGA的開發(fā)與應用,電子工業(yè)出版社,2001</p><p> [4]譚會生,EDA技術基礎,湖南大學
78、出版社,2004</p><p> [5]李巖,黃夫海,基于FPGA的MIDI音樂發(fā)生器設計,2010</p><p> [6]潘曉利,陳學煌,劉永志,基于MIDI模塊的音樂發(fā)生器設計【期刊論文】電子測量技術,2007</p><p> [7]沈明山.EDA技術及可編程器件應用實訓,科學出版社,2004.6(4):318-326.</p><
79、;p> [8]劉婷婷,李軍.電子設計自動化(EDA).北京師范大學出版社,2007,9(2):250-257.</p><p> [9]趙明富,李立軍.EDA技術基礎,北京大學出版社,2007.5(5):221-224.</p><p> [10]刑建平,曾繁泰.VHDL程序設計教程.3版.北京:清華大學出版社,2005:45-46.</p><p>
80、 [11]李洋,EDA技術.2版.機械工業(yè)出版社,2009.</p><p><b> 附錄</b></p><p> 附錄A: 定制好的ROM文件VHDL程序</p><p> LIBRARY ieee;</p><p> USE ieee.std_logic_1164.all;</p><
81、p> ENTITY songer IS</p><p> PORT(address: IN STD_LOGIC_VECTOR (7 DOWNTO 0);</p><p> inclock: IN STD_LOGIC ;</p><p> q: OUT STD_LOGIC_VECTOR (4 DOWNTO 0));</p><p
82、> END songer;</p><p> ARCHITECTURE SYN OF songer IS</p><p> SIGNAL sub_wire0: STD_LOGIC_VECTOR (4 DOWNTO 0);</p><p> COMPONENT lpm_rom</p><p><b> GENERIC
83、 (</b></p><p> lpm_width: NATURAL;</p><p> lpm_widthad: NATURAL;</p><p> lpm_address_control: STRING;</p><p> lpm_outdata: STRING;</p><p>
84、; lpm_file: STRING</p><p><b> );</b></p><p> PORT (address: IN STD_LOGIC_VECTOR (7 DOWNTO 0);</p><p> inclock: IN STD_LOGIC ;</p><p> q: OUT STD_
85、LOGIC_VECTOR (4 DOWNTO 0));</p><p> END COMPONENT;</p><p><b> BEGIN</b></p><p> q <= sub_wire0(4 DOWNTO 0);</p><p> lpm_rom_component : lpm_rom<
86、;/p><p> GENERIC MAP (</p><p> LPM_WIDTH => 5,</p><p> LPM_WIDTHAD => 8,</p><p> LPM_ADDRESS_CONTROL => "REGISTERED",</p><p> LPM_OUTD
87、ATA => "UNREGISTERED",</p><p> LPM_FILE => "C:/music/songer.mif")</p><p> PORT MAP (address => address,inclock => inclock,q => sub_wire0);</p><
88、p><b> END SYN;</b></p><p> 附錄B: 音符數據地址發(fā)生器模塊NOTETABS程序</p><p> LIBRARY IEEE;</p><p> USE IEEE.STD_LOGIC_1164.ALL;</p><p> USE IEEE.STD_LOGIC_UNSIGNED
89、.ALL;</p><p> ENTITY NoteTabs IS</p><p> PORT ( clk : IN STD_LOGIC;</p><p> SEL : IN STD_LOGIC;</p><p> RST : IN STD_LOGIC;</p><p> ToneIndex
90、: OUT STD_LOGIC_VECTOR (4 DOWNTO 0) );</p><p><b> END;</b></p><p> ARCHITECTURE one OF NoteTabs IS</p><p> COMPONENT songer </p><p> PORT( addr
91、ess : IN STD_LOGIC_VECTOR (7 DOWNTO 0);</p><p> inclock : IN STD_LOGIC ;</p><p> q : OUT STD_LOGIC_VECTOR (4 DOWNTO 0));</p><p> END COMPONENT;</p><p> SIGNAL Count
92、er : STD_LOGIC_VECTOR (7 DOWNTO 0);</p><p> SIGNAL S:STD_LOGIC_VECTOR (1 DOWNTO 0);</p><p><b> BEGIN</b></p><p> S(1)<=rst; S(0)<=sel;</p><p> CNT
93、8 : PROCESS(clk, Counter,sel,rst)</p><p> VARIABLE Coun : STD_LOGIC_VECTOR (7 DOWNTO 0);</p><p><b> BEGIN</b></p><p> IF (clk'EVENT AND clk = '1') then&l
94、t;/p><p><b> CASE S IS</b></p><p> WHEN "01"=>Coun:="00000000";Coun:=Coun+1;</p><p> WHEN "10"=>Coun:="10000010";Coun:=Coun
95、+1; </p><p> WHEN "11"=> Coun:=Coun+1;</p><p> WHEN OTHERS=>NULL; </p><p><b> END CASE;</b></p><p><b> END IF;</b>
96、</p><p> Counter<=Coun;</p><p> END PROCESS;</p><p> u1 : songer PORT MAP(address=>Counter , q=>ToneIndex,inclock=>clk);</p><p><b> END;</b>
97、</p><p> 附錄C: 預置數查表電路模塊TONETABA程序</p><p> Library ieee;</p><p> Use ieee.std_logic_1164.all;</p><p> Entity tonetaba is</p><p> Port( index : in std_l
98、ogic_vector(4 downto 0);</p><p> code : out std_logic_vector(4 downto 0);</p><p> high : out std_logic;</p><p> tone : out std_logic_vector(10 downto 0));</p><p><
99、;b> End;</b></p><p> Architecture one of tonetaba is</p><p><b> Begin</b></p><p> Search : process(index)</p><p><b> Begin</b><
100、/p><p> Case index is</p><p> When "00000"=>tone<="11111111111";code<="00000";high<='0';</p><p> When "00001"=>tone<
101、;="01100000101";code<="00001";high<='0';</p><p> When "00010"=>tone<="01110010000";code<="00010";high<='0';</p><
102、;p> When "00011"=>tone<="10000001100";code<="00011";high<='0';</p><p> When "00100"=>tone<="10000110101";code<="00100&
103、quot;;high<='0';</p><p> When "00101"=>tone<="10010101101";code<="00101";high<='0';</p><p> When "00110"=>tone<=&qu
104、ot;10100001010";code<="00110";high<='0';</p><p> When "00111"=>tone<="10101011100";code<="00111";high<='0';</p><p>
105、; When "01000"=>tone<="10110000010";code<="01000";high<='1';</p><p> When "01001"=>tone<="10111001000";code<="01001"
106、;high<='1';</p><p> When "01010"=>tone<="11000000110";code<="01010";high<='1';</p><p> When "01011"=>tone<="11
107、000101000";code<="01011";high<='1';</p><p> When "01100"=>tone<="11001010110";code<="01100";high<='1';</p><p> Wh
108、en "01101"=>tone<="11010000100";code<="01101";high<='1';</p><p> When "01110"=>tone<="11010110101";code<="01110";high
109、<='1';</p><p> When "01111"=>tone<="11011000000";code<="10001";high<='1';</p><p> When "10000"=>tone<="1101110
110、1010";code<="10010";high<='1';</p><p> When "10001"=>tone<="11100000111";code<="10011";high<='1';</p><p> When &q
111、uot;10010"=>tone<="11100010110";code<="10100";high<='1';</p><p> When "10011"=>tone<="11100101111";code<="10101";high<=
112、'1';</p><p> When "10100"=>tone<="11101000110";code<="10110";high<='1';</p><p> When "10101"=>tone<="11101011010&
113、quot;;code<="10111";high<='1';</p><p> When others => null;</p><p><b> End case;</b></p><p> End process;</p><p><b> En
114、d;</b></p><p> 附錄D: 發(fā)聲頻率產生模塊SPEAKRA程序</p><p> LIBRARY IEEE;</p><p> USE IEEE.STD_LOGIC_1164.ALL;</p><p> USE IEEE.STD_LOGIC_UNSIGNED.ALL;</p><p>
115、 ENTITY Speakera IS</p><p> PORT ( clk : IN STD_LOGIC;</p><p> Tone : IN STD_LOGIC_VECTOR (10 DOWNTO 0);</p><p> SpkS : OUT STD_LOGIC );</p><p><b> END;</
116、b></p><p> ARCHITECTURE one OF Speakera IS</p><p> SIGNAL PreCLK, FullSpkS : STD_LOGIC;</p><p><b> BEGIN</b></p><p> DivideCLK : PROCESS(clk)</p&g
117、t;<p> VARIABLE Count4 : STD_LOGIC_VECTOR (3 DOWNTO 0) ;</p><p><b> BEGIN</b></p><p> PreCLK <= '0';</p><p> IF Count4>11 THEN PreCLK <= '
118、;1'; Count4 := "0000";</p><p> ELSIF clk'EVENT AND clk = '1' THEN Count4 := Count4 + 1;</p><p><b> END IF;</b></p><p> END PROCESS;</p>
119、;<p> GenSpkS : PROCESS(PreCLK, Tone)</p><p> VARIABLE Count11 : STD_LOGIC_VECTOR (10 DOWNTO 0);</p><p><b> BEGIN</b></p><p> IF PreCLK'EVENT AND PreCLK =
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 音樂播放器課程設計
- 基于fpga的音樂播放器設計
- 基于 fpga的音樂播放器設計
- 基于單片機音樂播放器設計-課程設計論文
- 音樂播放器課程設計 (2)
- 音樂播放器課程設計報告
- eda課程設計—音樂播放器
- java課程設計音樂播放器
- 基于java的音樂播放器課程設計報告
- 基于java的音樂播放器的設計課程設計
- 基于qt的音樂播放器課程設計報告
- 基于單片機音樂播放器課程設計
- java課程設計---java音樂播放器
- 基于as3.0的音樂播放器設計課程設計報告
- 課程設計--基于單片機的簡易音樂播放器
- 硬件課程設計-基于fpga的mp3音樂播放器說明書
- 基于fpga的mp3音樂播放器設計
- 基于vb的個性播放器課程設計
- android課程設計---基于android系統的音樂播放器設計與實現
- 課程設計-基于單片機的音樂盒播放器設計
評論
0/150
提交評論