簡易電子琴的VHDL仿真與實現(xiàn)_第1頁
簡易電子琴的VHDL仿真與實現(xiàn)_第2頁
簡易電子琴的VHDL仿真與實現(xiàn)_第3頁
簡易電子琴的VHDL仿真與實現(xiàn)_第4頁
簡易電子琴的VHDL仿真與實現(xiàn)_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

簡易電子琴的VHDL設計和實現(xiàn)一.計課題和任要求:設計制作一個簡易電子琴演奏器。原概:根據聲樂知識,產生音樂的兩個因素是音樂頻率的持續(xù)時間,音樂的十二平均率規(guī)定,每兩個八音度之間的頻率相差一倍,在兩個八音度之間,又可分為12個半音。每兩個半音的頻率比為4。另外,音名A(譜中的低音)的頻率為440HZ,名B到C之間,到F之間為半音余全音由此以計算出樂譜中從低音到高之間個音名的頻率如下表所示。表1簡中的音名和頻率的關音名低音1低音2低音3低音4低音5低音6低音7

頻率()261.63293.67329.63349.23391.99440493.88

音名中音1中音2中音3中音4中音5中音6中音7

頻率()523.25587.33659.25698.46783.99880987.76

音名高音1高音2高音3高音4高音5高音6高音7

頻率()1046.501174.661318.511396.921567.9817601975.52基要:、用8×陣顯示“125”個音符構成的電子琴鍵盤。其中點陣的第一列用一個點表示音“1列用二個LED點表示音“2類,如下圖所示。47圖1點顯示的電子琴鍵盤、用BTN1~七個按鍵模擬電子琴手動演奏時的2367七個音符。當某個按鍵按下時,數碼管顯示相應的音符,點陣上和之對應的音符顯示列全滅,同時蜂鳴器演奏相應的聲音;當按鍵彈開時數碼管顯示的音符滅掉,點陣顯示恢復,蜂鳴器停止聲音的輸出。下圖所示為按下BTN3鍵時點陣的顯示情況。

47圖2按按下后的點陣顯示、由碼開關切換擇高、中、低音,并用數碼管進行相應的顯示。、通按鍵BTN0進行復位,控制點陣顯示圖1的始狀態(tài)。提要:、可過一個撥碼關進行手/自動演奏的切換點陣顯示配合增加自動演奏樂曲的功能。、增手動演奏的符存儲、播放功能。二.系統(tǒng)設(包括設計路、總體框、分塊設)1.計思路說明電子琴的設計包括七個模塊:彈奏模塊keyplay、自動演奏模塊、查表及顯示模塊table、分頻模塊、存儲模塊、七段數碼管顯示模塊seg7點陣的顯示模塊lattice。彈奏模塊根據按鍵動作key,和高中低模式選擇產生指示音調的index_key。自動演奏模塊autoplay收50MHz的時鐘信號,輸出。存儲錄音模塊store根據選擇錄音,用數組存,并將其傳輸給作為錄音存儲的數據。查表及顯示模塊根據按鍵button選擇采用index_key或index_auto或者index_store查分頻系數表輸出分頻系數對于tone的編碼,采用了五位編碼方式,高2位存儲高中低音對應的、、編碼,低3位存儲相應輸入音調對應的二進制編碼。分頻模塊接收輸出的分頻系數并據此分頻將對應頻率的信號輸出給揚聲器供其發(fā)聲。七段數碼管顯示模塊根據對應的按鍵replay選擇采index_key或index_auto或者index_store,分別對應不同的數碼管顯示輸出。點陣的顯示模塊根據對應的按鍵,replay選擇采用index_key或index_auto或者index_store分別對應不同的數碼管顯示輸出這樣可以保證在不同的模式下點陣以及數碼管都可以對應顯示輸出。2.體框圖和流圖

系統(tǒng)實現(xiàn)流程圖

圖2

系統(tǒng)設計框圖3.塊設計系統(tǒng)總體設計:圖

頂層設計塊設計:將輸入key[6..0]編碼為index_key[4..0]的高兩位表示高、中、低音00表示低音,01表示中11表示高音低三位表示音調,001表示do010示以此類推,示不發(fā)音。這樣可以實現(xiàn)對不同按鍵模式下的編碼,而這些編碼會為后續(xù)模塊例如seg7,所使用。

