《FPGA設(shè)計(jì)quartus萬水千山總是情歌曲播放器》由會員分享,可在線閱讀,更多相關(guān)《FPGA設(shè)計(jì)quartus萬水千山總是情歌曲播放器(5頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、樂曲演奏系統(tǒng)設(shè)計(jì)
1.1 系統(tǒng)原理
傳統(tǒng)數(shù)字邏輯設(shè)計(jì)方法相比,本設(shè)計(jì)借助于功能強(qiáng)大的EDA工具和硬件描述語言來完成,如果只以純硬件的方法完成樂曲演奏電路的設(shè)計(jì),將是難以實(shí)現(xiàn)的。本設(shè)計(jì)采用了《萬水千山總是情》(圖3-1)的一部分來曲子來完成。
為了便于理解,首先介紹一下硬件電路的發(fā)聲原理。我們知道,聲音的頻譜范圍約在幾十到幾千赫茲,若能利用程序來控制FPGA某個(gè)引腳輸出一定頻率的矩形波,接上揚(yáng)聲器就能發(fā)出相應(yīng)頻率的聲音。而樂曲中的每一音符對應(yīng)著一個(gè)確定的頻率,因此,要想FPGA發(fā)出不用音符的音調(diào),實(shí)際上只要控制它輸出相應(yīng)音符的頻率即可(音符和頻率的關(guān)系見表3-1)。樂曲都是由一連串的音符組
2、成,因此按照樂曲的樂譜依次輸出這些音符所對應(yīng)的頻率,就可以在揚(yáng)聲器上連續(xù)地發(fā)出各個(gè)音符的音調(diào)。而要準(zhǔn)確地演奏出一首樂曲,僅僅讓揚(yáng)聲器能夠發(fā)聲是不夠的,還必須準(zhǔn)確地控制樂曲的節(jié)奏,即每個(gè)音符的持續(xù)時(shí)間。由此可見,樂曲中每個(gè)音符的發(fā)音頻率及其持續(xù)的時(shí)間是樂曲能夠連續(xù)演奏的兩個(gè)關(guān)鍵因素。
而簡易電子琴,工作原理與樂曲演奏一樣,只是將固定預(yù)置樂曲變成了手動按鍵輸入,節(jié)拍時(shí)間取決于按鍵的停留時(shí)間,如果合適,同樣能播放出完整的歌曲來。
圖3-1《萬水千山總是情》曲譜
1.1.1 音調(diào)的控制
頻率的高低決定了音調(diào)的高低。音樂的十二平均率規(guī)定:每兩個(gè)八度音(如簡譜中的中音1和高音1)之間的頻率相差
3、一倍。在兩個(gè)八度音之間又分為十二個(gè)半音。另外,音名A(簡譜中的低音6)的頻率為440Hz,音名B到C之間、E到F之間為半音,其余為全音。由此可以計(jì)算出簡譜中從低音1到高音1之間每個(gè)音名對應(yīng)的頻率,所有不同頻率的信號都是從同一個(gè)基準(zhǔn)頻率分頻得到的。由于音階頻率多為非整數(shù),而分頻系數(shù)又不能為小數(shù),因此必須將計(jì)算得到的分頻數(shù)四舍五入取整。若基準(zhǔn)頻率過低,則由于分頻比太小,四舍五入取整后的誤差較大;若基準(zhǔn)頻率過高,雖然誤差較小,但分頻數(shù)將變大。實(shí)際的設(shè)計(jì)應(yīng)綜合考慮這兩方面的因素,在盡量減小頻率誤差的前提下取合適的基準(zhǔn)頻率。因此,要想FPGA發(fā)出不同音符的音調(diào),實(shí)際上只要控制它輸出相應(yīng)音符的頻率即可。綜
4、合考慮各因素,本文中選取12MHZ作為CLK的分頻計(jì)數(shù)器的輸入分頻信號。樂曲都是由一連串的音符組成,因此按照樂曲的樂譜依次輸出這些音符所對應(yīng)的頻率,就可以在揚(yáng)聲器上連續(xù)地發(fā)出各個(gè)音符的音調(diào)。
表3-1 簡譜中的音名與頻率的關(guān)系
音名
頻率/Hz
音名
頻率/Hz
音名
頻率/Hz
低音1
261.6
中音1
523.3
高音1
1045.5
低音2
293.7
中音2
587.3
高音2
1174.7
低音3
329.6
中音3
659.3
高音3
1318.5
低音4
349.2
中音4
698.5
高音4
1396.9
低音5
5、
392
中音5
784
高音5
1568
低音6
440
中音6
880
高音6
1760
低音7
493.9
中音7
987.8
高音7
1975.5
1.1.2 音長的控制
音符的持續(xù)時(shí)間須根據(jù)樂曲的速度及每個(gè)音符的節(jié)拍數(shù)來確定。因此,在想控制音符的音長,就必須知道樂曲的速度和每個(gè)音符所對應(yīng)的節(jié)拍數(shù),在這個(gè)設(shè)計(jì)中所演奏的樂曲的最短的音符為四分音符,如果將全音符的持續(xù)時(shí)間設(shè)為1s的話,那么一拍所應(yīng)該持續(xù)的時(shí)間為0.25秒,則只需要再提供一個(gè)4HZ的時(shí)鐘頻率即可產(chǎn)生四分音符的時(shí)長。要想讓系統(tǒng)知道現(xiàn)在應(yīng)該演奏哪個(gè)音符,而這個(gè)音符持續(xù)的時(shí)間應(yīng)該是多少,就必須
6、編寫樂曲文件,在樂曲文件中音符是按地址存放的,當(dāng)系統(tǒng)工作時(shí)就按4Hz的頻率依次讀取簡譜,當(dāng)系統(tǒng)讀到某個(gè)音符的簡譜時(shí)就對應(yīng)發(fā)這個(gè)音符的音調(diào),持續(xù)時(shí)間為0.25秒,而如果在曲譜文件中這個(gè)音符為三拍音長,那又該如何控制呢?其實(shí)只要將該音符連續(xù)書寫三遍,這時(shí)系統(tǒng)讀樂曲文件的時(shí)候就會連續(xù)讀到三次,也就會發(fā)三個(gè)0.25秒的音長,這時(shí)我們聽上去就會持續(xù)了三拍的時(shí)間,通過這樣一個(gè)簡單的操作就可以控制音樂的音長了。
1.2 系統(tǒng)結(jié)構(gòu)
本系統(tǒng)主要由四個(gè)功能模塊組成:NOTETABS.VHD,TONETABA.VHD和 SPEAKER.VHD。第一部分NOTETABS,地址發(fā)生器,實(shí)現(xiàn)按節(jié)拍讀樂譜的功能;第二
7、部分TONETABA,查表電路,為SPEAKER提供分頻預(yù)置數(shù),實(shí)現(xiàn)樂曲譯碼輸出CODE[3:0];第三部分SPEAKERA,產(chǎn)生發(fā)音頻率,實(shí)現(xiàn)樂曲播放;第四部分ELECLOCK實(shí)現(xiàn)簡易電子琴功能。系統(tǒng)結(jié)構(gòu)圖如(圖3-2),該系統(tǒng)有三個(gè)輸入,五個(gè)輸出端口。三輸入端口分別是:
CLK 4HZ端口,作為節(jié)拍脈沖信號輸入端口;
CLK 12MHZ端口,作為發(fā)音頻率初始信號輸入端口;
KEYIN輸入端口,作為簡易電子琴音符輸入端口。
五輸出端口分別是:
CODE輸出端口,作為音符簡碼輸出LED顯示端口;
HIGH輸出端口,作為音符高8度指示端口;
SPKS輸出端口,作為《萬水千山總是情》
8、樂曲的聲音輸出端口;
BUZZOUT輸出端口,作為簡易電子琴聲音輸出端口;
LEDOUT輸出端口,作為簡易電子琴輸入音符顯示端口。
圖3-2 系統(tǒng)功能模塊組成圖
1.3 各模塊分析與設(shè)計(jì)
1.3.1 定制《萬水千山總是情》音符數(shù)據(jù)ROM
為了實(shí)現(xiàn)樂曲的播放,首先需要將曲譜定制到音符數(shù)據(jù)ROM里面,然后才能按照一定的節(jié)拍從ROM中讀出曲譜。由于所選曲子中不含高音,我們轉(zhuǎn)換關(guān)系如(表3-2):
表3-2音符與ROM中數(shù)據(jù)轉(zhuǎn)換關(guān)系
低音
ROM中十進(jìn)制表示
ROM中十六進(jìn)制表示
中音
ROM中十進(jìn)制表示
ROM中十六進(jìn)制表示
1
1
01
1
8
08
9、
2
2
02
2
9
09
3
3
03
3
10
0A
4
4
04
4
11
0B
5
5
05
5
12
0C
6
6
06
6
13
0D
7
7
07
7
14
0E
1.3.2 音符數(shù)據(jù)地址發(fā)生器模塊 NOTETABS
NOTETABS中設(shè)置了一個(gè)8位二進(jìn)制計(jì)數(shù)器(計(jì)數(shù)最大值138),作為音符數(shù)據(jù)的地址發(fā)生器。隨著NOTETABS中的計(jì)數(shù)器按照4HZ的時(shí)鐘速率作加法計(jì)數(shù)時(shí),每讀一個(gè)數(shù)據(jù),音符持續(xù)時(shí)間為0.25秒,如音符數(shù)據(jù)中的中音3,為一拍,持續(xù)時(shí)間1秒,所以,音符數(shù)據(jù)ROM中需要重復(fù)寫四次地址0A,隨著
10、4HZ時(shí)鐘速率讀取地址遞增,音符數(shù)據(jù)ROM中的音符數(shù)據(jù)將通過模塊NOTETABS中ToneIndex[3..0]端口輸向TONETABA模塊。
1.3.3 預(yù)置數(shù)查表電路電路模塊 TONETABA
音符的持續(xù)時(shí)間須根據(jù)樂曲的速度及每個(gè)音符的節(jié)拍數(shù)來確定,(圖3-2)中模塊 TONETABA的功能首先是為SPEAKERA提供決定音符發(fā)音的分頻預(yù)置數(shù),而此數(shù)在SPEAKERA輸入口停留時(shí)間即為此音符的節(jié)拍值。模塊TONETABA是樂曲簡譜碼對應(yīng)的分頻預(yù)置數(shù)查表電路,其中設(shè)置了《萬水千山總是情》樂曲全部音符所對應(yīng)的分頻預(yù)置數(shù),共9個(gè),每一個(gè)音符的停留時(shí)間由音樂節(jié)拍和音調(diào)發(fā)生器模塊TONETAB
11、S的CLK輸入頻率決定,在此時(shí)為4HZ。每一個(gè)計(jì)數(shù)值停留時(shí)間為0.25秒,恰為當(dāng)全音符為1秒時(shí),四四拍的4 分音符持續(xù)時(shí)間。這9個(gè)值的輸出由對應(yīng)于TONETABA的4位輸入值Index[3..0]確定,而Index[3..0]最多有16種選擇。輸向TONETABA中Index[3..0]的值 ToneIndex[3..0]的輸出值與持續(xù)的時(shí)間由模塊NOTETABAS決定。
1.3.4 發(fā)聲頻率產(chǎn)生模塊 SPEAKERA
這是樂曲演奏電路最重要的模塊,由它產(chǎn)生樂曲發(fā)音所需要的對應(yīng)頻率。此模塊的核心是一個(gè)可預(yù)置數(shù)控分頻器,下面是可預(yù)置數(shù)控分頻器的原理介紹:
它是由一個(gè)初值可變的加法計(jì)數(shù)器組
12、成。為了得到合適的發(fā)音頻率,在進(jìn)行預(yù)置計(jì)數(shù)分頻之前需要將本文選擇的12MHZ初始頻率信號進(jìn)行十六分頻,采用四位加法計(jì)數(shù)方式分頻,當(dāng)輸入一個(gè)脈沖信號,計(jì)數(shù)器做一次加法計(jì)數(shù),此時(shí)輸入信號脈寬展寬一倍(即進(jìn)行一次二分頻),十六分頻后得到0.75MHZ輸入頻率。由于數(shù)控分頻器輸出的信號是脈寬很窄的信號,為了有利于驅(qū)動揚(yáng)聲器發(fā)音,需要加一個(gè)D觸發(fā)器以均衡占空比,但這樣一來,此時(shí)頻率變?yōu)樵瓉淼亩种患?.375MHZ??深A(yù)置計(jì)數(shù)分頻器就是將0.375MHZ按照各音符發(fā)音所需要的頻率值進(jìn)行預(yù)置數(shù)分頻。這里計(jì)數(shù)器設(shè)為11位(Tone[10..0]),模為2047(預(yù)置數(shù)可由預(yù)置數(shù)查表電路模塊TONETABA
13、查得)。若取音符3發(fā)音頻率為659HZ,需要將0.375MHZ進(jìn)行約569次分頻才能得到此頻率。預(yù)置數(shù)即可用公式“模-分頻系數(shù)=預(yù)置數(shù)Tone[10..0]”算出,此時(shí)為“2047-569=1478(換成11位二進(jìn)制計(jì)數(shù)為10111000110)”。
表3-3 《萬水千山總是情》各音階對應(yīng)的分頻預(yù)置數(shù)關(guān)系
音符
分頻預(yù)置數(shù)
二進(jìn)制碼
音符
分頻預(yù)置數(shù)
二進(jìn)制碼
中音1
1329
10100110001
中音5
1568
11000100000
中音2
1408
10110000000
中音6
1620
11001010100
中音3
1478
10111000110
低音5
1087
10000111111
中音4
1510
10111100110
低音6
1194
10010101010