【文章內(nèi)容簡介】
見表 22所示。 分頻電路 鍵盤譯碼 防抖動電路 控制電路 控制分頻 音符分頻 時鐘輸入 基于 FPGA 的電子琴設(shè)計 3 表 22音符與其對應(yīng)的頻率值的參數(shù) 音符 低音la 低音si 中音do 中音re 中音mi 中音fa 中音sol 中音la 中音si 高音do 頻率 f 220 247 262 294 330 349 392 440 494 524 樂曲節(jié)奏的控制 本 設(shè)計 中的樂曲, 由 8HZ 的時鐘信號輸入,經(jīng)分頻后輸入至 TONEINDEX 改變分頻系數(shù)控制樂曲的演奏速度。計數(shù)器 時鐘信號作為輸出音符快慢的控制信號,時鐘快時輸出節(jié)拍速度就快,演奏的速度也就快,時鐘慢時輸出節(jié)拍的速度就慢,演奏的速度自然 就降低 了 。當(dāng)一個 8Hz的時鐘脈沖來到時,樂譜發(fā)生器模塊輸出一個音符數(shù)據(jù)給分頻系數(shù)模塊,分頻系數(shù)模塊輸出此音符相應(yīng)的分頻系數(shù),將分頻系數(shù)送給數(shù)控分頻器模塊,當(dāng)100kHz 的時鐘脈沖來到時,數(shù)控分頻器就根據(jù)分頻系數(shù)輸出相應(yīng)的頻率 (即此音符所對應(yīng)的發(fā)生頻 率 )給揚聲器,揚聲器就可發(fā)出對應(yīng)音符的聲音來 .連續(xù)的 8Hz 的時鐘脈沖就將樂譜發(fā)生器里所存儲的音符數(shù)據(jù)一個接一個的送給了分頻系數(shù)模塊,再經(jīng)過數(shù)控分頻模塊 ,最后揚聲器一個接一個的發(fā)出音符數(shù)據(jù)所對應(yīng)的聲音 ,樂曲也就連貫了。 基于 FPGA 的電子琴設(shè)計 4 總體程序設(shè)計 頂層模塊設(shè)計流程,如圖 31所示。 圖 31 頂層模塊設(shè)計流程示意圖 VHDL 程序設(shè)計 作為初步的開發(fā)設(shè)計,為了簡化設(shè)計,本任務(wù)設(shè)計的音樂電路只考慮音的高低和音的長短,即音高,音長,忽略音的力度和音色,考慮到充分利用 fpga 的數(shù)字電路資源,可用一個可控分頻電路模塊產(chǎn)生演奏音樂所需的各個音,而各個演奏的順序和持續(xù)的時間即音長可根據(jù)樂譜用一個控制電路模塊來控制。 基于 FPGA 的電子琴設(shè)計 5 library ieee。 use 。 use 。 use 。 use 。 entity em is port(clk1M: in std_logic。 x: in std_logic_vector(3 downto 0)。 y: out std_logic_vector(3 downto 0)。 musicout: out std_logic)。 end em。 architecture a of em is ponent fenpin port(clk1M :in std_logic。 clk100k,clk195,clk98,clk8: out std_logic。 cp2out : out std_logic_vector(1 downto 0)。 cp4out : out std_logic_vector(3 downto 0))。 end ponent。 ponent fangdou port( clk195in : in std_logic。 key_in : in std_logic。 key_out: out std_logic)。 end ponent。 ponent yima port( clk98in : in std_logic 。 cp2in : in std_logic_vector(1 downto 0)。 cp4in : in std_logic_vector(3 downto 0)。 num_dec,music_dec: out std_logic_vector(3 downto 0)。 num_f,music_f: out std_logic)。 end ponent。 ponent ctrl port( clk98in1 ,clk8in : in std_logic。 num_dec_in ,music_dec_in : in std_logic_vector(3 downto 0)。 num_f_in ,music_f_in: in std_logic。 index_out :out integer range 0 to 10)。 end ponent 。 ponent tone 基于 FPGA 的電子琴設(shè)計 6 port( index : in integer range 0 to 10。 toneout: out integer range 770 to 1024)。 end ponent。 ponent speaker port( clk100kin: in std_logic。 tone_in :in integer range 770 to 1024。 soundout: out std_logic)。 end ponent。 signal tone1: integer range 770 to 1024。 signal index : integer range 0 to 10 。 signal key_y, key_x ,key_dec : std_logic_vector(3 downto 0)。 signal numdec,musicdec: std_logic_vector(3 downto 0)。 signal cp2 : std_logic_vector(1 downto 0)。 signal numf ,musicf : std_logic。 signal clk_100k,clk_98: std_logic。 signal clk_195,clk_8: std_logic。 begin key_x =x。 u1:fenpin port map(clk1M,clk_100k,clk_195,clk_98,clk_8,cp2,key_y)。 u2:fangdou port map(clk_195,key_x(0),key_dec(0))。 u3:fangdou port map(clk_195,key_x(1),key_dec(1))。 u4:fangdou port map(clk_195,key_x(2),key_dec(2))。 u5:fangdou port map(clk_195,key_x(3),key_dec(3))。 u6:yima port map (clk_98,cp2,key_dec,numdec,musicdec