圖4模塊設計autoplay模塊設:把的輸入時鐘分頻為節(jié)拍自演奏的歌曲預先寫為index_auto的格式index_auto格和index_key格相同16Hz的頻率將index_auto輸。這里需要用到計數器,此計數器的長度由演奏的歌曲長度而定。圖5autoplay模塊設計查表及顯示模塊table設計:(1)輸入按鍵于選擇模式由于是琴鍵式不能根據本身的值來選擇模式。button且replay為則把賦給內部信號index,button為且replay為則把賦給它,為0且replay為1則把賦給它。(2)用來查表,獲分頻系數,輸出。(3)同時根據index獲得編碼表示的高、中、低音的音調,輸出給碼管和點陣。

圖6

模塊設分頻模塊設:輸入分頻系數tone。(1)設置內部信號i用于計數,clk_data為分頻結果。每次clk升沿檢測i是否等于tone,相等則把i清零,并使clk_data轉,否則i自增1。(2)把賦給輸出信號,由buzz驅動揚聲器發(fā)聲。圖

模塊設計seg7碼管模塊設計:(1)由button和replay進行調用選擇,選擇采用或index_auto或者為對應的信號輸入。分別對應不同的數碼管顯示輸出。

seg7塊設計數碼管模塊設計:(1)由button和replay進行調用選擇,選擇采用或index_auto或者為對應的信號輸入。分別對應不同的點陣輸出顯示圖

模塊設計Store存儲模塊設計:Store模塊使用了和控制錄音和錄音播放的選擇。這里使用了一個二維數組來存儲輸入的按鍵信息后錄音播放時可以按照輸入的頻率進行對應的播放。

圖三、仿真波及仿真分析模塊仿真:

store塊設計波形分析:這里我只選擇性地選取了鍵盤輸入的對應點陣顯示首先鍵盤輸入時信號為低電平所以可以從仿真圖中看到button信號為低電平且此時的復位信號無效,為低電平,此key輸入信號有效。在對應的時鐘時鐘信號輸入下,當

鍵盤輸入信號對應相應的輸入時點陣的行列也會有對應的輸出由于行的輸出是掃描信號所以對應時鐘輸入點陣的行信號在對應的時鐘分頻下分別對應一行輸出低電平有效表示掃描至該行下一個時鐘分頻對應下一行的低電平輸出。而對應列掃描,根據key入的情況,分別對應列掃描的電平輸出。如圖,例如輸入時,有l(wèi)ie,row01100000。模塊仿真:可以看到,2代表的是分頻系數,所以對應仿真如上圖有,當tone02頻以buzz應著時鐘的二分頻分頻系數和tone的關系為頻系數=(以在計算每個音調對應的頻率時,使用(tone+1模塊仿真如圖,對應著不同的key輸入和mode選擇,會譯碼為不同的。比如時,有index_key碼為,時,有對應index_key譯碼為仿真結果和預期要求相符。模塊仿真:

如圖應時鐘輸入產生一定的節(jié)拍對應的節(jié)拍播放我預先設定的樂曲音調,可以看出,對應前三個節(jié)拍的為音調mi,接下來有一拍的停頓,接下來又是三個節(jié)拍的mi和預先編寫的樂曲對應auto-play出一致。模塊仿真如圖,對應時鐘上升沿若有按鍵,則記錄;有效后,可以看到有對應的賦值,表示有效的按鍵信息已經被存儲??梢钥吹礁鶕謩愉浫氲膇ndex-key情況,對應時的index_store輸出分別為10001,10110,01011…塊仿真:

如圖所示,對應的輸出為時鐘掃描信號,所著時鐘變化,依出現(xiàn)低電平,表示對應的選通管有效,A,B,C,D,E,F,G根據輸入的而變看到mi的輸入的時候管,DP分別對應1,1,1,1,0,0,1,0,恰好可以顯示數碼管上的字樣。四、源程序要有注釋)electrorgan.vhl

--層文libraryIEEE;useuseIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;electrorganport(clk:instd_logic;

作為頂層文件含實現(xiàn)功能用到的所有端口std_logic_vector(60);std_logic_vector(10);cat:outstd_logic_vector(50);clr:inbutton:instd_logic;spkout:outstd_logic;inAtop:OUTstd_logic;Dtop:OUTEtop:OUTstd_logic;std_logic;std_logic;

lietop:outstd_logic_vector(7downto0);comtop:out0));--行ofautoplay--這里聲明了頂層文件中包含的各模塊port(clk:inclr:inindex_auto:outstd_logic_vector(40));storeport(index_key:instd_logic_vector(4clk:inclr:inin:outstd_logic_vector(40));fenpinport(clk:instd_logic;tone:inrange0to100000;buzz:outstd_logic);port(clk:instd_logic;std_logic_vector(70);--列std_logic_vector(70);--行index_auto:instd_logic_vector(40);index_key:instd_logic_vector(4clr:in:instd_logic_vector(40);button:inEndstd_logic_vector(40);index_key:instd_logic_vector(4button:inclr:in:instd_logic_vector(40);range0to);keyplay

port(key:indownto0);std_logic_vector(10);0));std_logic_vector(10);cat:outstd_logic_vector(50);index_key:INstd_logic_vector(40);index_auto:IN0);:instd_logic_vector(40);button:inclk:inA:OUTB:OUTstd_logic;E:OUTG:OUTstd_logic;);signalsignal:std_logic_vector(4downto0);signal:std_logic_vector(4downtosignal0to100000;begin

這里聲明了各模塊的端口和頂層端口的映射關系u1:autoplaymap(clk=>clk,clr=>clr,index_auto=>index_auto_top);u4:keyplayportportmap(replay=>replay,index_key=>index_key_top,cat=>cat,index_store=>index_store_top,clk=>clk,button=>button,mode=>mode,index_auto=>index_auto_top,A=>Atop,B=>Btop,C=>Ctop,D=>Dtop,E=>Etop,F=>Ftop,G=>Gtop,DP=>DPtop);u6:lattice>clr,index_key=>index_key_top,button=>button,lie=>lietop,com=>comtop,clk=>clk)

