【正文】
體中選擇Tools—MegaWizard PlugeIn Manager…,彈出如下對話框,單擊Next繼續(xù)。 MegaWizard PlugeIn Manager第一頁按下圖選擇并填入文件名,點(diǎn)擊Next。 MegaWizard PlugeIn Manager第二頁 數(shù)據(jù)和地址寬度的選擇在下圖中取消“q’output port”前面的勾,點(diǎn)擊Next繼續(xù)。 寄存器信號(hào)的選擇在下圖中,點(diǎn)擊Next繼續(xù)。 指明ROM初始化文件圖 12 可以用文本編輯器編輯,也可以用Quartus II自帶的功能產(chǎn)生ROM數(shù)據(jù)文件。定制一個(gè)512*:選擇菜單File | New,在對話框中選擇Memory Initialization File,然后輸入512和8,如下圖13(a)所示,如下圖13(b)所示,然后可在其中輸入數(shù)據(jù),默認(rèn)為十進(jìn)制。 (a)ROM的初始化設(shè)置 (b)初始化的空的ROM文件圖13 ROM初始化 在ROM中存儲(chǔ)音樂以《世上只有媽媽好》為例,其簡譜如下圖所示:圖14 世上只有媽媽好簡譜 根據(jù)前述對音符的編碼規(guī)則,可知第一個(gè)音為中音6,時(shí)值為拍,存儲(chǔ)為6和6;再如第二個(gè)音符為中音5,時(shí)值拍,存儲(chǔ)為5和2;又如第五個(gè)音符為高音5,時(shí)值1拍,存儲(chǔ)為21和4。(a) (b)圖15 世上只有媽媽好簡譜在ROM中的存儲(chǔ)其它兩首樂曲的存儲(chǔ)與此類似。 本文根據(jù)實(shí)驗(yàn)室提供的共陽極矩陣鍵盤設(shè)計(jì),其示意圖如圖16所示,定義各功能鍵如下圖17所示,其中1~7對應(yīng)簡譜的1~7音符,H、M、L分別為高、中、低音選擇鍵,AP(Auto Play)為自動(dòng)播放選擇鍵,EO(Electronic Organ)為電子琴彈奏選擇鍵,Song為自動(dòng)播放時(shí)的歌曲選擇鍵,三個(gè)短“”代表休止符。 圖17本系統(tǒng)矩陣鍵盤功能鍵示意 下面介紹掃描原理,采取逐行掃描法,以0111011101110的順序依次掃描,然后讀取列引腳的電平信號(hào)即可判斷哪個(gè)按鍵按下。掃描時(shí),選取的掃描頻率為1KHz,由1MHz分頻得到,具體見源程序。 通常的按鍵所用開關(guān)為機(jī)械彈性開關(guān),當(dāng)機(jī)械觸點(diǎn)斷開、閉合時(shí),由于機(jī)械觸點(diǎn)的彈性作用,一個(gè)按鍵開關(guān)在閉合時(shí)不會(huì)馬上穩(wěn)定地接通,在斷開時(shí)也不會(huì)一下子斷開。抖動(dòng)時(shí)間的長短由按鍵的機(jī)械特性決定,一般為5ms~10ms。圖18 按鍵抖動(dòng) 常見的消抖方法有采樣型防抖微分電路、D型觸發(fā)器、移位寄存器、計(jì)數(shù)器,結(jié)合各消抖法的特點(diǎn),本文采用計(jì)數(shù)器法。 注意觀察圖中圈圈的部分,可以看出,第一個(gè)圈,對應(yīng)“AP”鍵,他不在音符范圍內(nèi),故Key_Note為0,且play,sel均為1,表示選擇自動(dòng)播放;第二個(gè)圈,對應(yīng)“5”鍵,在音符范圍內(nèi),故Key_Note為5;第三個(gè)圈,對應(yīng)“EO”鍵,他不在音符范圍內(nèi),故Key_Note為0,且play,sel均為0,表示選擇電子琴彈奏;第四個(gè)圈,對應(yīng)“Song”鍵,產(chǎn)生一個(gè)脈沖,仔細(xì)分析還應(yīng)當(dāng)發(fā)現(xiàn)由于消抖,使輸出遲了1個(gè)掃描時(shí)鐘(),但對本系統(tǒng)無影響。 圖21 樂曲自動(dòng)播放模塊符號(hào)圖22 樂曲自動(dòng)播放模塊 ROM數(shù)據(jù)讀取控制 該分模塊從tick_rom中讀取節(jié)拍,控制讀取ROM數(shù)據(jù)的速度,從而實(shí)現(xiàn)音樂的節(jié)奏。 樂曲自動(dòng)播放模塊仿真波形如下: 圖23 樂曲自動(dòng)播放模塊仿真波形 為方便仿真,三首樂曲的前幾個(gè)音符如右圖所示,第一首的起始音符為中音6,時(shí)值一又二分之一拍;第二首的起始音符為中音5,時(shí)值為1拍;第三首的起始音符為0,接著為1,2,時(shí)值分別為二分之一拍、四分之一拍、四分之一拍。圖24 三首樂曲的第一句簡譜5. 電子琴模塊 此模塊主要完成將上一級(jí)鍵盤控制模塊送來的音符按鍵進(jìn)行譯碼輸出,元件符號(hào)如右圖11所示。 可見,程序正確無誤。 圖 25 元件符號(hào)如右圖。 本文設(shè)計(jì)的具有自動(dòng)樂曲演奏功能的電子琴系統(tǒng)選擇的基基準(zhǔn)頻率為1MHz,根據(jù)表1可計(jì)算出對應(yīng)的音符的分頻系數(shù)(divider_mod),如下表5:表5 圖27音符發(fā)聲及顯示模塊仿真波形 由上圖可見,數(shù)碼管顯示均為6,但高低音指示燈的值不同,pitch為高低音指示燈,pitch[1]為高位,且“00”代表中音,“01”代表低音,“10”代表高音。7. 五二輸入或門 由于本系統(tǒng)有自動(dòng)播放和電子琴彈奏兩個(gè)模塊組成,每次只能其中一個(gè)有效,但要共用音符發(fā)聲及顯示模塊,故需要將輸出的音符碼相或后送予后級(jí)處理,由于本模塊比較簡單,在此僅給出仿真波形,如下。 2. 電子琴彈奏模塊的實(shí)現(xiàn)過程中也出現(xiàn)了一個(gè)問題:高、中、低音的選擇不起作用,此模塊僅有一個(gè)進(jìn)程,如下:process(key,play,EN)variable sign :integer range 0 to 2:=0。039。039。 if key=12 then sign:=0。 elsif key=16 then sign:=1。 elsif key=8 then sign:=2。 end if。 if key=1 and key=7 then1~7 note_code=key+10*sign。 else note_code=0。 end if。else note_code=0。end if。 但仿真結(jié)果令人驚訝,只能輸出高音,仿真波形如下,錯(cuò)誤處已經(jīng)用叉號(hào)標(biāo)記出來解決辦法:給該模塊加入時(shí)鐘驅(qū)動(dòng),用上升沿觸發(fā)事件,結(jié)果得到了想要的結(jié)果,如下圖,程序見該模塊源代碼。此系統(tǒng)是我獨(dú)立開發(fā)的一個(gè)小型系統(tǒng),且實(shí)現(xiàn)的效果很好,很有成就感,更加激發(fā)我搞科研的熱情!七、編程調(diào)試1. 具有自動(dòng)演奏樂曲功能的電子琴系統(tǒng)的所有VHDL源代碼 :圖31 use 。KBCol:in std_logic_vector(0 to 3)。play:out std_logic。 0:Elc_keyboard。1:music_play。Key_Note:buffer integer range 0 to 16。end entity。architecture control of Key_Control issignal clk_kb:std_logic。signal state:std_logic_vector(1 downto 0):=00。signal key:integer range 0 to 16。signal TempKey:integer range 0 to 16。039。begin if start=39。 then if t=499 then仿真時(shí)改為if t=10 then else end if。 end if。 end if。process(clk_kb)begin state=00。 state=state+1。end process。 when 00=KBRow=1110。 when 01=KBRow=1101。 when 10=KBRow=1011。 when 11=KBRow=0111。 when others