版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 樂曲演奏電路的設計</b></p><p> 摘 要 本課程設計主要采用EDA技術設計一個簡易的八音符電子琴,它可通過按鍵輸入來控制音響從而演奏出已存入的樂曲。在課程設計中,系統(tǒng)開發(fā)平臺為Windows XP,程序設計采用VHDL語言,程序運行平臺為QuartusⅡ5.1。然后編寫程序?qū)崿F(xiàn)電子琴的各項功能,使不同的音階對應不同頻率的正弦波,按下不同的鍵時發(fā)
2、出對應頻率的聲音。程序通過調(diào)試運行,時序仿真,電路功能驗證,順利地實現(xiàn)了設計目標。</p><p> 關鍵詞 電子琴;EDA;VHDL;音階;頻率</p><p> Abstract The main use of this curriculum design EDA technology to design a simple eight-note organ, it can be
3、 key to control the audio input so as to have been deposited in a concert of music. In the course design, system development platform for Windows 2000, the procedures VHDL design language, platform for running QuartusⅡ5.
4、1. And then program to achieve the various functions of the organ, so that different scale corresponds to a different frequency sine wave, press different keys when the v</p><p> Key Words Electric piano;
5、EDA; VHDL; scale; frequency</p><p><b> 1 引 言</b></p><p> 隨著信息科學的進步,現(xiàn)代電子產(chǎn)品的性能越來越高,復雜度越來越大,更新步伐也越來越快,電子技術的發(fā)展進入了劃時代的階段。其中電子技術的核心便是電子設計自動化EDA(Electronic Design Automatic)技術。EDA是指以計算機為
6、工作平臺,融合了應用電子技術、計算機技術、智能化技術的最新成果而開發(fā)出的電子CAD通用軟件包,它根據(jù)硬件描述語言VHDL完成的設計文件,自動完成邏輯編譯、化簡、分割、綜合、優(yōu)化、布局布線及仿真,直至完成對于特定目標芯片的適配編譯、邏輯映射和編程下載等工作。本課程設計就是采用EDA技術描述語言VHDL編程實現(xiàn)簡易電子琴的各項功能,是EDA技術應用于實際的一個很好的例子。</p><p> 1.1 課程設計目的&l
7、t;/p><p> 本課程設計主要是基于VHDL文本輸入法設計樂曲演奏電路,該系統(tǒng)基于計算機中時鐘分頻器的原理,采用自頂向下的設計方法來實現(xiàn),通過按鍵輸入來控制音響或者自動演奏已存入的歌曲。系統(tǒng)由樂曲自動演奏模塊、音調(diào)發(fā)生模塊和數(shù)控分頻模塊三個部分組成。系統(tǒng)實現(xiàn)是用硬件描述語言VHDL按模塊化方式進行設計,然后進行編程、時序仿真、電路功能驗證,奏出美妙的樂曲。該設計最重要的一點就是通過按鍵控制不同的音調(diào)發(fā)生,每一個
8、音調(diào)對應不同的頻率,從而輸出對應頻率的聲音。</p><p> 1.2 課程設計內(nèi)容</p><p> ?。?)設計一個簡易的八音符電子琴,它可通過按鍵輸入來控制音響。</p><p> ?。?)系統(tǒng)演奏時可以選擇是手動演奏(由鍵盤輸入)還是自動演奏已存入的樂曲。</p><p> ?。?)能夠自動演奏多首樂曲,且樂曲可重復演奏。</
9、p><p> 1.3 課程設計原理</p><p> 本課程設計目的在于靈活運用EDA技術編程實現(xiàn)一個簡易電子琴的樂曲演奏,它要求在實驗箱上構造一個電子琴電路,不同的音階對應不同頻率的正弦波。按下每個代表不同音階的按鍵時,能夠發(fā)出對應頻率的聲音。故系統(tǒng)可分為樂曲自動演奏模塊(AUTO)、音調(diào)發(fā)生模塊(TONE)和數(shù)控分頻模塊(FENPIN)三部分。系統(tǒng)的整體組裝設計原理圖如圖1-1所示。&
10、lt;/p><p> 圖1-1 系統(tǒng)的整體組裝設計原理圖</p><p> 由于設計分模塊組成,每個單獨的模塊都是一個完整的源程序,分別實現(xiàn)不同性質(zhì)的功能,但是每個模塊又是緊密關聯(lián)的,前一個模塊的輸出很可能是后一模塊的輸入。如AUTO模塊的音符信號輸出就是TONE模塊的音符信號輸入。另外,時鐘脈沖信號在本課程設計中用的最多,用處也最大,一般情況下時鐘信號處上升沿有效,判斷和控制各個計數(shù)器
11、計數(shù)多少。</p><p> 2 EDA、VHDL簡介</p><p> EDA技術是以計算機為工作平臺,融合了應用電子技術、計算機技術、信息處理及智能化技術的最新成果,進行電子產(chǎn)品的自動設計。EDA可提供文本輸入以及圖形編輯的方法將設計者的意圖用程序或者圖形方式表達出來,而我們經(jīng)常用到的VHDL語言便是用于編寫源程序所需的最常見的硬件描述語言(HDL)之一。</p>&
12、lt;p><b> 2.1 EDA技術</b></p><p> EDA是電子設計自動化(Electronic Design Automation)縮寫,是90年代初從CAD、CAM、CAT和CAE的概念發(fā)展而來的。EDA技術是電子設計的發(fā)展趨勢,利用EDA工具可以代替設計者完成電子系統(tǒng)設計中的大部分工作。EDA工具從數(shù)字系統(tǒng)設計的單一領域,發(fā)展到今天,應用范圍已涉及模擬、微波等多
13、個領域,可以實現(xiàn)各個領域電子系統(tǒng)設計的測試、設計方針和布局布線等。</p><p> 現(xiàn)在對EDA的概念或范疇用得很寬,包括在機械、電子、通信、航空航天、化工、礦產(chǎn)、生物、醫(yī)學、軍事等各個領域,都有EDA的應用。目前EDA主要輔助進行三個方面的設計工作:IC設計、電子電路設計和PCB設計。</p><p> 2.2 VHDL語言</p><p> 常用硬件描述
14、語言有VHDL、Verilog和ABEL語言,而VHDL主要用于描述數(shù)字系統(tǒng)的結構、行為、功能和接口。除了含有許多具有硬件特征的語句外,VHDL的結構特點是將設計實體的內(nèi)部功能和算法完成部分。</p><p> 相對于其他硬件語言,VHDL有許多優(yōu)點。比如VHDL的行為描述能力更強,而且具有豐富的仿真語句和庫函數(shù),隨時可對系統(tǒng)進行仿真模擬,使設計者對整個工程的結構和功能可行性做出判斷;另外,由于具有類屬描述語句
15、和子程序調(diào)用等功能,對于完成的設計,在不改變源程序的條件下,只需改變類屬參量和函數(shù),就能輕易地改變設計的規(guī)模和結構。</p><p> 3 簡易電子琴的設計過程</p><p> 根據(jù)系統(tǒng)設計要求,系統(tǒng)該系統(tǒng)基于計算機中時鐘分頻器的原理,設計采用自頂向下的設計方法,通過按鍵輸入來控制音響或者自動演奏已存入的歌曲。它由樂曲自動演奏模塊、音調(diào)發(fā)生模塊和數(shù)控分頻模塊三部分組成。</p&
16、gt;<p> 3.1 樂曲自動演奏模塊</p><p> 樂曲自動演奏模塊的作用是產(chǎn)生8位發(fā)生控制輸入信號。當進行自動演奏時,由存儲在此模塊的8位二進制數(shù)作為發(fā)聲控制輸入,從而自動演奏樂曲。</p><p> 該模塊的VHDL源程序主要由3個工作進程組成,分別為PULSE0,MUSIC和COM1。PULSE0的作用是根據(jù)鍵盤輸入(自動演奏)的值(0或1)來判斷計數(shù)器C
17、OUNT以及脈沖CLK2的輸出值。部分源程序如下:</p><p> PULSE0:PROCESS(CLK,AUTO) --工作進程開始</p><p> VARIABLE COUNT:INTEGER RANGE 0 TO 8; --定義計數(shù)器變量,值從0到8</p><p> IF AUTO='1'
18、;THEN --鍵盤輸入為1</p><p> COUNT:=0;CLK2<='0'; --計數(shù)器值指0,時鐘信號為0</p><p> ELSIF(CLK'EVENT AND CLK='1')THEN --時鐘輸入信號為1</p>
19、;<p> COUNT:=COUNT+1; --計數(shù)器加1</p><p> 當確定了時鐘信號輸出的值后,在第二個PROCESS中就可以由它控制8位發(fā)聲控制輸入信號了。即CLK2的值為0時,COUNT0為1。最后的COM1便是由前兩個PROCESS所確定的COUNT0、AUTO和鍵盤輸入信號值INDEX2將8位的二進制數(shù)轉(zhuǎn)化為音符信號的輸出,達到自動演
20、奏的目的。部分源程序如下:</p><p> IF AUTO='0'THEN</p><p> CASE COUNT0 IS</p><p> WHEN 0=>INDEX0<="00000100"; --3</p><p> WHEN 4=>INDEX0<="00
21、010000"; --5</p><p> 該模塊最主要的用途就是將輸入二進制數(shù)轉(zhuǎn)化為發(fā)聲控制輸入,是產(chǎn)生音符的重要步驟, AUTO模塊的源程序符號編輯圖如圖3-1。</p><p> 圖3-1 AUTO模塊的符號編輯圖</p><p> 3.2 音調(diào)發(fā)生模塊</p><p> 音調(diào)發(fā)生模塊的作用是產(chǎn)生音階的分頻預置值。
22、當8位發(fā)聲控制輸入信號中的某一位為高電平時,則對應某一音階的數(shù)值將輸出,該數(shù)值即為該音階的分頻預置值,分頻預置值控制數(shù)控分頻模塊進行分頻,由此得到每個音階對應的頻率。</p><p> 該模塊的唯一輸入信號INDEX對應就是自動模塊中最后的輸出INDEX0,音符顯示信號CODE,高低音顯示信號HIGH和音符分頻系數(shù)都是根據(jù)音符輸入確定的。比如我們自定義INDEX第8位為高電平時,它的分頻系數(shù)則為773Hz,音符
23、顯示信號為1001111,即是773的二進制表示,此時高低音顯示1表示高音。部分源程序如下:</p><p> CASE INDEX IS</p><p> WHEN"00000010"=>TONE0<=912;CODE<="0010010";HIGH<='1'; </p><p>
24、; --音符第7位為1,分頻數(shù)912Hz,音符顯示為0010010,屬高音</p><p> WHEN"01000000"=>TONE0<=1372;CODE<="0001111";HIGH<='0';</p><p> WHEN OTHERS =>TONE0<=2047;CODE<
25、="0000001";HIGH<='0';</p><p> 顯然,該模塊最主要的作用就是給音符輸入預設頻率值,因為,電子琴最終實現(xiàn)樂曲演奏就是輸出不同頻率的正弦波,此模塊就是將二進制發(fā)聲信號轉(zhuǎn)化為對應的頻率。</p><p> TONE模塊的源程序符號編輯圖如圖3-2</p><p> 3-2 TONE模塊的源程序符
26、號編輯圖</p><p> 3.3 數(shù)控分頻模塊</p><p> 數(shù)控分頻模塊是對時基脈沖進行分頻,得到與0、1、2、3、4、5、6、7八個音符相對應的頻率。</p><p> 該模塊主要由4個工作進程組成。首先,根據(jù)系統(tǒng)時鐘信號的輸入得到時基脈沖以及計數(shù)器的值,而時鐘信號在AUTO模塊中便已給出,兩者之間的設置關系類似于AUTO模塊中第一個工作進程的設置。
27、第二個PROCESS是此模塊的核心,即由時基脈沖值轉(zhuǎn)化為音符的頻率。部分源程序如下:</p><p> VARIABLE COUNT11:INTEGER RANGE 0 TO 2047; </p><p> --定義頻率計數(shù)器,從0到2047Hz</p><p> IF(PRECLK'EVENT AND PRECLK='1')THEN
28、 --時基脈沖為1時</p><p> IF COUNT11<TONE1 THEN --頻率計數(shù)器小于音符分頻系數(shù)</p><p> COUNT11:=COUNT11+1;FULLSPKS<='1'; --計數(shù)加1,揚聲器音頻為1</p><p><b> ELSE</b>&
29、lt;/p><p> COUNT11:=0;FULLSPKS<='0';</p><p> 最后一個PROCESS則是用來設置揚聲器輸出信號的,揚聲器信號由0和1控制,當且僅當前一個PROCESS中的FULLSPKS輸出為1時,揚聲器才有輸出,再根據(jù)計數(shù)器取值來確定輸出是1還是0。部分源程序如下:</p><p> IF(FULLSPKS
30、39;EVENT AND FULLSPKS='1')THEN --揚聲器音頻信號為1</p><p> COUNT2:=NOT COUNT2;</p><p> IF COUNT2='1'THEN</p><p> SPKS<='1'; --揚聲器輸出為1</p>
31、;<p> ELSE SPK<=’0’; </p><p> FENPIN模塊的源程序符號編輯圖如圖3-3</p><p> 3-3 FENPIN模塊的源程序符號編輯圖</p><p><b> 3.4 頂層設計</b></p><p> 該DIANZIQIN模塊是整個電子琴設計的核心,也
32、是VHDL程序的主程序,前面3個源程序都是作為子程序分別實現(xiàn)電子琴的某一功能,而DIANZIQIN模塊則通過調(diào)用子程序最終實現(xiàn)樂曲演奏的目的,奏出美妙的樂曲。利用VHDL語言COMPONENT將三個模塊組合起來,其中3個模塊和DIANZIQIN模塊的輸入輸出是一一對應的,比如AUTO對應HANDTOAUTO,TONE0對應TONE2,SPKS對應SPKOUT等,該模塊的符號編輯圖如圖3-4。</p><p>
33、圖3-4 DIANZIQIN模塊的符號編輯圖</p><p> 該圖描述的是DIANZIQIN模塊輸入輸出的變量表示,整個系統(tǒng)的整體組裝設計原理圖就是這4幅編輯圖按輸入輸出關系順序連接而成的。</p><p><b> 4 系統(tǒng)仿真</b></p><p> 系統(tǒng)仿真是在實際系統(tǒng)上進行實驗研究比較困難時適用的必不可少的工具,它是指通過系
34、統(tǒng)模型實驗去研究一個已經(jīng)存在或正在設計的系統(tǒng)的過程,通俗地講,就是進行模型實驗。因而,系統(tǒng)仿真的結果決定整個課程設計任務完成的到位程度。</p><p><b> 4.1 時序仿真</b></p><p> 編譯完成后,可以對所進行的設計進行仿真,下面簡單介紹一下仿真的步驟。</p><p> 本課程設計的仿真平臺是QuartusⅡ5.1
35、,通過對VHDL源程序進行編譯檢錯,然后創(chuàng)建波形文件(后綴名為.swf),加入輸入輸出變量,選擇適用的芯片(ACEX1K-EP1K100QC208-3)以及設定仿真結束時間(100us),設置好輸入初值進行仿真,得到仿真波形圖。由于電子琴4個模塊都是獨立的程序,可分別對各個程序仿真,驗證輸入輸出的正確性,但在最終能演奏出樂曲的則是頂層設計模塊。</p><p> 樂曲自動演奏模塊的仿真如圖4-1所示。</
36、p><p> 圖4-1 樂曲自動演奏模塊的仿真圖</p><p> 該圖輸入系統(tǒng)時鐘信號CLK周期200ns,自動演奏AUTO設為0,鍵盤輸入信號INDEX2為00000010,INDEX0為音符信號輸出。</p><p> 音調(diào)發(fā)生模塊的仿真如圖4-2所示。</p><p> 圖4-2 音調(diào)發(fā)生模塊的仿真圖</p>&
37、lt;p> 該圖輸入音符信號INDEX初值為00000001,輸出是音符顯示信號CODE為1001111,高低音顯示信號為1,音符的分頻系數(shù)為1100000101即773Hz。</p><p> 數(shù)控分頻模塊的仿真如圖4-3所示。</p><p> 圖4-3 數(shù)控分頻模塊的仿真圖</p><p> 該圖輸入系統(tǒng)時鐘信號CLK1(各輸出值都是在時鐘信號
38、的下降沿有效),音符分頻系數(shù)TONE1為00100000,驅(qū)動揚聲器的音頻信號SPKS輸出為1。</p><p> 簡易電子琴整個系統(tǒng)的仿真如圖4-4所示。</p><p> 圖4-3 簡易電子琴整個系統(tǒng)的仿真圖</p><p> 該圖輸入系統(tǒng)時鐘信號CLK32MHZ,自動演奏信號HANDTOAUTO初值為0,鍵盤輸入信號INDEX1為10000000;輸出
39、音符信號CODE1則為0000000,高低音節(jié)信號HIGH1變?yōu)?,即高音,音頻信號SPKOUT即輸出0,輸出為1時CODE1變?yōu)?000110。</p><p> 4.2 電路功能驗證</p><p> 如果說前面的過程都是理論上進行軟件設計制作,那么電路驗證則是硬件產(chǎn)生實際結果的必要步驟,它是軟件編程導入硬件系統(tǒng)得到最終設計目標的一個過程。此課程設計中主要用到的硬件設施有ACEX1
40、K-EP1K100QC208-3芯片、一個12MHz的頻率元件、揚聲器、脈沖開關、發(fā)光二極管等,硬件和軟件系統(tǒng)相連接的樞紐就是芯片引腳和VHDL主程序中所有輸入輸出之間對應的關系,它們滿足:CLK→79引腳、HANDTOAUTO→45、INDEX10→46、INDEX11→47、INDEX12→53、INDEX13→54、INDEX14→55、INDEX15→56、INDEX16→57、HIGH1→19、SPKOUT→68引腳。<
41、/p><p> 在選擇好芯片以及設置引腳值后,下載源程序(后綴名.sof)到此芯片上,確認編程器硬件是否已安裝好。按如下步驟打開編程器窗口:在Tool菜單中選擇Programmer項,再次對源程序進行編譯導入程序然后運行,揚聲器發(fā)出初設的音符3,5音即報警。手按鍵盤或撥脈沖開關改變輸入信號則揚聲器發(fā)出對應的頻率的聲音,鍵盤(開關)是與芯片引腳對應相連的。</p><p><b>
42、 4.3 問題分析</b></p><p> 在整個課程設計中,不可避免遇到很多難于解決的問題,一來是對EDA技術的不太了解,初涉VHDL語言以致很多語法和語言基本結構、算法生疏,運用不靈活,在編寫源程序上遇到很大難題,而且在編譯運行程序時對出錯的語句理解不到位,難于下手修改錯誤語句,這使得在設計程序時遇到很阻礙。</p><p> 在完成電路驗證這一步時,對頻率的選擇也是
43、一大難點,有的設計項目對頻率的要求很高,需要大頻率元件才能滿足設計需求,若頻率元件選擇不恰當,將嚴重影響設計結果甚至沒有結果輸出。對于設計電子琴時,由于要求輸出不同頻率的聲音,頻率變化范圍大,故需要一個12MHz的元件,對于小于這一值的頻率不足以滿足電路需求,仿真時只有一堆雜音輸出。</p><p> 在對于設計時遇到的不同問題時,首先應該理解問題關鍵所在,因為用語言編寫程序需要仔細認真的態(tài)度,一點點錯誤漏洞將
44、導致整個源程序無法編譯運行,阻礙下一步工作完成進度。</p><p><b> 5 結束語</b></p><p> 通過這次VHDL課程設計,不僅增強了我們的實踐動手能力,也讓我們對課堂上所學到的理論知識的理解加深了許多,這給我們提供了一個在學習生活中很難得的理論聯(lián)系實際的機會。能夠借此機會了解到部分EDA技術的知識和學習運用其中一種硬件描述語言VHDL編程實現(xiàn)
45、各種常用器件的功能,這是在哪堂講課上都得不到的一筆財富。</p><p> 另一方面我們也發(fā)現(xiàn)了在平時學習過程中難于發(fā)現(xiàn)的許多缺點跟不足。比如實踐機會過少,所學的理論知識不能靈活運用,在遇到實際的問題時無法正確處理;再者在課堂上獲得的專業(yè)知識過于淺顯,很多的有關基本操作原理、操作方法都理解不了;課外知識了解的也過少,導致在課程設計初期,面對完全陌生的設計課題無從下手,不知所措。這就提醒我們在平時的學習生活中不能
46、一味埋頭于面前的課本知識,畢竟當今社會競爭越發(fā)激烈,而學校能教授的東西有限,要想在人才市場中脫穎而出就只能靠我們自己。當然,在學習之余我們更應該積極參加各種有關專業(yè)知識的實踐活動和比賽,鞏固所學理論,多注意培養(yǎng)初步的實際工作能力和專業(yè)技術能力,這樣在以后的工作崗位上不會顯得那么倉促與生疏。</p><p><b> 參考文獻</b></p><p> [1] 辛春
47、艷. VHDL硬件描述語言. 北京:國防工業(yè)出版社,2002</p><p> [2] 甘歷. VHDL應用與開發(fā)實踐. 北京:科學出版社,2003</p><p> [3]VHDL Language Reference Guide ,Alde Inc . Henderson NV USA ,1999</p><p> [4] 齊洪喜,陸穎. VHDL電路設
48、計實用教程. 北京:清華大學出版社,2004</p><p> [5]潘松,黃繼業(yè). EDA技術實用教程. 北京:科學出版社,2002</p><p> 附錄1:樂曲自動演奏源程序清單</p><p> --程序名稱:AUTO.VHD</p><p> --程序功能:采用VHDL語言編程產(chǎn)生8位發(fā)聲控制輸入信號。</p>
49、<p> LIBRARY IEEE;</p><p> USE IEEE.STD_LOGIC_1164.ALL;</p><p> USE IEEE.STD_LOGIC_ARITH.ALL;</p><p> USE IEEE.STD_LOGIC_UNSIGNED.ALL;</p><p> ENTITY AUTO I
50、S</p><p> PORT(CLK: IN STD_LOGIC; --系統(tǒng)時鐘信號</p><p> AUTO: IN STD_LOGIC; --鍵盤輸入/自動演奏</p><p> CLK2: BUFFER STD_LOGIC;
51、 --時鐘輸出</p><p> INDEX2: IN STD_LOGIC_VECTOR(7 DOWNTO 0); --鍵盤輸入信號</p><p> INDEX0: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --音符信號輸出</p><p><b> END AUTO;</b></p>
52、<p> ARCHITECTURE BEHAVIORAL OF AUTO IS</p><p> SIGNAL COUNT0:INTEGER RANGE 0 TO 31; --定義信號計數(shù)器,有32個信號元素</p><p><b> BEGIN</b></p><p> PULSE0:PROCESS(CLK,AUTO)
53、 --PULSE0工作進程開始</p><p> VARIABLE COUNT:INTEGER RANGE 0 TO 8; --定義變量計數(shù)器,從0到8</p><p><b> BEGIN</b></p><p> IF AUTO='1'THEN
54、 --鍵盤輸入為1</p><p> COUNT:=0;CLK2<='0'; --計數(shù)器值為0,時鐘信號2幅值為0</p><p> ELSIF(CLK'EVENT AND CLK='1')THEN --輸入的時鐘信號為其他值</p><p> COUNT:=COUNT+1
55、; --計數(shù)器加1即為1</p><p> IF COUNT=4 THEN </p><p> CLK2<='1';</p><p> ELSIF COUNT=8 THEN</p><p> CLK2<='0';COUNT:=0;
56、</p><p><b> END IF;</b></p><p><b> END IF;</b></p><p> END PROCESS;</p><p> MUSIC:PROCESS(CLK2) --MUSIC工作進程開始</p>
57、<p><b> BEGIN</b></p><p> IF(CLK2'EVENT AND CLK2='1')THEN --時鐘信號2為1</p><p> IF(COUNT0=31)THEN --計數(shù)器值為31</p><p> COUNT0<=
58、0; --計數(shù)器清0</p><p><b> ELSE</b></p><p> COUNT0<=COUNT0+1;</p><p><b> END IF;</b></p><p><b> END IF;</b>
59、</p><p> END PROCESS;</p><p> COM1:PROCESS(COUNT0,AUTO,INDEX2)</p><p><b> BEGIN</b></p><p> IF AUTO='0'THEN --鍵盤輸入為0</
60、p><p> CASE COUNT0 IS --由計數(shù)器從0到31的取值判斷音符信號的8位二進制數(shù)</p><p> WHEN 0=>INDEX0<="00000100"; --3</p><p> WHEN 1=>INDEX0<="00000100"; --3</
61、p><p> WHEN 2=>INDEX0<="00000100"; --3</p><p> WHEN 3=>INDEX0<="00000100"; --3</p><p> WHEN 4=>INDEX0<="00010000"; --5</p
62、><p> WHEN 5=>INDEX0<="00010000"; --5</p><p> WHEN 6=>INDEX0<="00010000"; --5</p><p> WHEN 7=>INDEX0<="00100000"; --6</p&
63、gt;<p> WHEN 8=>INDEX0<="10000000"; --8</p><p> WHEN 9=>INDEX0<="10000000"; --8</p><p> WHEN 10=>INDEX0<="10000000"; --8</p&g
64、t;<p> WHEN 11=>INDEX0<="00000100"; --3</p><p> WHEN 12=>INDEX0<="00000010"; --2</p><p> WHEN 13=>INDEX0<="00000010"; --2</p>
65、;<p> WHEN 14=>INDEX0<="00000001"; --1</p><p> WHEN 15=>INDEX0<="00000001"; --1</p><p> WHEN 16=>INDEX0<="00010000"; --5</p>
66、<p> WHEN 17=>INDEX0<="00010000"; --5</p><p> WHEN 18=>INDEX0<="00001000"; --4</p><p> WHEN 19=>INDEX0<="00001000"; --4</p>
67、<p> WHEN 20=>INDEX0<="00001000"; --4</p><p> WHEN 21=>INDEX0<="00000100"; --3</p><p> WHEN 22=>INDEX0<="00000010"; --2</p>
68、<p> WHEN 23=>INDEX0<="00000010"; --2</p><p> WHEN 24=>INDEX0<="00010000"; --5</p><p> WHEN 25=>INDEX0<="00010000"; --5</p>&
69、lt;p> WHEN 26=>INDEX0<="00001000"; --4</p><p> WHEN 27=>INDEX0<="00001000"; --4</p><p> WHEN 28=>INDEX0<="00000100"; --3</p>&l
70、t;p> WHEN 29=>INDEX0<="00000100"; --3</p><p> WHEN 30=>INDEX0<="00000010"; --2</p><p> WHEN 31=>INDEX0<="00000010"; --2</p><
71、;p> WHEN OTHERS=>NULL;</p><p><b> END CASE;</b></p><p> ELSE INDEX0<=INDEX2; --將音符信號0的值賦給音符信號2</p><p><b> END IF;</b></p&
72、gt;<p> END PROCESS;</p><p> END BEHAVIORAL;</p><p> 附錄2:音調(diào)發(fā)生源程序清單</p><p> --程序名稱:TONE.VHD</p><p> --程序功能:采用VHDL語言編程產(chǎn)生音階的分頻預置值。</p><p> LIBRAR
73、Y IEEE;</p><p> USE IEEE.STD_LOGIC_1164.ALL;</p><p> USE IEEE.STD_LOGIC_ARITH.ALL;</p><p> USE IEEE.STD_LOGIC_UNSIGNED.ALL;</p><p> ENTITY TONE IS</p><p&
74、gt; PORT(INDEX: IN STD_LOGIC_VECTOR(7 DOWNTO 0); --音符輸入信號</p><p> CODE: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); --音符顯示信號</p><p> HIGH: OUT STD_LOGIC; --高低音顯示信號</p>&
75、lt;p> TONE0:OUT INTEGER RANGE 0 TO 2047); --音符的分頻系數(shù)</p><p><b> END TONE;</b></p><p> ARCHITECTURE ART OF TONE IS</p><p><b> BEGIN</b></p>
76、<p> SEARCH:PROCESS(INDEX) </p><p><b> BEGIN</b></p><p> CASE INDEX IS</p><p> WHEN"00000001"=>TONE0<=773;CODE<="1001111";HIGH&l
77、t;='1'; </p><p> --分頻系數(shù)773Hz,音符顯示1001111,顯示低音</p><p> WHEN"00000010"=>TONE0<=912;CODE<="0010010";HIGH<='1';</p><p> WHEN"000
78、00100"=>TONE0<=1036;CODE<="0000110";HIGH<='1';</p><p> WHEN"00001000"=>TONE0<=1116;CODE<="1001100";HIGH<='1';</p><p>
79、 WHEN"00010000"=>TONE0<=1197;CODE<="0100100";HIGH<='1';</p><p> WHEN"00100000"=>TONE0<=1290;CODE<="0100000";HIGH<='0';</p&g
80、t;<p> WHEN"01000000"=>TONE0<=1372;CODE<="0001111";HIGH<='0';</p><p> WHEN"10000000"=>TONE0<=1410;CODE<="0000000";HIGH<='0
81、';</p><p> WHEN OTHERS =>TONE0<=2047;CODE<="0000001";HIGH<='0';</p><p><b> END CASE;</b></p><p> END PROCESS;</p><p>
82、<b> END ART;</b></p><p> 附錄3:數(shù)控分頻源程序清單</p><p> --程序名稱:FENPIN.VHD</p><p> --程序功能:采用VHDL語言編程對時基脈沖進行分頻,得到8個音符相對應的頻率。</p><p> LIBRARY IEEE;</p><
83、p> USE IEEE.STD_LOGIC_1164.ALL;</p><p> USE IEEE.STD_LOGIC_ARITH.ALL;</p><p> USE IEEE.STD_LOGIC_UNSIGNED.ALL;</p><p> ENTITY FENPIN IS</p><p> PORT(CLK1: IN S
84、TD_LOGIC;</p><p> TONE1: IN INTEGER RANGE 0 TO 2047; --系統(tǒng)時鐘信號</p><p> SPKS: OUT STD_LOGIC); --音符分頻系數(shù)</p><p> END ENTITY FENPIN; --驅(qū)動揚聲器的音頻信號&
85、lt;/p><p> ARCHITECTURE ART OF FENPIN IS</p><p> SIGNAL PRECLK:STD_LOGIC; --定義時基脈沖信號</p><p> SIGNAL FULLSPKS:STD_LOGIC;</p><p><b> BEGIN</b>&
86、lt;/p><p> PROCESS(CLK1)</p><p> VARIABLE COUNT:INTEGER RANGE 0 TO 8; --定義變量計數(shù)器,從0到8</p><p><b> BEGIN</b></p><p> IF(CLK1'EVENT AND CLK1='1'
87、;)THEN --據(jù)時鐘信號為1時 </p><p> COUNT:=COUNT+1; --判斷計數(shù)器取值為1</p><p> IF COUNT=2 THEN</p><p> PRECLK<='1';</p><p> ELSIF COUNT=
88、4 THEN --若計數(shù)器計4</p><p> PRECLK<='0';COUNT:=0; --時基脈沖為0,計數(shù)器清零</p><p><b> END IF;</b></p><p><b> END IF;</b
89、></p><p> END PROCESS;</p><p> PROCESS(PRECLK,TONE1)</p><p> VARIABLE COUNT11:INTEGER RANGE 0 TO 2047; --定義變量頻率計數(shù)器11,從0</p><p><b> 到2047Hz</b><
90、/p><p><b> BEGIN</b></p><p> IF(PRECLK'EVENT AND PRECLK='1')THEN --PRECLK脈沖上升沿觸發(fā)</p><p> IF COUNT11<TONE1 THEN --若計數(shù)器11值小于音符信號1&
91、lt;/p><p> COUNT11:=COUNT11+1;FULLSPKS<='1'; --計數(shù)器加1,音頻信號為1</p><p><b> ELSE</b></p><p> COUNT11:=0;FULLSPKS<='0';</p><p><b>
92、 END IF;</b></p><p><b> END IF;</b></p><p> END PROCESS;</p><p> PROCESS(FULLSPKS) --音頻信號輸出進程開始</p><p> VARIABLE COUNT2:
93、STD_LOGIC:='0'; --定義變量計數(shù)器2,初值為0</p><p><b> BEGIN</b></p><p> IF(FULLSPKS'EVENT AND FULLSPKS='1')THEN --音頻信號輸出上升沿有效時</p><p> COUNT2:
94、=NOT COUNT2;</p><p> IF COUNT2='1'THEN</p><p> SPKS<='1';</p><p><b> ELSE</b></p><p> SPKS<='0';</p><p><b
95、> END IF;</b></p><p><b> END IF;</b></p><p> END PROCESS;</p><p><b> END ART;</b></p><p> 附錄4:頂層設計源程序清單</p><p> --程序
96、名稱:DIANZIQIN.VHD</p><p> --程序功能:采用VHDL語言編寫主程序調(diào)用3個子程序,實現(xiàn)樂曲演奏的功能。</p><p> LIBRARY IEEE; </p><p> USE IEEE.STD_LOGIC_1164.ALL;</p><p> USE IEEE.STD_LO
97、GIC_ARITH.ALL;</p><p> USE IEEE.STD_LOGIC_UNSIGNED.ALL;</p><p> ENTITY DIANZIQIN IS</p><p> PORT(CLK 8HZ:IN STD_LOGIC;</p><p> CLK12MHZ: IN STD_LOGIC;
98、 --系統(tǒng)時鐘信號</p><p> HANDTOAUTO: IN STD_LOGIC; --鍵盤輸入/自動演奏信號</p><p> CODE1: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); --音符顯示信號</p><p> INDEX1: IN STD_LOGIC_VECTOR(
99、7 DOWNTO 0); --鍵盤輸入信號</p><p> HIGH1: OUT STD_LOGIC; --高低音節(jié)信號</p><p> SPKOUT: OUT STD_LOGIC); --音頻信號</p><p><b> END;</b&
100、gt;</p><p> ARCHITECTURE ART OF DIANZIQIN IS</p><p> COMPONENT AUTO --引用 AUTO元件</p><p> PORT(CLK: IN STD_LOGIC; </p
101、><p> AUTO: IN STD_LOGIC; --輸入自動演奏信號</p><p> INDEX2: IN STD_LOGIC_VECTOR(7 DOWNTO 0); --輸入8位控制信號</p><p> INDEX0: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
102、 --輸出8位的音符</p><p> END COMPONENT;</p><p> COMPONENT TONE --引用TONE元件</p><p> PORT(INDEX: IN STD_LOGIC_VECTOR(7 DOWNTO 0);</p><p>
103、 CODE: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);</p><p> HIGH: OUT STD_LOGIC;</p><p> TONE0: OUT INTEGER RANGE 0 TO 2047);</p><p> END COMPONENT;</p><p> COMPONENT FENPI
104、N --引用FENPIN元件</p><p> PORT(CLK1: IN STD_LOGIC;</p><p> TONE1: IN INTEGER RANGE 0 TO 2047;</p><p> SPKS: OUT STD_LOGIC);</p><p>
105、END COMPONENT;</p><p> SIGNAL TONE2:INTEGER RANGE 0 TO 2047; --定義主程序音調(diào)頻率信號</p><p> SIGNAL INDX:STD_LOGIC_VECTOR(7 DOWNTO 0); --定義8位的音符信號</p><p><b> BEGIN</b&g
106、t;</p><p> U0:AUTO PORT MAP(CLK=>CLK8HZ,INDEX2=>INDEX1,INDEX0=>INDX,AUTO=>HANDTOAUTO); --調(diào)用自動演奏模塊</p><p> U1:TONE PORT</p><
107、p> MAP(INDEX=>INDX,TONE0=>TONE2,CODE=>CODE1,HIGH=>HIGH1); --調(diào)用音調(diào)發(fā)</p><p><b> 生模塊</b></p><p> U2:FENPIN PORT MAP(CLK1=>CLK12MHZ,TONE1=>TONE2,SPKS=>SPKOUT);&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- eda課程設計硬件電子琴及自動演奏
- eda課程設計---樂曲硬件演奏電路
- eda課程設計---自動電子琴
- eda課程設計--具有自動演奏功能的電子琴
- eda課程設計--樂曲硬件演奏電路設計
- eda課程設計---樂曲硬件演奏電路的vhdl設計
- 樂曲硬件演奏電路的vhdl設計 eda課程設計
- 樂曲演奏課程設計報告---樂曲演奏電路的設計
- eda電子琴設計
- 電子琴課程設計---電子琴的設計與實現(xiàn)
- 電子琴課程設計
- 課程設計--電子琴
- 電子琴課程設計
- 電子電路cad課程設計--簡易電子琴
- 電子琴的課程設計
- 電子琴的設計 課程設計
- eda樂曲硬件演奏電路設計
- 電子琴課程設計--基于單片機的電子琴設計
- 微機課程設計電子琴
- 接口課程設計電子琴
評論
0/150
提交評論