;

portmap(index_key=>index_key_top,clr=>clr,clk=>clk,index_store=>index_store_top,autoplay.vhl

--動播模塊libraryIEEE;useuseIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;autoplayport(clk:instd_logic;clr:in

這里聲明了一個復位端口index_auto:outstd_logic_vector(40));ofautoplayissignal:integer0tosignaljiepai:std_logic;signalj:range0tobeginjiepai1:beginifeventandifj1562500j<=0;notjiepai;j<=j+1;if;if;jiepai1;process(jiepai,clr)beginifand

--根據樂曲長度改變分頻產生節(jié)拍--里相當于一個計數器ifthencount<=0;--可根據樂曲長度改變count<=count+1;if;if;count<=0;if;process;music:process(count)--歌曲

begincountis

此case語句自動演奏部分的曲譜0=>index_auto<="11011";--3一小節(jié)1=>index_auto<="11011";--32=>index_auto<="11011";--33=>index_auto<="10000";--04=>index_auto<="11011";--35=>index_auto<="11011";--36=>index_auto<="11011";--37=>index_auto<="10000";--08=>index_auto<="11011";--39=>index_auto<="11011";--310--311=>--312=>--313=>--314=>--315=>--016=>--317=>18=>19=>20=>--321=>--322=>--323=>--024=>--325=>26=>index_auto<="11011";27=>--328=>--329=>--330=>--331=>--032=>--033=>--034=>--035=>--336=>--337=>--338=>--039=>--540=>--541=>--5

--里代表樂曲中的適當停頓第二小節(jié)

42=>--043=>--144=>--145=>--146=>--147=>--048=>--249=>--250=>--051=>52=>53=>54=>55=>56=>57=>58=>59=>60=>61=>62=>63=>64=>65=>66=>67=>68=>69=>70=>71=>72=>73=>74=>75=>76=>77=>78=>79=>80=>81=>82=>83=>84=>85=>

--3--3--3--3--3--3--3--3--3--3--3--0--0--0--0--0--0--0--0--4--4--4--0--4--4--4--0--4--4--4--4--0--4--4--0

第三小節(jié)

86=>--487=>--488=>--489=>--090=>--391=>--392=>--393=>--094=>--395=>--396=>--097=>--398=>--399=>--0--3--3--5--5--5--0--5--5--5--0--0--2--2--2--0--1--1--1--1--1--1--1--1--1--1--1--0

第四小節(jié)

--0--0--0--0--0--0--0others=>process;

--表模libraryieee;useieee.std_logic_1164.all;useuseieee.std_logic_unsigned.all;port(index_key:indownto--這里是對鍵盤輸入音符的編碼index_auto:indownto0);--里是對自動播放音符的編碼button:inclr:in:instd_logic_vector(40);--里是對錄入存儲音符的編碼range0to);searchissignalindex:beginbeginif='1'and='0'index_auto;=index_key;='1')THENindex_store;if;p1;p2:process(index,clr)beginthenindex

--擇使用哪種播放模式的音符輸入

tone<=95554;tone<=85600;tone<=74849;tone<=71592;tone<=63775;tone<=56818;tone<=50619;tone<=47773;tone<=42800;tone<=37922;tone<=35792;tone<=31887;tone<=28409;tone<=25309;tone<=23888;tone<=21282;tone<=18900;tone<=17896;tone<=16000;tone<=14204;tone<=12566;others=>tone<=0;thentone<=0;if;p2;

