【文章內容簡介】
輸出 WHEN 137 = ToneIndex = 0。 頻率為零 WHEN 138 = ToneIndex = 0。 WHEN OTHERS = NULL。 END CASE。 END PROCESS。 END。 隨著頻率記數(shù)器預置數(shù)記數(shù)法開始記數(shù),得到了音節(jié)的輸出頻率和節(jié)拍,每 為一個周期,頻率為 4HZ,音階隨著基準頻率分頻得到的頻率從低沈陽工程學院課程設計(論文) 11 音依次到高音。 仿真波形如下: 圖 音樂節(jié)拍發(fā)生器防真波形 原器件符號: 圖 音樂發(fā)生器元件符號 音符譯碼電路 toaba 模塊 音符譯碼電路即音調發(fā)生器實際上是一個翻譯電路,根據(jù)輸入為數(shù)控分頻模塊提供所發(fā)音符頻率的初始值,而此數(shù)控分頻模塊入口的停留時間即為此音符的節(jié)拍數(shù),以 VHDL 程序中僅設置了“梁?!睒非恳舴鶎囊舴l率的初始值。 //CLK_4HZ: 用于控制音長(節(jié)拍)的時鐘頻率; //CLK_6MHZ: 用于產生各種音階頻率的基準頻率; //SPEAKER: 用于激勵揚聲器的輸出信號,本例中為方波信 號; //HIGH, MED, LOW:分別用于顯示高音、中音和低音音符,各驅 動一個數(shù)碼管來顯示。 其 VHDL 源程序如下: LIBRARY IEEE。 沈陽工程學院課程設計(論文) 12 USE 。 ENTITY ToneTaba IS PORT ( Index : IN INTEGER RANGE 0 TO 15。 CODE : OUT INTEGER RANGE 0 TO 15。 HIGH : OUT STD_LOGIC。 Tone : OUT INTEGER RANGE 0 TO 167FF )。 END。 ARCHITECTURE one OF ToneTaba IS BEGIN Search : PROCESS(Index) BEGIN CASE Index IS 譯碼電路,查表方式,控制音調的預置數(shù) WHEN 0 = Tone = 2047。 CODE = 0。 HIGH = 39。039。 WHEN 1 = Tone = 773。 CODE = 1。 HIGH = 39。039。 WHEN 2 = Tone = 912。 CODE = 2。 HIGH = 39。039。 WHEN 3 = Tone = 1036。 CODE = 3。 HIGH = 39。039。 WHEN 5 = Tone = 1197。 CODE = 5。 HIGH = 39。039。 WHEN 6 = Tone = 1290。 CODE = 6。 HIGH = 39。039。 WHEN 7 = Tone = 1372。 CODE = 7。 HIGH = 39。039。 WHEN 8 = Tone = 1410。 CODE = 1。 HIGH = 39。139。 WHEN 9 = Tone = 1480。 CODE = 2。 HIGH = 39。139。 WHEN 10 = Tone = 1542。 CODE = 3。 HIGH = 39。139。 WHEN 12 = Tone = 1622。 CODE = 5。 HIGH = 39。139。 WHEN 13 = Tone = 1668。 CODE = 6。 HIGH = 39。139。 WHEN 15 = Tone = 1728。 CODE = 1。 HIGH = 39。139。 WHEN OTHERS = NULL。 END CASE。 END PROCESS。 END。 在源程序中 Index 是音樂節(jié)拍發(fā)生器輸出的音符數(shù)據(jù); TONE 是為數(shù)控分頻模塊提供的音符頻率的初始值,為方便測試,特設置了一個音名代碼顯示沈陽工程學院課程設計(論文) 13 輸出 CODE 和音高指示信號 HUGH 可以通過數(shù)碼管或 LED 來顯示樂曲演奏時對應的音符和高音名。 CODE 輸出對應該音階簡譜的顯示數(shù)碼 1, HIGH 輸出為高電平,指示音階為高, HIGH 輸出為低電平時,則指示音階為中音。低音時,Tone 值小,分頻比大,進位信號 SPKS 的周期長。 圖 音符譯碼電路仿真波形 圖 音樂譯碼器元件符號 數(shù)控分頻模塊( speakera)設計 數(shù)控分頻模塊設計采用了預置數(shù)記數(shù)法分頻,從而得到各個音階所產生的頻率輸出。所謂預置數(shù)記數(shù)就是先預置個數(shù),然后用休止符數(shù)減去預置數(shù)就是分頻數(shù),然后用基準頻率除以分頻數(shù)就是該音階的頻率。 數(shù)控分頻器對 FPGA 的基準頻率進行分頻,得到與各個音階對應的頻率輸出。數(shù)控分頻模塊是 11 位的加法計數(shù)器構成。當計數(shù)器計滿是,產生一個進位信號 FULLSPKS,該信號就是用作發(fā)音的頻率信號。在即使器的預置端給定不同的初始值,其輸出將產生不同的頻率信號,頻率信號初值 Tone 就是前級音符譯碼電路的輸出。低音時, Tone 值 小,分頻比大,進位信號 SPKS 的周期長,揚聲器發(fā)出的聲音低, Tone 隨音樂的樂譜而變化,自動控制分頻比,沈陽工程學院課程設計(論文) 14 從而實現(xiàn)數(shù)控分頻,發(fā)生信號的頻率與 Tone 成正比,這就是利用數(shù)控分頻器演奏音樂的原理。 通過分頻后其進位信號 FULLSPJKS 是一周期脈沖信號,為有利于驅動揚聲器,在音調輸出時再進行 2 分頻,將脈沖展寬,使之占空比為 50%,揚聲器這樣就有足夠的發(fā)聲功率。 其 VHDL 源程序如下: LIBRARY IEEE。 USE 。 ENTITY Speakera IS PORT ( clk : IN STD_LOGIC。 Tone : IN INTEGER RANGE 0 TO 167FF。 SpkS : OUT STD_LOGIC )。 END。 ARCHITECTURE one OF Speakera IS SIGNAL PreCLK : STD_LOGIC。 SIGNAL FullSpkS : STD_LOGIC。 BEGIN DivideCLK : PROCESS(clk) VARIABLE Count4 : INTEGER RANGE 0 TO 15。 BEGIN PreCLK = 39。039。 將 CLK 進行 16 分頻, PreCLK 為 CLK 的 16 分 頻 IF Count4 11 THEN PreCLK = 39。139。 Count4 := 0。 ELSIF clk39。EVENT AND clk = 39。139。 THEN Count4 := Count4 + 1。 END IF。 END PROCESS。 GenSpkS : PROCESS(PreCLK, Tone) VARIABLE Count11 : INTEGER RANGE 0 TO 167FF。 BEGIN 11 位可預置計數(shù)器 沈陽工程學院課程設計(論文) 15 IF PreCLK39。EVENT AND PreCLK = 39。139。 THEN IF Count11 = 167FF THEN Count11 := Tone。 FullSpkS = 39。139。 ELSE Count11 := Count11 + 1。 FullSpkS = 39。039。 END IF。 END IF。 END PROCESS。 DelaySpkS : PROCESS(FullSpkS) VARIABLE Count2 : STD_LOGIC。 BEGIN 將輸出再進行 2 分頻,將脈沖展寬,以使揚聲器有足夠功率發(fā)音 IF FullSpkS39。EVENT AND FullSpkS = 39。139。 THEN Count2 := NOT Count2。 IF Count2 = 39。139。 THEN SpkS = 39。139。 Else SpkS=39。039。END IF。 END IF。 END PROCESS。 END。 VHDL 程序的第 1 個進程首先對 FPGA 的時基脈沖 Tone 輸入的分頻系數(shù)進行分頻,得到所需要的音符頻率;第 2 個進程的作用是在音調輸出時再進行2 分頻,將脈沖展寬,使揚聲器有足夠發(fā)生功率。 數(shù)控分頻器仿真波形 如下: 圖 數(shù)控分頻器仿真波形 沈陽工程學院課程設計(論文) 16 圖 分頻器元件符號 樂曲硬件演奏電路的頂層設計和仿真 樂曲硬件演奏電路頂層電路分為 3個模塊,音樂節(jié)拍發(fā)生器 NoteTabs 模塊,音符譯碼電路 Toabs 模塊,數(shù)控分頻模塊( speaker)。其頂層設計的VHDL 程序如下: LIBRARY IEEE。 USE 。 ENTITY Songer IS 頂層設計 PORT ( CLK12MHZ : IN STD_LOGIC。 音調頻率信號 CLK8HZ : IN STD_LOGIC。 節(jié)拍頻率信號 CODE1 : OUT INTEGER RANGE 0 TO 15。 HIGH1 : OUT STD_LOGIC。 SPKOUT : OUT STD_LOGIC )。 END。 ARCHITECTURE one OF Songer IS COMPONENT NoteTabs PORT ( clk : IN STD_LOGIC。 ToneIndex : OUT INTEGER RANGE 0 TO 15 )。 END COMPONENT。 COMPONENT ToneTaba PORT ( Index : IN INTEGER RANGE 0 TO 15。 CODE : OUT INTEGER RANGE 0 TO 15。 沈陽工程學院課程設計(論文) 17 HIGH : OUT STD_LOGIC。 Tone : OUT INTEGER RANGE 0 TO 167FF )。 11 位 2 進制數(shù) END COMPONENT。 COMPONENT Speakera PORT ( clk : IN STD_LOGIC。 Tone : IN INTEGER RANGE 0 TO 167FF。 11 位 2 進制數(shù) SpkS : OUT STD_LOGIC )。 END COMPONENT。 SIGNAL Tone : INTEGER RANGE 0 TO 167FF。 SIGNAL ToneIndex : INTEGER RANGE 0 TO 15。 BEGIN 安裝 U1, U2, U3 u1 : NoteTabs PORT MAP (clk=C