版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目 錄</b></p><p><b> 1 緒論2</b></p><p> 1.1 研究背景2</p><p> 1.2 可編程邏輯控件FPGA2</p><p> 1.3 開(kāi)發(fā)語(yǔ)言VHDL4</p><p> 1.4 開(kāi)
2、發(fā)環(huán)境MAX+PLUSⅡ5</p><p> 1.5 研究思路及主要工作6</p><p><b> 2 系統(tǒng)設(shè)計(jì)6</b></p><p> 2.1 系統(tǒng)原理6</p><p> 2.1.1 音調(diào)的控制7</p><p> 2.1.2 音長(zhǎng)的控制8</p>&
3、lt;p> 2.2 系統(tǒng)結(jié)構(gòu)8</p><p> 3 各模塊設(shè)計(jì)與仿真9</p><p> 3.1 定制音符數(shù)據(jù)9</p><p> 3.1.1定制音符數(shù)據(jù)ROM的mif文件9</p><p> 3.1.2在MAX+PLUSⅡ下定制的LPM_ROM10</p><p> 3.2 音符數(shù)據(jù)地址
4、發(fā)生器模塊NOTETABS11</p><p> 3.3 預(yù)置數(shù)查表電路模塊TONETABA12</p><p> 3.4 發(fā)聲頻率產(chǎn)生模塊SPEAKERA14</p><p> 3.5樂(lè)曲播放電路頂層電路16</p><p><b> 4 硬件測(cè)試16</b></p><p>
5、<b> 5 心得體會(huì)17</b></p><p><b> 參考文獻(xiàn)18</b></p><p><b> 附錄19</b></p><p><b> 緒論</b></p><p><b> 1.1 研究背景</b>
6、</p><p> 隨著電子技術(shù)的飛速發(fā)展,微電子技術(shù)的進(jìn)步主要表現(xiàn)在大規(guī)模集成電路加工技術(shù)即半導(dǎo)體工藝技術(shù)的發(fā)展上,使得本征半導(dǎo)體的工藝水平的線寬已經(jīng)達(dá)到了60nm,并在不斷地縮小,面在硅片單位面積上,集成了更多的晶體管。集成電路設(shè)計(jì)正在不斷地向超大規(guī)模,極低功耗和超高速的方向發(fā)展,電子產(chǎn)品的功能越來(lái)越強(qiáng)大,體積越來(lái)越小,功耗越來(lái)越低。</p><p> 順應(yīng)電子技術(shù)的發(fā)展趨勢(shì),可編
7、程邏輯器件和EDA 技術(shù)使設(shè)計(jì)方法發(fā)生了質(zhì)的變化。把以前“電路設(shè)計(jì)+硬件搭試+調(diào)試焊接”轉(zhuǎn)化為“功能設(shè)計(jì)+軟件模擬+仿真下載”。利用EDA 開(kāi)發(fā)平臺(tái),采用可編程邏輯器件CPLD/FPGA 使硬件的功能可通過(guò)編程來(lái)實(shí)現(xiàn),這種新的基于芯片的設(shè)計(jì)方法能夠使設(shè)計(jì)者有更多機(jī)會(huì)充分發(fā)揮創(chuàng)造性思維,實(shí)現(xiàn)多種復(fù)雜數(shù)字邏輯系統(tǒng)的功能,將原來(lái)由電路板設(shè)計(jì)完成的工作放到芯片的設(shè)計(jì)中進(jìn)行,減少了連線和體積,提高了集成度,降低了干擾,大大減輕了電路設(shè)計(jì)和PCB設(shè)
8、計(jì)的工作量和難度,增強(qiáng)了設(shè)計(jì)的靈活性,有效地提高了工作效率,增加了系統(tǒng)的可靠性和穩(wěn)定性,提高了技術(shù)指標(biāo)。</p><p> 這些技術(shù)使得各種電子產(chǎn)品迅速的進(jìn)入了我們的生活,我們處在一個(gè)被電子產(chǎn)品深度包圍的時(shí)代,在一個(gè)普通老百姓的家里,衣食住行,每一個(gè)產(chǎn)品的誕生都離不開(kāi)EDA技術(shù),從彩色電視機(jī),到智能冰箱,到全自動(dòng)洗衣機(jī),電飯煲,到微波爐,電磁爐,電子琴,再到個(gè)人隨身用的手機(jī),MP3音樂(lè)播放器都需要EDA技術(shù)提供
9、支持。</p><p> 本文應(yīng)用VHDL硬件描述語(yǔ)言,設(shè)計(jì)一個(gè)樂(lè)曲硬件播放電路,它能將預(yù)先設(shè)置存儲(chǔ)好的樂(lè)曲自動(dòng)播放出來(lái),下面對(duì)樂(lè)曲播放電路的設(shè)計(jì)與實(shí)現(xiàn)中涉及的EDA技術(shù),以及EDA技術(shù)中常用的開(kāi)發(fā)器件CPLD/FPGA可編程邏輯器件,開(kāi)發(fā)語(yǔ)言VHDL以及開(kāi)發(fā)軟件MAX+PLUSII作簡(jiǎn)單介紹。</p><p> 1.2 可編程邏輯控件FPGA</p><p>
10、 本設(shè)計(jì)中選用FPGA,主要是因?yàn)樗c傳統(tǒng)的MCU相比有以下幾個(gè)方面的優(yōu)點(diǎn):</p><p> ?、倬幊谭绞胶?jiǎn)便先進(jìn)。FPGA產(chǎn)品中部分是采用菊花鏈在系統(tǒng)編程方式的。這種先進(jìn)的編程方式已成為當(dāng)今世界上各類(lèi)可編程器件發(fā)展的趨勢(shì)。因?yàn)樗s了價(jià)格昂貴,操作不便的專(zhuān)用編程器,只需要一個(gè)十分簡(jiǎn)單的下載編程電路和一條PC機(jī)的打印機(jī)通訊線就行了。它無(wú)須編程高壓,在TTL電平下隨時(shí)可進(jìn)行在線編程,并可進(jìn)行所謂菊花鏈?zhǔn)蕉嗥?/p>
11、編程。</p><p> ②高可靠性。在高可靠應(yīng)用領(lǐng)域,MCU的缺憾為FPGA的應(yīng)用留下了很大的用武之地。這族器件盡管在功能開(kāi)發(fā)上是通過(guò)EDA軟件實(shí)現(xiàn)的。但物理機(jī)制卻像一片74LS164那樣純屬硬件電路,十分可靠。通過(guò)合理設(shè)計(jì),大多數(shù)應(yīng)用中,無(wú)須考慮復(fù)雜的復(fù)位和初始化。設(shè)計(jì)中只需利用簡(jiǎn)單的語(yǔ)句將閑置狀態(tài)導(dǎo)入同一初始入口,就能有效防止任何可能的“死機(jī)”現(xiàn)象。由于是并行工作,它的任一輸入腳都可用作類(lèi)似于MCU的中斷
12、監(jiān)測(cè)引腳,且反應(yīng)速度僅為納妙級(jí)。FPGA的高可靠性還表現(xiàn)在幾乎可將整個(gè)系統(tǒng)下載于同一芯片中,從而大大縮小了體積,易于管理和屏蔽。</p><p> ?、鄹咚佟PGA的時(shí)鐘延遲可達(dá)納秒級(jí),結(jié)合其并行工作方式,在超高速應(yīng)用領(lǐng)域和實(shí)時(shí)測(cè)控方面有非常廣闊的應(yīng)用前景。</p><p> ?、芄δ軓?qiáng)大,應(yīng)用廣闊。目前,FPGA的可選擇范圍很大,可根據(jù)不同的應(yīng)用選用不同容量的芯片,如Lattice的i
13、spLSI和AMD公司的MACH,最小芯片的等效邏輯門(mén)為1000門(mén),最大達(dá)數(shù)十萬(wàn)門(mén)。ALTERA和XILINX公司推出的百萬(wàn)門(mén)的FPGA可實(shí)現(xiàn)幾乎任何形式的數(shù)字電路或數(shù)字系統(tǒng)的設(shè)計(jì)。隨著這類(lèi)器件的廣泛應(yīng)用和成本的大幅下降,以及產(chǎn)品上市速率的提高,FPGA在系統(tǒng)中的直接應(yīng)用率正直逼ASIC的開(kāi)發(fā)。</p><p> ?、菀讓W(xué)易用,開(kāi)發(fā)便捷。單片機(jī)應(yīng)用系統(tǒng)的設(shè)計(jì)對(duì)于行家里手來(lái)說(shuō)是十分簡(jiǎn)單的事。然而,對(duì)于初學(xué)者,諸如C
14、PU的工作方式、眾多特殊寄存器的用法、中斷概念等等,著實(shí)不是一件容易的事。相比之下,FPGA應(yīng)用的學(xué)習(xí)卻不需要太多的預(yù)備知識(shí),只要稍具一點(diǎn)數(shù)字電路和計(jì)算機(jī)軟件設(shè)計(jì)的基礎(chǔ)知識(shí),就能在短期內(nèi)掌握基本的設(shè)計(jì)方法和開(kāi)發(fā)技巧。而且反過(guò)來(lái)去學(xué)用單片機(jī),就顯得輕車(chē)熟路多了。這無(wú)疑是高技術(shù)為我們的學(xué)習(xí)提供了捷徑,站在巨人的肩膀當(dāng)然能更快地獲得成功??梢灶A(yù)言,我國(guó)EDA技術(shù)的學(xué)習(xí)熱潮和FPGA的應(yīng)用熱潮決不會(huì)遜色于過(guò)去10年的單片機(jī)熱潮。</p&g
15、t;<p> ⑥開(kāi)發(fā)周期短。由于相應(yīng)的EDA軟件功能完善而強(qiáng)大,仿真能力便捷而實(shí)時(shí),開(kāi)發(fā)過(guò)程形象而直觀,兼之硬件因素涉及甚少,因此可以在很短時(shí)間內(nèi)完成十分復(fù)雜的系統(tǒng)設(shè)計(jì),這是產(chǎn)品快速進(jìn)入市場(chǎng)的最寶貴的特征。一些EDA專(zhuān)家預(yù)言,未來(lái)的大系統(tǒng)的FPGA設(shè)計(jì)僅僅是各類(lèi)再應(yīng)用邏輯與IP核(CORE)的拼裝,其設(shè)計(jì)周期僅以小時(shí)計(jì)。TI公司認(rèn)為,一個(gè)ASIC百分之八十的功能可用IP核等現(xiàn)成邏輯合成。</p><p
16、> 1.3 開(kāi)發(fā)語(yǔ)言VHDL</p><p> VHDL是非常高速集成電路硬件描述語(yǔ)言,是可以描述硬件電路的功能、信號(hào)連接關(guān)系及定時(shí)關(guān)系的語(yǔ)言.它能比電路原理圖更有效地表示硬件電路的特性。使用VHDL語(yǔ)言,可以就系統(tǒng)的總體要求出發(fā),自上至下地將設(shè)計(jì)內(nèi)容細(xì)化,最后完成系統(tǒng)硬件的整體設(shè)計(jì)。VHDL語(yǔ)言的主要特點(diǎn)是:</p><p> ?、俟δ軓?qiáng)大,靈活性高:VHDL語(yǔ)言是一種功能強(qiáng)大
17、的語(yǔ)言結(jié)構(gòu),可用簡(jiǎn)潔明確的代碼來(lái)進(jìn)行復(fù)雜控制邏輯的設(shè)計(jì)。同時(shí)VHDL語(yǔ)言還支持層次化的設(shè)計(jì),支持設(shè)計(jì)庫(kù)和可重復(fù)使用的元件生成。目前,VHDL語(yǔ)言已成為一種設(shè)計(jì)、仿真、綜合的標(biāo)準(zhǔn)硬件描述語(yǔ)言。</p><p> ?、谄骷o(wú)關(guān)性:VHDL語(yǔ)言允許設(shè)計(jì)者在生成一個(gè)設(shè)計(jì)時(shí)不需要首先選擇一個(gè)具體的器件。對(duì)于同一個(gè)設(shè)計(jì)描述,可以采用多種不同器件結(jié)構(gòu)來(lái)實(shí)現(xiàn)其功能。因此設(shè)計(jì)描述階段,可以集中精力從事設(shè)計(jì)構(gòu)思。當(dāng)設(shè)計(jì)、仿真通過(guò)后,
18、指定具體的器件綜合、適配即可。</p><p> ?、劭梢浦残裕篤HDL語(yǔ)言是一種標(biāo)準(zhǔn)的語(yǔ)言,故采用VHDL進(jìn)行的設(shè)計(jì)可以被不同的EDA工具所支持。從一個(gè)仿真工具移植到另一個(gè)仿真工具,從一個(gè)綜合工具移植到另一個(gè)綜合工具,從一個(gè)工作平臺(tái)移植到另一個(gè)工作平臺(tái)。在一個(gè)EDA工具中采用的技術(shù)技巧,在其它工具中同樣可以采用。</p><p> ?、茏皂斚蛳碌脑O(shè)計(jì)方法:傳統(tǒng)的設(shè)計(jì)方法是,自底向上的設(shè)計(jì)
19、或平坦式設(shè)計(jì)。自底向上的設(shè)計(jì)方法是先從底層模塊設(shè)計(jì)開(kāi)始,逐漸由各個(gè)模塊形成功能復(fù)雜的電路。這種設(shè)計(jì)方法優(yōu)點(diǎn)是很明顯的,因?yàn)樗且环N層次設(shè)計(jì)電路,一般電路的子模塊都是按照結(jié)構(gòu)或功能劃分,因此這種電路層次清楚,結(jié)構(gòu)明確,便于多人合作開(kāi)發(fā),同時(shí)設(shè)計(jì)文件易于存檔,易于交流。自底向上設(shè)計(jì)方法的缺點(diǎn)也很明顯,往往由于整體設(shè)計(jì)思路不對(duì)而使的花費(fèi)幾個(gè)月的低層設(shè)計(jì)付之東流。平坦式設(shè)計(jì)是整個(gè)電路只含有一個(gè)模塊,電路的設(shè)計(jì)是平鋪直敘的,沒(méi)有結(jié)構(gòu)和功能上的劃分
20、,因此不是層次電路的設(shè)計(jì)方式。優(yōu)點(diǎn)是小型電路設(shè)計(jì)時(shí)可以節(jié)省時(shí)間和精力,但隨著電路復(fù)雜程度的增加,這種設(shè)計(jì)方式的缺點(diǎn)變的異常突出。自頂向下的設(shè)計(jì)方法是將要設(shè)計(jì)的電路進(jìn)行最頂層的描述(頂層建模),然后利用EDA軟件進(jìn)行頂層仿真,如果頂層設(shè)計(jì)的仿真結(jié)果滿足要求,則可以繼續(xù)將頂層劃分的模塊進(jìn)行低一級(jí)的劃分并仿真,這樣一級(jí)一級(jí)設(shè)計(jì)最終將完成整個(gè)電路的設(shè)計(jì)。自頂向下的設(shè)計(jì)方法與前面兩種方法相比優(yōu)點(diǎn)是很明顯的。</p><p>
21、; ?、輸?shù)據(jù)類(lèi)型豐富:作為硬件描述語(yǔ)言的一種VHDL語(yǔ)言的數(shù)據(jù)類(lèi)型非常豐富,除了VHDL語(yǔ)言自身預(yù)定義的十種數(shù)據(jù)類(lèi)型外,在VHDL語(yǔ)言程序設(shè)計(jì)中還可以由用戶自定義數(shù)據(jù)類(lèi)型。特別是std_logic數(shù)據(jù)類(lèi)型的使用,使得VHDL語(yǔ)言能最真實(shí)模擬電路中的復(fù)雜信號(hào)。</p><p> ?、捱\(yùn)行庫(kù)和程序包豐富:目前支持VHDL語(yǔ)言的程序包很豐富,大多以庫(kù)的形式存放在特定的目錄下,用戶可隨時(shí)調(diào)用。如IEEE庫(kù)收集了std_l
22、ogic_1164、std_logic_arith、std_logic_unsigned等程序包。在FPGA綜合時(shí),還可以使用EDA軟件商提供的各種庫(kù)和程序包。而且用戶利用VHDL語(yǔ)言編寫(xiě)的各種成果都可以以庫(kù)的形式存放,在后續(xù)的設(shè)計(jì)中可以繼續(xù)使用。</p><p> ?、呓7奖悖河捎赩HDL語(yǔ)言中可綜合的語(yǔ)句和用于仿真的語(yǔ)句齊備,行為描述能力強(qiáng),因此VHDL語(yǔ)言特別適合信號(hào)建模。VHDL語(yǔ)言無(wú)論仿真還是綜合都是
23、非常合適的描述語(yǔ)言。</p><p> ⑧ VHDL語(yǔ)言是一種硬件電路的建模描述語(yǔ)言,因此與普通的計(jì)算機(jī)語(yǔ)言有較大差別,普通計(jì)算機(jī)語(yǔ)言是CPU按照時(shí)鐘的節(jié)拍,一條指令執(zhí)行完后才能執(zhí)行下一條指令,因此指令執(zhí)行是有先后順序的,也即是順序執(zhí)行,而每條指令的執(zhí)行占用特定的時(shí)間。而與VHDL語(yǔ)言描述結(jié)果相對(duì)應(yīng)的是硬件電路,它遵循硬件電路的特點(diǎn),語(yǔ)句的執(zhí)行沒(méi)有先后順序,是并發(fā)的執(zhí)行的;而且語(yǔ)句的執(zhí)行不象普通軟件那樣每條指令
24、占用一定的時(shí)間,只是遵循硬件電路自身的延遲時(shí)間。</p><p> 1.4 開(kāi)發(fā)環(huán)境MAX+PLUSⅡ</p><p> MAX+PLUSⅡ提供了全面的邏輯設(shè)計(jì)能力,包括電路圖、文本和波形的設(shè)計(jì)輸入以及編譯、邏輯綜合、仿真和定時(shí)分析以及器件編程等諸多功能。特別是在原理圖輸入等方面,MAX+PLUSⅡ被公認(rèn)為是最易使用、人機(jī)界面最友好的PLD 開(kāi)發(fā)軟件。這樣靈活多變的輸入方式,給設(shè)計(jì)使用
25、者帶來(lái)了極大的方便。</p><p> 1.5 研究思路及主要工作</p><p> 本文按照EDA開(kāi)發(fā)流程,采用VHDL硬件描述語(yǔ)言開(kāi)發(fā),將樂(lè)曲硬件播放電路設(shè)計(jì)進(jìn)行模塊化分解,層次化設(shè)計(jì),分成幾個(gè)單獨(dú)的結(jié)構(gòu)體,每個(gè)結(jié)構(gòu)體實(shí)現(xiàn)部分功能,最后,經(jīng)頂層文件將各單獨(dú)結(jié)構(gòu)體進(jìn)行綜合,實(shí)現(xiàn)樂(lè)曲硬件播放。</p><p> 主要工作:根據(jù)硬件播放電路的功能進(jìn)行全局分析,采
26、用自上至下的設(shè)計(jì)方法,從系統(tǒng)總體要求出發(fā),逐步將設(shè)計(jì)內(nèi)容細(xì)化,最后完成系統(tǒng)結(jié)構(gòu)的整體設(shè)計(jì),實(shí)現(xiàn)預(yù)先設(shè)置樂(lè)曲的播放功能。</p><p> 實(shí)現(xiàn)功能樂(lè)曲播放,需要完成以下設(shè)計(jì):</p><p> ①.預(yù)置樂(lè)曲,本文選取了《梁?!放c《歡樂(lè)頌》作預(yù)置,作預(yù)置時(shí),需要將樂(lè)曲音符轉(zhuǎn)換成相應(yīng)的代碼,通過(guò)計(jì)算逐一將音符轉(zhuǎn)換成代碼,通過(guò)EDA開(kāi)發(fā)平臺(tái)MAX+PLUSII進(jìn)行樂(lè)曲定制;</p>
27、;<p> ?、冢疄榱颂峁?lè)曲發(fā)音所需要的發(fā)音頻率,編寫(xiě)數(shù)控分頻器程序,對(duì)單一輸入高頻,進(jìn)行預(yù)置數(shù)分頻,生成每個(gè)音符發(fā)音的相應(yīng)頻率;</p><p> ③.為了給分頻提供預(yù)置數(shù),需要計(jì)算分頻預(yù)置數(shù);</p><p> ?、埽畬?duì)每部分結(jié)構(gòu)單元逐一進(jìn)行編譯,生成相應(yīng)的元器件符號(hào),并對(duì)獨(dú)立結(jié)構(gòu)單元功能進(jìn)行仿真;</p><p> 啟動(dòng)MAX+PLUSII
28、全程編譯,生成具體輸入,輸出端口的圖形文件。啟動(dòng)全程功能仿真,生成仿真波形文件。生成下載文件,在ZYE1502D實(shí)驗(yàn)開(kāi)發(fā)板上利用Altera公司的FLXE10K—EPF10K10LC84—4芯片進(jìn)行功能驗(yàn)。</p><p><b> 系統(tǒng)設(shè)計(jì)</b></p><p><b> 2.1 系統(tǒng)原理</b></p><p>
29、 傳統(tǒng)數(shù)字邏輯設(shè)計(jì)方法相比,本設(shè)計(jì)借助于功能強(qiáng)大的EDA工具和硬件描述語(yǔ)言來(lái)完成,如果只以純硬件的方法完成樂(lè)曲播放電路的設(shè)計(jì),將是難以實(shí)現(xiàn)的。本設(shè)計(jì)采用了《梁?!放c《歡樂(lè)頌》的曲子來(lái)完成。</p><p> 表2.1 簡(jiǎn)譜中的音名與頻率的關(guān)系表</p><p> 為了便于理解,首先介紹一下硬件電路的發(fā)聲原理。我們知道,聲音的頻譜范圍約在幾十到幾千赫茲,若能利用程序來(lái)控制FPGA某個(gè)引
30、腳輸出一定頻率的矩形波,接上揚(yáng)聲器就能發(fā)出相應(yīng)頻率的聲音。而樂(lè)曲中的每一音符對(duì)應(yīng)著一個(gè)確定的頻率,因此,要想FPGA發(fā)出不用音符的音調(diào),實(shí)際上只要控制它輸出相應(yīng)音符的頻率即可(音符和頻率的關(guān)系見(jiàn)表2.1)。樂(lè)曲都是由一連串的音符組成,因此按照樂(lè)曲的樂(lè)譜依次輸出這些音符所對(duì)應(yīng)的頻率,就可以在揚(yáng)聲器上連續(xù)地發(fā)出各個(gè)音符的音調(diào)。而要準(zhǔn)確地播放出一首樂(lè)曲,僅僅讓揚(yáng)聲器能夠發(fā)聲是不夠的,還必須準(zhǔn)確地控制樂(lè)曲的節(jié)奏,即每個(gè)音符的持續(xù)時(shí)間。由此可見(jiàn),
31、樂(lè)曲中每個(gè)音符的發(fā)音頻率及其持續(xù)的時(shí)間是樂(lè)曲能夠連續(xù)播放的兩個(gè)關(guān)鍵因素。</p><p> 2.1.1 音調(diào)的控制</p><p> 頻率的高低決定了音調(diào)的高低。計(jì)算出簡(jiǎn)譜中從低音1到高音1之間每個(gè)音名對(duì)應(yīng)的頻率,所有不同頻率的信號(hào)都是從同一個(gè)基準(zhǔn)頻率分頻得到的。由于音階頻率多為非整數(shù),而分頻系數(shù)又不能為小數(shù),因此必須將計(jì)算得到的分頻數(shù)四舍五入取整。若基準(zhǔn)頻率過(guò)低,則由于分頻比太小,四
32、舍五入取整后的誤差較大;若基準(zhǔn)頻率過(guò)高,雖然誤差較小,但分頻數(shù)將變大。實(shí)際的設(shè)計(jì)應(yīng)綜合考慮這兩方面的因素,在盡量減小頻率誤差的前提下取合適的基準(zhǔn)頻率。因此,要想FPGA發(fā)出不同音符的音調(diào),實(shí)際上只要控制它輸出相應(yīng)音符的頻率即可。綜合考慮各因素,本文中選取12MHZ作為CLK的分頻計(jì)數(shù)器的輸入分頻信號(hào)。樂(lè)曲都是由一連串的音符組成,因此按照樂(lè)曲的樂(lè)譜依次輸出這些音符所對(duì)應(yīng)的頻率,就可以在揚(yáng)聲器上連續(xù)地發(fā)出各個(gè)音符的音調(diào)。</p>
33、<p> 2.1.2 音長(zhǎng)的控制</p><p> 音符的持續(xù)時(shí)間須根據(jù)樂(lè)曲的速度及每個(gè)音符的節(jié)拍數(shù)來(lái)確定。因此,在想控制音符的音長(zhǎng),就必須知道樂(lè)曲的速度和每個(gè)音符所對(duì)應(yīng)的節(jié)拍數(shù),在這個(gè)設(shè)計(jì)中所播放的樂(lè)曲的最短的音符為四分音符,如果將全音符的持續(xù)時(shí)間設(shè)為1s的話,那么一拍所應(yīng)該持續(xù)的時(shí)間為0.25秒,則只需要再提供一個(gè)4HZ的時(shí)鐘頻率即可產(chǎn)生四分音符的時(shí)長(zhǎng)。要想讓系統(tǒng)知道現(xiàn)在應(yīng)該播放哪個(gè)音符,而
34、這個(gè)音符持續(xù)的時(shí)間應(yīng)該是多少,就必須編寫(xiě)樂(lè)曲文件,在樂(lè)曲文件中音符是按地址存放的,當(dāng)系統(tǒng)工作時(shí)就按4Hz的頻率依次讀取簡(jiǎn)譜,當(dāng)系統(tǒng)讀到某個(gè)音符的簡(jiǎn)譜時(shí)就對(duì)應(yīng)發(fā)這個(gè)音符的音調(diào),持續(xù)時(shí)間為0.25秒,而如果在曲譜文件中這個(gè)音符為三拍音長(zhǎng),那又該如何控制呢?其實(shí)只要將該音符連續(xù)書(shū)寫(xiě)三遍,這時(shí)系統(tǒng)讀樂(lè)曲文件的時(shí)候就會(huì)連續(xù)讀到三次,也就會(huì)發(fā)三個(gè)0.25秒的音長(zhǎng),這時(shí)我們聽(tīng)上去就會(huì)持續(xù)了三拍的時(shí)間,通過(guò)這樣一個(gè)簡(jiǎn)單的操作就可以控制音樂(lè)的音長(zhǎng)了。&l
35、t;/p><p><b> 2.2 系統(tǒng)結(jié)構(gòu)</b></p><p> 本系統(tǒng)主要由三個(gè)功能模塊組成:NOTETABS.VHD,TONETABA.VHD和 SPEAKER.VHD。第一部分NOTETABS,地址發(fā)生器,實(shí)現(xiàn)按節(jié)拍讀樂(lè)譜的功能;第二部分TONETABA,查表電路,為SPEAKER提供分頻預(yù)置數(shù),實(shí)現(xiàn)樂(lè)曲譯碼輸出CODE[4:0];第三部分SPEAKERA
36、,產(chǎn)生發(fā)音頻率,實(shí)現(xiàn)樂(lè)曲播放;其結(jié)構(gòu)如圖2.1所示。</p><p> 圖2.1 樂(lè)曲播放電路結(jié)構(gòu)方框圖</p><p><b> 各模塊設(shè)計(jì)與仿真</b></p><p> 3.1 定制音符數(shù)據(jù)</p><p> 3.1.1定制音符數(shù)據(jù)ROM的mif文件</p><p> 為了實(shí)現(xiàn)樂(lè)曲
37、的播放,首先需要將曲譜定制到音符數(shù)據(jù)ROM里面,然后才能按照一定的節(jié)拍從ROM中讀出曲譜。以下定制的是《梁?!放c《歡樂(lè)頌》的mif 文件(《梁?!放c《歡樂(lè)頌》的簡(jiǎn)譜見(jiàn)附錄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――注意:實(shí)用文件中是展開(kāi)以下數(shù)據(jù)的,每一組占一行;</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,表示數(shù)據(jù)輸出位寬為5;DEPTH=256,表示共有256個(gè)5位數(shù)據(jù)點(diǎn);ADDRESS-RADIX=DEC,表示地址信號(hào)用十進(jìn)制;DATA-RADIX=DEC,表示輸出數(shù)據(jù)是十進(jìn)制數(shù)。</p><p> 形成ROM中的配置數(shù)據(jù)(初始化數(shù)據(jù))文件的方法如下:在MAX+PLUSⅡ中編輯.mif文件。首先在File菜單下的New菜單上選
49、擇Text Editor File命令,進(jìn)入文本編輯器,然后輸入以上格式的數(shù)據(jù)文件。文件中的關(guān)鍵詞WIDTH設(shè)置ROM的數(shù)據(jù)寬度;DEPTH設(shè)置ROM數(shù)據(jù)的深度,文件中設(shè)置的5即為5位數(shù)據(jù)的數(shù)量,256等效于8位地址線寬度;ADDRESS-RADIX=DEC和DATA-RADIX=DEC表示設(shè)置地址和數(shù)據(jù)的表達(dá)式格式都是十進(jìn)制;地址/數(shù)據(jù)表以CONTENT BEGIN開(kāi)始,以END結(jié)束;其中的地址/數(shù)據(jù)表達(dá)方式是冒號(hào)左邊寫(xiě)ROM地址值,
50、冒號(hào)右邊寫(xiě)對(duì)應(yīng)此地址放置的十進(jìn)制數(shù)據(jù),如45:8,表示45為地址,8為該地址中的數(shù)據(jù)。這樣每讀到一個(gè)地址,即可輸出其相應(yīng)的數(shù)據(jù)。文件編輯好后,保存時(shí)取文件名為“songer.mif”,存盤(pán)的路徑為“c:\music \ songer.mif”。</p><p> 3.1.2在MAX+PLUSⅡ下定制的LPM_ROM</p><p><b> 1)具體步驟如下:</b&g
51、t;</p><p> (1) 進(jìn)入MAX+PLUSⅡ,選菜單 TOOL->megawizard plug-in manager,選擇“creat a new…”,然后按“next”鍵,選擇LPM-ROM;最后在browse下的欄中鍵入路徑與輸出文件名:c:\music \ songer.vhd,注意后綴vhd小寫(xiě)。</p><p> (2) 單擊“next”
52、鍵,,選擇ROM數(shù)據(jù)位寬度為5,地址線寬為8,即設(shè)置此ROM能存儲(chǔ)5位二進(jìn)制數(shù)據(jù)共256個(gè)。</p><p> (3) 通過(guò)“ browse” 鈕,找到ROM中的加載文件路徑和文件名:c:\music \ songer.mif注意ROM元件的inclock是地址鎖存時(shí)鐘。</p><p> (4) 打開(kāi)已定制的ROM文件songer.vhd,將它設(shè)置為工程,并確定目
53、標(biāo)器件,進(jìn)行測(cè)試仿真波形。</p><p> 2)定制好的ROM文件VHDL程序見(jiàn)附錄A。</p><p> 已定制的ROM文件songer.vhd的仿真波形如圖3.1所示:</p><p> 圖3.1 songer模塊仿真波形圖</p><p><b> 波形分析:</b></p><p&g
54、t; 此樂(lè)譜發(fā)生器模塊的功能是輸出存儲(chǔ)在LPM-ROM中的各個(gè)音符數(shù)據(jù),由上面的仿真波形圖可看到“梁祝”樂(lè)曲中的第一個(gè)音符為“3”即為“00011”此音在邏輯中停留了4個(gè)時(shí)鐘,那么相應(yīng)隨著程序中的地址計(jì)數(shù)器按4Hz的時(shí)鐘頻率作加法計(jì)數(shù)時(shí),即隨地址遞增時(shí),將從音符數(shù)據(jù)ROM中將連續(xù)取出4個(gè)音符“00011”,樂(lè)曲中的第二個(gè)音符為“5”即為“00101”此音在邏輯中停留了3個(gè)時(shí)鐘,相應(yīng)地,將從音符數(shù)據(jù)ROM中將連續(xù)取出3個(gè)音符“00101
55、”等其它狀態(tài)時(shí),仿真波形圖證明了模塊的功能。</p><p> 3.2 音符數(shù)據(jù)地址發(fā)生器模塊NOTETABS</p><p> 1)功能:NOTETABS模塊設(shè)置了一個(gè)8位二進(jìn)制計(jì)數(shù)器(計(jì)數(shù)最大值為256),作為音符數(shù)據(jù)ROM的地址發(fā)生器。每來(lái)一個(gè)時(shí)鐘脈沖信號(hào)(Clk),8位二進(jìn)制計(jì)數(shù)器就計(jì)數(shù)一次,ROM文件中的地址也就隨著遞增,音符數(shù)據(jù)ROM中的音符也就一個(gè)接一個(gè)連續(xù)的取出來(lái)了。&
56、lt;/p><p> 在地址發(fā)生器的VHDL設(shè)計(jì)中,這個(gè)計(jì)數(shù)器的計(jì)數(shù)頻率選為4Hz,即每一計(jì)數(shù)值的停留時(shí)間為0.25秒,恰為當(dāng)全音符設(shè)為1秒,四四拍的4分音符持續(xù)時(shí)間。例如,地址發(fā)生器在以下的VHDL邏輯描述中,“梁?!睒?lè)曲的第一個(gè)音符為“3”,此音在邏輯中停留了4個(gè)時(shí)鐘節(jié)拍,即1秒時(shí)間。那么相應(yīng)隨著程序[1]中的計(jì)數(shù)器按4Hz的時(shí)鐘頻率作加法計(jì)數(shù)時(shí),即隨地址遞增時(shí),將從音符數(shù)據(jù)ROM中將連續(xù)取出4個(gè)音符“3”通過(guò)
57、toneindex[4..0]端口輸向分頻預(yù)置數(shù)模塊。這樣梁祝樂(lè)曲中的音符就一個(gè)接一個(gè)的通過(guò)toneindex[4..0]端口輸向分頻預(yù)置數(shù)模塊。</p><p> 音符數(shù)據(jù)地址發(fā)生器模塊NOTETABS生成元件符號(hào)(見(jiàn)圖3.2):</p><p> 圖3.2 NOTETABS生成元件符號(hào)</p><p><b> 端口說(shuō)明:</b>&l
58、t;/p><p> CLK 4HZ端口:作為節(jié)拍脈沖信號(hào)輸入端口;</p><p> RST端口:作為從頭開(kāi)始播放歌曲脈沖信號(hào)輸入端口;</p><p> SEL端口:作為播放第二首歌脈沖信號(hào)輸入端口; </p><p> TONEINDE[4..0]端口:作為音符數(shù)據(jù)地址的輸出端口;</p><p>
59、 對(duì)應(yīng)的程序見(jiàn)附錄B。</p><p> 音符數(shù)據(jù)地址發(fā)生器模塊NOTETABS的仿真波形如(圖3.3)所示:</p><p> 圖3.3 NOTETABS的仿真波形圖</p><p> 3.3 預(yù)置數(shù)查表電路模塊TONETABA</p><p> 1)功能:音樂(lè)預(yù)置數(shù)查表電路電路模塊是樂(lè)曲簡(jiǎn)譜碼對(duì)應(yīng)的分頻預(yù)置數(shù)查表電路。它提供了每個(gè)
60、音符所對(duì)應(yīng)的分頻預(yù)置數(shù),即給數(shù)控分頻模塊提供計(jì)數(shù)初值,這里列出了在樂(lè)曲中所用到的22個(gè)音符的分頻預(yù)置數(shù)見(jiàn)(表3.1)。</p><p> 在這個(gè)模塊的VHDL邏輯描述中設(shè)置了四四拍樂(lè)曲中全部音符所對(duì)應(yīng)的分頻預(yù)置數(shù),共22個(gè),每一音符的停留時(shí)間由音樂(lè)節(jié)拍和地址發(fā)生器模塊的時(shí)鐘(Clk)的輸入頻率決定,在此為4Hz。這22個(gè)值的輸出由附錄三的程序的4位輸入值index[4..0]確定。輸向附錄四的程序中index[
61、4..0]的值又由地址發(fā)生器模塊的輸出toneindex[4..0]的輸出值和持續(xù)時(shí)間決定。</p><p> 表3.1 各音階對(duì)應(yīng)的分頻預(yù)置數(shù)關(guān)系表</p><p> 預(yù)置數(shù)查表電路電路模塊TONETABA生成元件符號(hào)(見(jiàn)圖3.4):</p><p> 圖3.4 TONETABA生成元件符號(hào)</p><p><b> 端口
62、說(shuō)明:</b></p><p> INDEX[4..0]端口:作為上一級(jí)音符數(shù)據(jù)地址的輸入端;</p><p> CODE[4..0]端口:作為音符數(shù)據(jù)簡(jiǎn)譜碼的輸出顯示端;</p><p> HIGH端口:作為音符數(shù)據(jù)簡(jiǎn)譜碼高8度的輸出顯示端; </p><p> TONE[10..0]端口:作為音符數(shù)據(jù)分頻預(yù)置數(shù)的輸出端
63、;</p><p> 對(duì)應(yīng)的程序見(jiàn)附錄C。</p><p> 音符數(shù)據(jù)地址發(fā)生器模塊NOTETABA的仿真波形如(圖3.5)所示:</p><p> 圖3.5 NOTETABA的仿真波形圖</p><p><b> 波形分析:</b></p><p> 模塊的功能是輸出各個(gè)音符所對(duì)應(yīng)的分
64、頻預(yù)置數(shù),即當(dāng)index是“00000”,tone輸出為2047,即休止符的分頻預(yù)置數(shù);當(dāng)index是“00101”時(shí), tone輸出為1197即低音5的分頻預(yù)置數(shù);當(dāng)index是“01010”時(shí), tone輸出為1542即高音1的分頻預(yù)置數(shù)等等其它狀態(tài)時(shí),tone分別輸出相應(yīng)音符的13分頻預(yù)置數(shù),仿真波形圖證明了程序?qū)崿F(xiàn)了模塊的功能。</p><p> 3.4 發(fā)聲頻率產(chǎn)生模塊SPEAKERA</p&g
65、t;<p> 1)音符的頻率由數(shù)控分頻模塊獲得,這是一個(gè)數(shù)控分頻電路。它是由一個(gè)初值可變的加法計(jì)數(shù)器構(gòu)成。該計(jì)數(shù)器的模為2047,當(dāng)計(jì)數(shù)器記滿時(shí),計(jì)數(shù)器產(chǎn)生一個(gè)溢出信號(hào)FULL,此溢出信號(hào)就是用作發(fā)音的頻率信號(hào)。在計(jì)數(shù)器的輸入端給定不同的初值,而此預(yù)置數(shù)就是表3.1中的計(jì)數(shù)初值,就可得到不同音符的發(fā)音頻率信號(hào)。它計(jì)滿時(shí)所需要的計(jì)數(shù)初值、分頻系數(shù)可由下列式子來(lái)表示。</p><p> 計(jì)數(shù)初值(T
66、one)=2047-分頻系數(shù)</p><p> 分頻系數(shù)=基準(zhǔn)頻率/音符的發(fā)生頻率</p><p> 低音時(shí)Tone值小,分頻系數(shù)大,溢出信號(hào)周期長(zhǎng),揚(yáng)聲器發(fā)出的聲音低,Tone隨音樂(lè)的樂(lè)譜變化大,自動(dòng)控制分頻比,實(shí)現(xiàn)了數(shù)控分頻,發(fā)生信號(hào)的頻率與音調(diào)Tone成正比。這就是利用數(shù)控分頻器自動(dòng)播放音樂(lè)的原理。</p><p> 時(shí)鐘(Clk)端輸入的是在十六進(jìn)制模
67、塊里對(duì)12MHz的信號(hào)進(jìn)行16分頻得到的750KHz,750KHz的信號(hào)根據(jù)分頻預(yù)置數(shù)模塊中所提供的計(jì)數(shù)初值,分別得出相應(yīng)音符頻率的兩倍值。此時(shí)從數(shù)控分頻器中出來(lái)的輸出信號(hào)是脈寬極窄的脈沖式信號(hào),為了有利于驅(qū)動(dòng)揚(yáng)聲器,需另加一個(gè)D觸發(fā)器以均衡其占空比,這時(shí)的頻率就變?yōu)樵瓉?lái)的1/2,剛好就是相應(yīng)音符的頻率。數(shù)控分頻模塊中對(duì)Clk輸入信號(hào)的分頻比由11位預(yù)置數(shù)tone[10..0]決定。SPKOUT的輸出頻率將決定每一個(gè)音符的音調(diào),這樣,分
68、頻計(jì)數(shù)器的預(yù)置值tone[10..0]與SPKOUT的輸出頻率就有了對(duì)應(yīng)關(guān)系。</p><p> 發(fā)聲頻率產(chǎn)生模塊SPEAKERA生成元件符號(hào)(見(jiàn)圖3.6):</p><p> 圖3.6 SPEAKERA生成元件符號(hào)</p><p><b> 端口說(shuō)明:</b></p><p> CLK12MHZ端口:作為發(fā)音頻
69、率初始信號(hào)輸入端口;</p><p> TONE[10..0]端口:作為音符數(shù)據(jù)分頻預(yù)置數(shù)的輸入端;</p><p> SPKS端口:作為樂(lè)曲的聲音輸出端口; 圖3.6 SPEAKERA生成元件符號(hào)</p><p> 對(duì)應(yīng)的程序見(jiàn)附錄D。</p><p> 發(fā)聲頻率產(chǎn)生模塊SPEAKERA的仿真波形如(圖3.
70、7)所示:</p><p> 圖3.7 SPEAKERA的仿真波形圖</p><p><b> 波形分析:</b></p><p> Speakera 音樂(lè)符數(shù)控分頻此模塊的功能是根據(jù)初始值Tone的值,對(duì)輸入時(shí)鐘信號(hào)Clk的頻率進(jìn)行分頻,得到想要的音符的發(fā)聲頻率其時(shí)鐘(Clk)端輸入的是在十六進(jìn)制模塊里對(duì)12MHz的信號(hào)進(jìn)行16分頻得到
71、的750KHz,750KHz的信號(hào)根據(jù)分頻預(yù)置數(shù)模塊中所提供的計(jì)數(shù)初值,分別得出相應(yīng)音符頻率的兩倍值。在分頻預(yù)置數(shù)模塊中若取 tone[10..0]=912,將發(fā)出音符為低音2的信號(hào)頻率的發(fā)聲頻率等等其它狀態(tài),因此這個(gè)程序?qū)崿F(xiàn)了模塊的功能。</p><p> 3.5樂(lè)曲播放電路頂層電路</p><p> 根據(jù)各個(gè)模塊產(chǎn)生的元件符號(hào),連接組成樂(lè)曲播放電路頂層文件,其頂層電路分為三個(gè)模塊,
72、音符數(shù)據(jù)地址發(fā)生器模塊NOTETABS,預(yù)置數(shù)查表電路電路模塊TONETABA,發(fā)聲頻率產(chǎn)生模塊SPEAKERA,圖3.8所示的是頂層電路組成圖。</p><p> 圖3.8 頂層電路組成圖</p><p><b> 硬件測(cè)試</b></p><p> 本設(shè)計(jì)目標(biāo)器件選用ZYE1502D實(shí)驗(yàn)開(kāi)發(fā)板上利用Altera公司的FLXE10K—E
73、PF10K10LC84—4芯片進(jìn)行功能驗(yàn)證(引腳鎖定的對(duì)應(yīng)關(guān)系如表4.1所示),通過(guò)EDA開(kāi)發(fā)工具M(jìn)AX+PLUSII對(duì)各個(gè)模塊的VHDL源程序及頂層電路進(jìn)行編譯、邏輯綜合,完成電路的糾錯(cuò)、驗(yàn)證、仿真等各種測(cè)試工作,將設(shè)計(jì)的頂層電路組成圖music.gdf文件內(nèi)容下載到對(duì)應(yīng)的配置芯片中,外接揚(yáng)聲器,系統(tǒng)成功實(shí)現(xiàn)了樂(lè)曲《梁祝》與《歡樂(lè)頌》的播放,能自動(dòng)從頭開(kāi)始循環(huán)播放,也可隨時(shí)起停、整體復(fù)位、按鍵選擇播放方式、循環(huán)演奏以及發(fā)光管二極管動(dòng)態(tài)
74、顯示播放的音符和高8度音調(diào)。經(jīng)實(shí)際電路測(cè)試驗(yàn)證,達(dá)到了設(shè)計(jì)的要求。</p><p> 表4.1 實(shí)驗(yàn)箱主板與下載板元件的連接封裝關(guān)系表</p><p><b> 心得體會(huì)</b></p><p> (1) 本次基于VHDL音樂(lè)播放器的設(shè)計(jì)經(jīng)過(guò)了整體分析、模塊化分析、整體與模塊的仿真分析這樣三個(gè)步驟,硬件實(shí)現(xiàn)了整體復(fù)位、按鍵選擇播放方式、循
75、環(huán)演奏以及發(fā)光管顯示樂(lè)譜的功能。</p><p> (2) 在做數(shù)控分頻器模塊的仿真時(shí)一定要處理好時(shí)序問(wèn)題。</p><p> (3) 本次設(shè)計(jì)可以說(shuō)達(dá)到了設(shè)計(jì)要求,但尚有需要改進(jìn)的地方。隨著樂(lè)譜的復(fù)雜程度加大,如果依然在音調(diào)發(fā)生器的程序中通過(guò)時(shí)鐘計(jì)數(shù)來(lái)決定音符的輸出,會(huì)加大編程的繁雜度,這時(shí)一個(gè)很好的解決辦法就是把將要演奏的樂(lè)譜存放在人為開(kāi)辟的存儲(chǔ)空間里,這樣只需要在相應(yīng)地址中讀出音
76、符即可。</p><p> ?。?)通過(guò)本次論文設(shè)計(jì),讓我進(jìn)一步了解了數(shù)控分頻器的工作原理和功能作用,并學(xué)會(huì)了利用LPM模塊制作ROM文件的方法,也更深一層地懂得了頂層文件通過(guò)例化語(yǔ)句與其他模塊結(jié)合的好處,同時(shí)對(duì)EDA實(shí)驗(yàn)箱的操作有了進(jìn)一步的了解,熟悉掌握了EDA的文本編程設(shè)計(jì)方法和仿真波形的編輯。</p><p><b> 參考文獻(xiàn)</b></p>
77、<p> [1]李國(guó)洪,沈明山,胡輝編.可編程器件EDA技術(shù)與實(shí)踐.機(jī)械工業(yè)出版社,2005.8.1.</p><p> [2]潘松,黃繼業(yè)編著,EDA技術(shù)實(shí)用教程.科學(xué)出版社,2007.12.</p><p> [3]徐志軍,徐光輝,CPLD/FPGA的開(kāi)發(fā)與應(yīng)用,電子工業(yè)出版社,2001</p><p> [4]譚會(huì)生,EDA技術(shù)基礎(chǔ),湖南大學(xué)
78、出版社,2004</p><p> [5]李巖,黃夫海,基于FPGA的MIDI音樂(lè)發(fā)生器設(shè)計(jì),2010</p><p> [6]潘曉利,陳學(xué)煌,劉永志,基于MIDI模塊的音樂(lè)發(fā)生器設(shè)計(jì)【期刊論文】電子測(cè)量技術(shù),2007</p><p> [7]沈明山.EDA技術(shù)及可編程器件應(yīng)用實(shí)訓(xùn),科學(xué)出版社,2004.6(4):318-326.</p><
79、;p> [8]劉婷婷,李軍.電子設(shè)計(jì)自動(dòng)化(EDA).北京師范大學(xué)出版社,2007,9(2):250-257.</p><p> [9]趙明富,李立軍.EDA技術(shù)基礎(chǔ),北京大學(xué)出版社,2007.5(5):221-224.</p><p> [10]刑建平,曾繁泰.VHDL程序設(shè)計(jì)教程.3版.北京:清華大學(xué)出版社,2005:45-46.</p><p>
80、 [11]李洋,EDA技術(shù).2版.機(jī)械工業(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: 音符數(shù)據(jù)地址發(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: 預(yù)置數(shù)查表電路模塊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ā)聲頻率產(chǎn)生模塊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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 音樂(lè)播放器課程設(shè)計(jì)
- 基于fpga的音樂(lè)播放器設(shè)計(jì)
- 基于 fpga的音樂(lè)播放器設(shè)計(jì)
- 基于單片機(jī)音樂(lè)播放器設(shè)計(jì)-課程設(shè)計(jì)論文
- 音樂(lè)播放器課程設(shè)計(jì) (2)
- 音樂(lè)播放器課程設(shè)計(jì)報(bào)告
- eda課程設(shè)計(jì)—音樂(lè)播放器
- java課程設(shè)計(jì)音樂(lè)播放器
- 基于java的音樂(lè)播放器課程設(shè)計(jì)報(bào)告
- 基于java的音樂(lè)播放器的設(shè)計(jì)課程設(shè)計(jì)
- 基于qt的音樂(lè)播放器課程設(shè)計(jì)報(bào)告
- 基于單片機(jī)音樂(lè)播放器課程設(shè)計(jì)
- java課程設(shè)計(jì)---java音樂(lè)播放器
- 基于as3.0的音樂(lè)播放器設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)--基于單片機(jī)的簡(jiǎn)易音樂(lè)播放器
- 硬件課程設(shè)計(jì)-基于fpga的mp3音樂(lè)播放器說(shuō)明書(shū)
- 基于fpga的mp3音樂(lè)播放器設(shè)計(jì)
- 基于vb的個(gè)性播放器課程設(shè)計(jì)
- android課程設(shè)計(jì)---基于android系統(tǒng)的音樂(lè)播放器設(shè)計(jì)與實(shí)現(xiàn)
- 課程設(shè)計(jì)-基于單片機(jī)的音樂(lè)盒播放器設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論