對應低音的,即分頻系數50MHz/2(tone+1)對應低音的2--對應低音的3--對應低音的4--對應低音的5--對應低音的6--對應低音的7對應中音的1對應高音的1--復位后,沒有聲音輸

--盤輸模塊libraryieee;useieee.std_logic_1164.all;useuseieee.std_logic_unsigned.all;std_logic_vector(10);--代表高中低音的選擇std_logic_vector(60);0));ofkeyplayissignalmd:std_logic_vector(80);begin

md<=mode&key;beginis

--按鍵和模式統(tǒng)一編碼"000000001"=>;--按示"000000010"=>"000000100"=>"000001000"=>"000010000"=>"000100000"=>"001000000"=>"010000001"=>index_key<="01001""010000010"=>"010000100"=>"010001000"=>"010010000"=>"010100000"=>"011000000"=>"110000001"=>index_key<="11001""110000010"=>"110000100"=>"110001000"=>"110010000"=>"110100000"=>"111000000"=>others=>index_key<="00000";;

--頻模塊libraryieee;useieee.std_logic_1164.all;useuseieee.std_logic_unsigned.all;port(clk:instd_logic;tone:inrange0to100000;buzz:outstd_logic);offenpinsignalclk_data:signali:range0to65540;

--50MHz鐘--輸入分頻系數--驅動揚聲器發(fā)聲

beginyinpin:beginifclk'1'ifitonetheni<=0;clk_data<=noti<=i+1;if;if;

--根據輸入的分頻系數頻yinpin;--f=1/(2*(tone+1))*f0buzz<=

--碼管示模塊libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;seg7ISstd_logic_vector(40);index_auto:IN0);button:inmode:INdowntoclk:incat:outstd_logic_vector(50);:instd_logic_vector(40);A:OUTB:OUTstd_logic;E:OUTG:OUTstd_logic;);ENDfunOFISsignaldowntosignalsignal0to24999;signalcat_tmp:std_logic_vector(5downto0);signalindex:

signalindex1:BEGINA<=led(6);B<=led(5);D<=led(3);E<=led(2);F<=led(1);G<=led(0);DP<='0';

