1 概 述
隨著EDA 技術的進展,基于可編程 ASIC 的數字電子系統設計的完整方案越來越受到人們的重視,并且以 EDA 技術為核心的能在可編程 ASIC 上進行系統芯片集成的新設計方法,也正在快速地取代基于 PCB板的傳統設計方式。
與利用微處理器(CPU 或MCU)來實現樂曲演奏相比,以純硬件完成樂曲演奏電路的邏輯要復雜得多,如果不借助于功能強大的 EDA 工具和硬件描述語言,僅憑傳統的數字邏輯技術,即使簡單的演奏電路也難以實現。如何使用EDA工具設計電子系統是人們普遍關心的問題,本設計在美國ALTERA公司MAX + plusⅡ的 EDA 軟件平臺上,使用層次化設計方法,實現了樂曲發生器的設計。樂曲選取《梁祝》中化蝶部分,其簡譜如圖 1所示。
2 音符與頻率的關系
我們知道,組成樂曲的每個音符的發音頻率值及其持續的時間是樂曲能連續演奏所需的2個基本要素,首先讓我們來了解音符與頻率的關系。
樂曲的12平均率規定:每 2 個八度音(如簡譜中的中音 1 與高音 1)之間的頻率相差 1 倍。在2 個八度音之間,又可分為12個半音,每2個半音的頻率比為12√2。另外,音符A(簡譜中的低音6)的頻率為440Hz,音符 B 到C之間、E 到F之間為半音,其余為全音。由此可以計算出簡譜中從低音 l 至高音1 之間每個音符的頻率,如表 1 所示。
產生各音符所需的頻率可用一分頻器實現,由于各音符對應的頻率多為非整數,而分頻系數又不能為小數,故必須將計算得到的分頻數四舍五入取整。若分頻器時鐘頻率過低,則由于分頻系數過小,四舍五入取整后的誤差較大;若時鐘頻率過高,雖然誤差變小,但會增加分頻器的分頻級數。實際的設計應綜合考慮兩方面的因素,在盡量減小頻率誤差的前提下取合適的時鐘頻率。本文設計的樂曲發生器選取6MHz 的基準頻率。若無 6MHz 的時鐘頻率,則可以先分頻得到 6MHz 或換一個新的基準頻率。實際上,只要各個音符間的相對頻率關系不變,演奏出的樂曲聽起來都不會"走調"。
化蝶簡譜中各音符對應的分頻系數如表 2所示。為了減小輸出的偶次諧波分量,輸出到揚聲器的波形應為對稱方波,因此在到達揚聲器之前,有一個二分頻的分頻器。表 2 中的分頻系數是從 6MHz 頻率二分頻得到的 3MHz 頻率基礎上計算得出的。由于的分頻系數為 9101,故采用 14位二進制計數器已能滿足分頻要求。
每個音符持續的時間是樂曲能連續演奏所需的另一個基本要素。化蝶的小的節拍為 1/4 拍,將1拍的時間長度定為 1s,則只需要再提供一個 4Hz 的時鐘頻率即可產生 1/4 拍的時長。演奏的時間控制通過記錄來完成,對于占用時間較長的節拍(一定是 1/4 拍的整數倍,如 2/4 拍),只需將該音符連續記錄2 次即可。
3 層次化設計
我們在美國 ALTERA 公司MAX + plusⅡ的 EDA 軟件平臺上,使用層次化設計手段,實現了化蝶樂曲發生器的設計。圖 2 為化蝶樂曲發生器的頂層電路。
音符的頻率可以由 PUI。SE 元件的輸出 SPEAK 獲得,這是一個數控分頻器,由其 CLK 6MHz 端輸入 6MHz脈沖信號,分頻比由預置輸入端 D[13..0]決定。輸出為方波信號,其頻率為 3 000 000/(1+D[13..0]),單位為 Hz。
音符的持續時間需根據樂曲的速度及每個音符的節拍數來確定,TABLE 元件首先是為 PULSE 元件提供決定所發音符的分頻預置數,而此數停留的時間即為此音符的節拍值。在 TABLE元件中設置了一個 8 位二進制計數器(計數值為 138),這個計數器的計數頻率選為 4 Hz,所以每一計數值的停留時間為 0.25s,即四四拍的 4 分音符持續時間。例如,化蝶樂曲的個音符?quot;低音 3"(1 拍),停留的時間需用 4 個計數時鐘節拍,即 1s。相應地,所對應的"低音3"音符分頻預置值為 9 100,其值在AF[13..0]輸出端停留了 1s。隨著 TABLE元件中的計數器按 4Hz的時鐘速率作加法計數時,化蝶樂曲就開始連續自然地演奏起來了。
底層元件的 VHDL 邏輯描述如下:
--PULSE 元件
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY pulse IS
PORT(clk:INSTD_LOGIC; --待分頻時鐘
d:IN STD_LOGIC_VECTOR(13 DOWNTO 0); --分頻預置數輸入
fout:OUTSTD_LOGIC); --發音輸出
END pulses
ARCHITECTURE behav OF pulse IS
SIGNAL count : STD_LOGIC-VECTOR(13DOWNTO 0);
SIGNAL cao,caoo1,cao2,load:STD_LOGIC'
BEGIN
PROCESS(clk,load,d)
BEGIN
IF clk'EVENT AND clk='l'THEN
IF load='1'THEN count<=d;
ELSE count<=count 一1;
END IF;
END IF;
END PROCESS;
PROCESS(count)
BEGIN
IF count=0 THEN cao<='l';
ELSE cao<='0'; END IF;
load<=cao;
END PROCESS;
PROCESS(clk) --去毛刺
BEGIN
IF clk'EVENT ANDclk='1'THEN
caol<=cao;
END IF;
END PROCESS;
PROCESS(cao1)
BEGIN
IF cao1'EVENT AND cao1='1'THEN
ca02<=NOT cao2;
END IF
fout<=cao2;
END PROCESS;
END behav;
-- TABLE元件
IBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY table IS
PORT(clk:IN STD_LOGIC;
af:OUT INTEGER RANGE 0 TO 16#3FFF#)
--14 位二進制數
END;
ARCHITECTURE one OF table IS
CONSTANT 1ow_3:INTEGER:=9100;
CONSTANT 1ow_5;INTEGER:=7652;
CONSTANT 1ow_6:INTEGER:=6817;
CONSTANT 1ow_7:INTEGER:=6073;
CONSTANT mid_1:INTEGER;=5732;
CONSTANT mid_2:INTEGER:=5107;
CONSTANT mid_3:INTEGER:=4550;
CONSTANT mid_5:INTEGER:=3826;
CONSTANT mid_6:INTEGER:=3408;
CONSTANT highl:INTEGER: =2866
CONSTANT stop:INTEGER:=0;
--休止符分頻系數
SIGNAL counter:INTEGER RANGE 0 TO 138;
BEGIN
PROCESS(clk)
BEGIN
IF counter=138 THEN counter<=0;
ELSIF(clk'EVENT AND clk='l')THEN
counter<=counter+1;
END IF;
END PROCESS;
PROCESS(counter)
BEGIN
CASE counter IS
WHEN 00=>af<=low_3; --低音3
WHEN 01=>af<=low_3;
WHEN 02=>af<=low_3;
WHEN 03=>af<=low_3;
WHEN 04?gt;af<=low_5;
WHEN 05=>af<=low_5;
WHEN 06=>af<=low_5;
WHEN 07=>af<=low_6;
WHEN 08=>af<=low_1;
WHEN 09=>af<=low_1;
WHEN 10=>af<=low_1;
WHEN 11=>af<=low_2;
……
WHEN 134=>af<=low_5;
WHEN 135=>>af<=low_5;
WHEN 136=>>af<=stop;
WHEN 137=>af<=stop;
WHEN 138=>>af<=stop;
WHEN OTHERS=>NULL;
END CASE;
END PROCESS;
END;
4 實驗驗證
需要說明的是不同的數字系統其引腳鎖定是不一樣的,為了便于在實驗系統上驗證設計結果,必須按照實驗系統的結構對輸入和輸出引腳進行鎖定。本設計采用的是杭州康芯電子有限公司生產的 GW48-CK實驗系統,FPGA 目標芯片的型號為 EPFl0K10LC84。芯片配置成功后即可進行硬件測試:選擇實驗電路結構圖 NO.6,使CLK 6MH2 與C10ck9 相接(接受 6MHz 時鐘頻率),CLK 4Hz 與Clock2 相接(接受4Hz 時鐘頻率),發音輸出接 SPEAK,當樂曲一遍演奏完成后,樂曲發生器能自動從頭開始循環演奏。