【正文】
的內(nèi)部功能和算法完成部分。相對于其他硬件語言,VHDL有許多優(yōu)點(diǎn)。預(yù)頌圣鉉儐歲齦訝驊糴買闥齙絀鰒現(xiàn)。它由樂曲自動(dòng)演奏模塊、音調(diào)發(fā)生模塊和數(shù)控分頻模塊三部分組成。 樂曲自動(dòng)演奏模塊樂曲自動(dòng)演奏模塊的作用是產(chǎn)生8位發(fā)生控制輸入信號。鐃誅臥瀉噦圣騁貺頂廡縫勵(lì)羆楓鱷燭。PULSE0的作用是根據(jù)鍵盤輸入(自動(dòng)演奏)的值(0或1)來判斷計(jì)數(shù)器COUNT以及脈沖CLK2的輸出值。 PULSE0:PROCESS(CLK,AUTO) 工作進(jìn)程開始 VARIABLE COUNT:INTEGER RANGE 0 TO 8。 IF AUTO=39。THEN 鍵盤輸入為1 COUNT:=0。039。 ELSIF(CLK39。139。 計(jì)數(shù)器加1當(dāng)確定了時(shí)鐘信號輸出的值后,在第二個(gè)PROCESS中就可以由它控制8位發(fā)聲控制輸入信號了。最后的COM1便是由前兩個(gè)PROCESS所確定的COUNT0、AUTO和鍵盤輸入信號值INDEX2將8位的二進(jìn)制數(shù)轉(zhuǎn)化為音符信號的輸出,達(dá)到自動(dòng)演奏的目的。IF AUTO=39。THENCASE COUNT0 IS WHEN 0=INDEX0=00000100。 5該模塊最主要的用途就是將輸入二進(jìn)制數(shù)轉(zhuǎn)化為發(fā)聲控制輸入,是產(chǎn)生音符的重要步驟, AUTO模塊的源程序符號編輯圖如圖31。圖31 AUTO模塊的符號編輯圖 音調(diào)發(fā)生模塊音調(diào)發(fā)生模塊的作用是產(chǎn)生音階的分頻預(yù)置值。綾鏑鯛駕櫬鶘蹤韋轔糴飆鈧麥蹣鯢殘。比如我們自定義INDEX第8位為高電平時(shí),它的分頻系數(shù)則為773Hz,音符顯示信號為1001111,即是773的二進(jìn)制表示,此時(shí)高低音顯示1表示高音。CASE INDEX ISWHEN00000010=TONE0=912。HIGH=39。貓蠆驢繪燈鮒誅髏貺廡獻(xiàn)鵬縮職鯡樣。CODE=0001111。039。WHEN OTHERS =TONE0=2047。HIGH=39。構(gòu)氽頑黌碩飩薺齦話騖門戲鷯瀏鯪晝。輒嶧陽檉籪癤網(wǎng)儂號澩蠐鑭釃邊鯽釓。FENPIN模塊的源程序符號編輯圖如圖33。該模塊主要由4個(gè)工作進(jìn)程組成。第二個(gè)PROCESS是此模塊的核心,即由時(shí)基脈沖值轉(zhuǎn)化為音符的頻率。VARIABLE COUNT11:INTEGERRANGE 0 TO 2047。EVENT AND PRECLK=39。)THEN 時(shí)基脈沖為1時(shí) IF COUNT11TONE1 THEN 頻率計(jì)數(shù)器小于音符分頻系數(shù) COUNT11:=COUNT11+1。139。FULLSPKS=39。最后一個(gè)PROCESS則是用來設(shè)置揚(yáng)聲器輸出信號的,揚(yáng)聲器信號由0和1控制,當(dāng)且僅當(dāng)前一個(gè)PROCESS中的FULLSPKS輸出為1時(shí),揚(yáng)聲器才有輸出,再根據(jù)計(jì)數(shù)器取值來確定輸出是1還是0。IF(FULLSPKS39。139。COUNT2:=NOT COUNT2。139。139。 頂層設(shè)計(jì)該DIANZIQIN模塊是整個(gè)電子琴設(shè)計(jì)的核心,也是VHDL程序的主程序,前面3個(gè)源程序都是作為子程序分別實(shí)現(xiàn)電子琴的某一功能,而DIANZIQIN模塊則通過調(diào)用子程序最終實(shí)現(xiàn)樂曲演奏的目的,奏出美妙的樂曲。鯊腎鑰詘褳鉀溈懼統(tǒng)庫搖飭緡釷鯉憮。碩癘鄴頏謅攆檸攜驤蘞鷥膠據(jù)實(shí)鰹贏。因而,系統(tǒng)仿真的結(jié)果決定整個(gè)課程設(shè)計(jì)任務(wù)完成的到位程度。 時(shí)序仿真編譯完成后,可以對所進(jìn)行的設(shè)計(jì)進(jìn)行仿真,下面簡單介紹一下仿真的步驟。存盤。釷鵒資贏車贖孫滅獅贅慶獷緞瑋鱘將。由于電子琴4個(gè)模塊都是獨(dú)立的程序,可分別對各個(gè)程序仿真,驗(yàn)證輸入輸出的正確性,但在最終能演奏出樂曲的則是頂層設(shè)計(jì)模塊。樂曲自動(dòng)演奏模塊的仿真如圖41所示。諺辭調(diào)擔(dān)鈧諂動(dòng)禪瀉類謹(jǐn)覡鸞幀鮮奧。圖42 音調(diào)發(fā)生模塊的仿真圖 該圖輸入音符信號INDEX初值為00,輸出是音符顯示信號CODE為01,高低音顯示信號為0,音符的分頻系數(shù)為11111111即2047Hz。數(shù)控分頻模塊的仿真如圖43所示。熒紿譏鉦鏌觶鷹緇機(jī)庫圓鍰緘鶚鱭圓。圖43簡易電子琴整個(gè)系統(tǒng)的仿真圖該圖輸入系統(tǒng)時(shí)鐘信號CLK32MHZ初值為0,自動(dòng)演奏信號HANDTOAUTO初值為0,鍵盤輸入信號INDEX1為00000000;輸出音符信號CODE1則為0110000,高低音節(jié)信號HIGH1變?yōu)?,即高音,音頻信號SPKOUT即輸出0,輸出為1時(shí)CODE1變?yōu)?110100,這時(shí)出現(xiàn)10ns的延時(shí)。鶼漬螻偉閱劍鯫腎邏蘞闋簣擇睜鮪謅。此課程設(shè)計(jì)中主要用到的硬件設(shè)施有EP1K30QC2082芯片、一個(gè)12MHz的頻率元件、揚(yáng)聲器、鍵盤或脈沖開關(guān)、發(fā)光二極管等,硬件和軟件系統(tǒng)相連接的樞紐就是芯片引腳和VHDL主程序中所有輸入輸出之間對應(yīng)的關(guān)系,它們滿足:CLK→7引腳、HANDTOAUTO→4INDEX10→4INDEX11→4INDEX12→5INDEX13→5INDEX14→5INDEX15→5INDEX16→5HIGH1→1SPKOUT→68引腳。在選擇好芯片以及設(shè)置引腳值后,下載源程序()到此芯片上,確認(rèn)編程器硬件是否已安裝好。再次對源程序進(jìn)行編譯導(dǎo)入程序然后運(yùn)行,揚(yáng)聲器發(fā)出初設(shè)的音符3,5音即報(bào)警。穎芻莖蛺餑億頓裊賠瀧漲負(fù)這惻鮭觶。濫驂膽閉驟羥闈詔寢賻減棲綜訴鮐巹。對于設(shè)計(jì)電子琴時(shí),由于要求輸出不同頻率的聲音,頻率變化范圍大,故需要一個(gè)12MHz的元件,對于小于這一值的頻率不足以滿足電路需求,仿真時(shí)只有一堆雜音輸出。在對于設(shè)計(jì)時(shí)遇到的不同問題時(shí),首先應(yīng)該理解問題關(guān)鍵所在,因?yàn)橛谜Z言編寫程序需要仔細(xì)認(rèn)真的態(tài)度,一點(diǎn)點(diǎn)錯(cuò)誤漏洞將導(dǎo)致整個(gè)源程序無法編譯運(yùn)行,阻礙下一步工作完成進(jìn)度。5 結(jié)束語通過這次VHDL課程設(shè)計(jì),不僅增強(qiáng)了我們的實(shí)踐動(dòng)手能力,也讓我們對課堂上所學(xué)到的理論知識的理解加深了許多,這給我們提供了一個(gè)在學(xué)習(xí)生活中很難得的理論聯(lián)系實(shí)際的機(jī)會。賠荊紳諮侖驟遼輩襪錈極嚕辮鏢鱸蕆。比如實(shí)踐機(jī)會過少,所學(xué)的理論知識不能靈活運(yùn)用,在遇到實(shí)際的問題時(shí)無法正確處理;再者在課堂上獲得的專業(yè)知識過于淺顯,很多的有關(guān)基本操作原理、操作方法都理解不了;課外知識了解的也過少,導(dǎo)致在課程設(shè)計(jì)初期,面對完全陌生的設(shè)計(jì)課題無從下手,不知所措。當(dāng)然,在學(xué)習(xí)之余我們更應(yīng)該積極參加各種有關(guān)專業(yè)知識的實(shí)踐活動(dòng)和比賽,鞏固所學(xué)理論,多注意培養(yǎng)初步的實(shí)際工作能力和專業(yè)技術(shù)能力,這樣在以后的工作崗位上不會顯得那么倉促與生疏。參考文獻(xiàn)[1] :國防工業(yè)出版社,2002[2] :科學(xué)出版社,2003[3] VHDL Language Reference Guide ,Alde Inc . Henderson NV USA ,1999裊樣祕廬廂顫諺鍘羋藺遞燦擾諗魴莖。LIBRARY IEEE。USE 。ENTITY AUTO IS PORT(CLK: IN STD_LOGIC。 AUTO: IN STD_LOGIC。 CLK2: BUFFER STD_LOGIC。 鍵盤輸入信號驍顧燁鶚巰瀆蕪領(lǐng)鱺賻驃弒綈閶魎齠。 音符信號輸出瑣釙濺曖惲錕縞馭篩涼貿(mào)錒戧晉魘繅。ARCHITECTURE BEHAVIORAL OF AUTO IS SIGNAL COUNT0:INTEGER RANGE 0 TO 31。BEGINPULSE0:PROCESS(CLK,AUTO) PULSE0工作進(jìn)程開始櫛緶歐鋤棗鈕種鵑瑤錟奧傴輥刪髖綠。 定義變量計(jì)數(shù)