根據撥碼選擇對應的自動手動或者錄音模式beginif(button=replay=index_auto;index_auto(2)&index_auto(1)&index_auto(0);='0'andindex_key;index_key(2)&index_key(1)&index_key(0);elsif(button='0'andreplay='1')THENindex_store;index_store(2)&index_store(1)&index_store(0);if;p0;beginif(clk_tmp'eventclk_tmp='1')thencat_tmpis

--碼管宣統(tǒng)信號的掃描when"111110"=>cat_tmp<="111101";when"111101"=>cat_tmp<="111011";when"111011"=>cat_tmp<="110111";when"110111"=>cat_tmp<="101111";when"101111"=>cat_tmp<="011111";when"011111"=>cat_tmp<="111110";others=>cat_tmp<="111110";if;if(cat_tmp="111110")index1is

第一根選通管用來顯示相應音符的數字"0000000";"0110000";"1101101";"011"=>led<="1111001";"100"=>led<="0110011";"101"=>led<="1011011";

"110"=>led<="1011111";"111"=>led<="1110000";others=>led<="0000000";--第2選通管用來顯示相應高中低音模式modeis"00"=>led<=elsif(cat_tmp="110111"orcat_tmp="111011"orcat_tmp="110111"or--剩余選通管無顯示index1is"0000000";"0000000";"0000000";"011"=>led<="0000000";"100"=>led<="0000000";"101"=>led<="0000000";"110"=>led<="0000000";"111"=>led<="0000000";others=>led<="0000000";if;p1;

orbeginclk='1')thenifthenclk_tmp;if;if;p2;END

給予數碼管顯示一個合適的時鐘

--陣顯模塊libraryieee;useieee.std_logic_1164.all;useieee.std_logic_Unsigned.all;

useieee.std_logic_ARITH.all;isport(clk:instd_logic;std_logic_vector(70);

行std_logic_vector(70);--列index_auto:instd_logic_vector(40);index_key:instd_logic_vector(4:instd_logic_vector(40);clr:inbutton:inEndlattice;aoflatticeissignalst1:std_logic_vector(70);signaldowntosignald0,d1,d2,d3,d4,d5,d6,d7:std_logic_vector(7downtosignalsignalsignal0to24999;signalindex:signalindex1:Begincom<=data;lie<=st1;

模式選擇顯示的為錄音手動或自動音符beginif(button=replay=index_auto;index_auto(2)&index_auto(1)&index_auto(0);(button=replay=index_key;index_key(2)&index_key(1)&index_key(0);elsif(button='0'andreplay='1')THENindex_store;index_store(2)&index_store(1)&index_store(0);if;p1;beginindex1is"001"=>d0<="00000000";

--入dol時,列掃描的圖形輸出

"010"=>d0<="00000000";"011"=>d0<="00000000";"100"=>d0<="00000000";"101"=>d0<="00000000";"110"=>d0<="00000000";

輸入2時,列掃描的圖形輸出--輸入3時,列掃描的圖形輸出--輸入4時,列掃描的圖形輸出--輸入5時,列掃描的圖形輸出輸入時,列掃描的圖形輸出

"111"=>d0<="00000000";輸入時,列掃描的圖形輸出others=>d0<="00000000";--無輸入時,列掃描的形輸出then--位后,列掃描的圖形輸出if;if(clk_tmp='1'

--這里實現(xiàn)了逐行掃描ifst1(7downto0)="00000000"orst1(7downtost1(7downto0)<="11111110";data<=d0;st1(7downto0)="11111110"thenst1(7downto0)<="11111101";data<=d1;st1(7downto0)="11111101"thenst1(7downto0)<="11111011";data<=d2;st1(7downto0)="11111011"thenst1(7downto0)<="11110111";data<=d3;st1(7downto0)="11110111"thenst1(7downto0)<="11101111";data<=d4;st1(7downto0)="11101111"thenst1(7downto0)<="11011111";data<=d5;st1(7downto0)="11011111"thenst1(7downto0)<="10111111";data<=d6;st1(7downto0)="10111111"thenst1(7downto0)<="01111111";data<=d7;

if;if;p2;beginclk='1')thenifthenclk_tmp;if;if;p3;

給予點陣掃描一個合適的時鐘store.vhl

--音存播放模塊libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;storeisport(index_key:instd_logic_vector(4clk:inin--錄音按鍵

--重播按鍵clr:in:outstd_logic_vector(40));store;ofsignal:0tosignalxiabiao:0tosignalchangdu:integer0tosignaljiepai:signal:to10000000;typeisdowntoofstd_logic_vector(4--聲明二維數組新類型signal:beginbeginifeventandifk=10000000k<=0;notjiepai;

--生錄音的節(jié)拍時鐘

k<=k+1;if;if;process;beginifstore1='1'ifclr='1'0;

復位有效后,想錄音存儲的原有數組清除jiepai'eventjiepai='1'index_key;ifjishu=100--開始錄音存儲jishu<=jishu+1;if;if;changdu<=jishu;if;process;beginif='1'ifthen

錄入音符數目加1--xiabiao作為錄音重播的計數器jiepai'eventjiepai='1'index_store<=shuzu1(xiabiao);ifthenxiabiao<=0;if;if;if;process;五、功能說本電子琴基于VHDL編程實現(xiàn),可以實現(xiàn)高中低21音調的輸出,配合點陣以及數碼管顯示同時具有自動播放和手動輸入選擇的功能自動播放樂曲為預先選定的一定長度的歌曲同時本電子琴還具有錄音和播放的功能可以記錄錄入的任何音調以及時間的停頓。首先BTN0BTN1BTN2BTN3,BTN5,BTN6分別對應手動演奏的七個音調的按鍵而高中低音的模式選擇由BW6,BW7合選擇二者均為高電平時為高音輸出模式;均為低電平為低音輸出模式;分別對應,為中音輸出模式在高中低模式組合和按鍵的組合下以對應不同音調的手動演奏。BW5BW2為自動手動錄音選擇,BW5為高電平,對應自動播放;為低

電平,對應手動按鍵演奏;BW2為高電平,則啟動手動按鍵錄音的功能。BW1有效,可以播放錄入的按鍵信息。需要特別說明的是,BTN0為復位按鍵,按下有效。在自動播放和錄音播放的過程中,按下此鍵,點陣恢復初始界面,樂曲停止,手松開,會重頭播放,完整的實現(xiàn)了復位的功能而在按鍵錄音時由于我是用了二維數組來存儲按鍵信息,按下此鍵,可以清除數組原有數據,即以前錄入的按鍵信息,重新錄入新數據。所以,本電子琴的vhdl實現(xiàn)完成了預定的全部基礎功能和提高功能。且完成狀態(tài)正常良好。六、元器件單及資源利情況在本次電子琴的vhdl實現(xiàn)實驗中我使用的軟件為QuartusII使用的下載板為MAXII的。我總共使用了5撥碼開關,8個按鍵,6個數碼選通管,8個數碼管分段顯示信號,主頻時鐘,揚聲器輸

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論