<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > EDA/PCB > 設計應用 > 基于FPGA的樂(lè )曲發(fā)生器設計

基于FPGA的樂(lè )曲發(fā)生器設計

作者: 時(shí)間:2006-08-31 來(lái)源:網(wǎng)絡(luò ) 收藏

1 概 述
隨著(zhù)EDA技術(shù)的進(jìn)展,基于可編程ASIC的數字電子系統設計的完整方案越來(lái)越受到人們的重視,并且以EDA技術(shù)為核心的能在可編程ASIC上進(jìn)行系統芯片集成的新設計方法,也正在快速地取代基于PCB板的傳統設計方式。

與利用微處理器(CPU或MCU)來(lái)實(shí)現樂(lè )曲演奏相比,以純硬件完成樂(lè )曲演奏電路的邏輯要復雜得多,如果不借助于功能強大的EDA工具和硬件描述語(yǔ)言,僅憑傳統的數字邏輯技術(shù),即使最簡(jiǎn)單的演奏電路也難以實(shí)現。如何使用EDA工具設計電子系統是人們普遍關(guān)心的問(wèn)題,本設計在美國ALTERA公司MAX + plusⅡ的EDA軟件平臺上,使用層次化設計方法,實(shí)現了樂(lè )曲的設計。樂(lè )曲選取《梁?!分谢糠?,其簡(jiǎn)譜如圖1所示。

2音符與頻率的關(guān)系

我們知道,組成樂(lè )曲的每個(gè)音符的發(fā)音頻率值及其持續的時(shí)間是樂(lè )曲能連續演奏所需的2個(gè)基本要素,首先讓我們來(lái)了解音符與頻率的關(guān)系。

樂(lè )曲的12平均率規定:每2個(gè)八度音(如簡(jiǎn)譜中的中音1與高音1)之間的頻率相差1倍。在2個(gè)八度音之間,又可分為12個(gè)半音,每2個(gè)半音的頻率比為12√2。另外,音符A(簡(jiǎn)譜中的低音6)的頻率為440Hz,音符B到C之間、E到F之間為半音,其余為全音。由此可以計算出簡(jiǎn)譜中從低音l至高音1之間每個(gè)音符的頻率,如表1所示。

產(chǎn)生各音符所需的頻率可用一分頻器實(shí)現,由于各音符對應的頻率多為非整數,而分頻系數又不能為小數,故必須將計算得到的分頻數四舍五入取整。若分頻器時(shí)鐘頻率過(guò)低,則由于分頻系數過(guò)小,四舍五入取整后的誤差較大;若時(shí)鐘頻率過(guò)高,雖然誤差變小,但會(huì )增加分頻器的分頻級數。實(shí)際的設計應綜合考慮兩方面的因素,在盡量減小頻率誤差的前提下取合適的時(shí)鐘頻率。本文設計的樂(lè )曲選取6MHz的基準頻率。若無(wú)6MHz的時(shí)鐘頻率,則可以先分頻得到6MHz或換一個(gè)新的基準頻率。實(shí)際上,只要各個(gè)音符間的相對頻率關(guān)系不變,演奏出的樂(lè )曲聽(tīng)起來(lái)都不會(huì )"走調"。

化蝶簡(jiǎn)譜中各音符對應的分頻系數如表2所示。為了減小輸出的偶次諧波分量,最后輸出到揚聲器的波形應為對稱(chēng)方波,因此在到達揚聲器之前,有一個(gè)二分頻的分頻器。表2中的分頻系數是從6MHz頻率二分頻得到的3MHz頻率基礎上計算得出的。由于最大的分頻系數為9101,故采用14位二進(jìn)制計數器已能滿(mǎn)足分頻要求。

每個(gè)音符持續的時(shí)間是樂(lè )曲能連續演奏所需的另一個(gè)基本要素?;淖钚〉墓澟臑?/4拍,將1拍的時(shí)間長(cháng)度定為1s,則只需要再提供一個(gè)4Hz的時(shí)鐘頻率即可產(chǎn)生1/4拍的時(shí)長(cháng)。演奏的時(shí)間控制通過(guò)記錄來(lái)完成,對于占用時(shí)間較長(cháng)的節拍(一定是1/4拍的整數倍,如2/4拍),只需將該音符連續記錄2次即可。

3 層次化設計

我們在美國AI。TERA公司MAX + plusⅡ的EDA軟件平臺上,使用層次化設計手段,實(shí)現了化蝶樂(lè )曲的設計。圖2為化蝶樂(lè )曲發(fā)生器的頂層電路。

音符的頻率可以由PUI。SE元件的輸出SPEAK獲得,這是一個(gè)數控分頻器,由其CLK 6MHz端輸入6MHz脈沖信號,分頻比由預置輸入端D[13..0]決定。輸出為方波信號,其頻率為3 000 000/(1+D[13..0]),單位為Hz。

音符的持續時(shí)間需根據樂(lè )曲的速度及每個(gè)音符的節拍數來(lái)確定,TABLE元件首先是為PULSE元件提供決定所發(fā)音符的分頻預置數,而此數停留的時(shí)間即為此音符的節拍值。在TABLE元件中設置了一個(gè)8位二進(jìn)制計數器(計數最大值為138),這個(gè)計數器的計數頻率選為4 Hz,所以每一計數值的停留時(shí)間為0.25s,即四四拍的4分音符持續時(shí)間。例如,化蝶樂(lè )曲的第一個(gè)音符?quot;低音3"(1拍),停留的時(shí)間需用4個(gè)計數時(shí)鐘節拍,即1s。相應地,所對應的"低音3"音符分頻預置值為9 100,其值在A(yíng)F[13..0]輸出端停留了1s。隨著(zhù)TABLE元件中的計數器按4Hz的時(shí)鐘速率作加法計數時(shí),化蝶樂(lè )曲就開(kāi)始連續自然地演奏起來(lái)了。

底層元件的VHDL邏輯描述如下:

--PULSE元件
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY pulse IS
PORT(clk:INSTD_LOGIC; 一一待分頻時(shí)鐘
d:IN STD_LOGIC_VECTOR(13 DOWNTO 0);
--分頻預置數輸入
fout:OUTSTD_LOGIC); 一一發(fā)音輸出
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位二進(jìn)制數
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 實(shí)驗驗證

需要說(shuō)明的是不同的數字系統其引腳鎖定是不一樣的,為了便于在實(shí)驗系統上驗證設計結果,必須按照實(shí)驗系統的結構對輸入和輸出引腳進(jìn)行鎖定。本設計采用的是杭州康芯電子有限公司生產(chǎn)的GW48-CK實(shí)驗系統,目標芯片的型號為EPFl0K10LC84。芯片配置成功后即可進(jìn)行硬件測試:選擇實(shí)驗電路結構圖NO.6,使CLK 6MH2與C10ck9相接(接受6MHz時(shí)鐘頻率),CLK 4Hz與Clock2相接(接受4Hz時(shí)鐘頻率),發(fā)音輸出接SPEAK,當樂(lè )曲一遍演奏完成后,樂(lè )曲發(fā)生器能自動(dòng)從頭開(kāi)始循環(huán)演奏。

分頻器相關(guān)文章:分頻器原理


關(guān)鍵詞: FPGA 發(fā)生器

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>