新聞中心

        EEPW首頁 > EDA/PCB > 設計應用 > 基于FPGA的樂曲發生器設計

        基于FPGA的樂曲發生器設計

        作者: 時間:2006-08-31 來源:網絡 收藏

        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 層次化設計

        我們在美國AI。TERA公司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實驗系統,目標芯片的型號為EPFl0K10LC84。芯片配置成功后即可進行硬件測試:選擇實驗電路結構圖NO.6,使CLK 6MH2與C10ck9相接(接受6MHz時鐘頻率),CLK 4Hz與Clock2相接(接受4Hz時鐘頻率),發音輸出接SPEAK,當樂曲一遍演奏完成后,樂曲發生器能自動從頭開始循環演奏。

        分頻器相關文章:分頻器原理


        關鍵詞: FPGA 發生器

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 九台市| 齐河县| 吉木萨尔县| 安宁市| 连州市| 邢台县| 邹平县| 丰宁| 顺平县| 贞丰县| 黄陵县| 河曲县| 沙洋县| 洪江市| 鲁甸县| 通江县| 白玉县| 洛川县| 旬阳县| 岑巩县| 比如县| 水富县| 淄博市| 枞阳县| 凉山| 大渡口区| 郓城县| 贵南县| 金川县| 张家港市| 河西区| 衡阳市| 英吉沙县| 许昌市| 克拉玛依市| 乐安县| 和静县| 兴山县| 石林| 墨玉县| 阿拉善右旗|