基于fpga音乐硬件演奏电路设计设计电路音乐fpga演奏电路电路设计硬件演奏硬件电路内容摘要:

程序设计 LIBRARY IEEE。 音乐节拍和音调发生器模块 USE。 USE。 ENTITY NoteTabs IS PORT ( clk : IN STD_LOGIC。 音乐节拍时钟 4HZ SEL : IN STD_LOGIC。 音乐选择键 基于 FPGA 音乐硬件演奏电路设计 8 RST : IN STD_LOGIC。 复位键 ToneIndex : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) )。 END。 ARCHITECTURE one OF NoteTabs IS COMPONENT music 音符数据 ROM1 PORT( address : IN STD_LOGIC_VECTOR (7 DOWNTO 0)。 clock : IN STD_LOGIC。 q : OUT STD_LOGIC_VECTOR (3 DOWNTO 0))。 END COMPONENT。 SIGNAL Counter : STD_LOGIC_VECTOR (7 DOWNTO 0)。 8 位二进制计数器 BEGIN CNT8 : PROCESS(clk, Counter,sel,rst) BEGIN IF ((clk39。 EVENT AND clk = 39。 139。 ) and (Counter=256 or rst=39。 039。 )) then Counter = 00000000。 Counter =Counter+1。 end if。 IF ((clk39。 EVENT AND clk = 39。 139。 ) and (sel=39。 039。 )) THEN Counter =10010000。 Counter =Counter+1。 end if。 END PROCESS。 u1 : MUSIC PORT MAP(address=Counter , q=ToneIndex,clock=clk)。 END。 (2) 地址发生器模块 地址发生器模块设置了一个 8位二进制计数器 (计数最大值为 256),作为音符数据 ROM的地址发生器。 每来一个时钟脉冲信号 (Clk), 8 位二进制计数器就计数一次, ROM 文件中的地址也就随着递增,音符数据 ROM 中的音符也就一个接一个连续的取出来了。 在地址发生 器的 VHDL 设计中,这个计数器的计数频率选为 4Hz,即每一计数值的停留时间为 秒,恰为当全音符设为 1 秒,四四拍的 4 分音符持续时间。 例如,地址发生器在以下的 VHDL 逻辑描述中, “梁祝 ”乐曲的第一个音符为 “3”,此音在逻辑中停留了 4个时钟节拍,即 1 秒时间。 那么相应随着程序 [4]中的计数器按 4Hz 的时钟频率作加法计数时,即随地址递增时,将从音符数据 ROM 中将连续取出 4 个音符 “3”通过 toneindex[3..0]端口输向分频预置数模块。 这样梁祝乐曲中的音符就一个接一个的通过 toneindex[3..0]端口输向分频预置数模块。 音乐谱对应分频预置数查表电路模块 (1) 音乐谱分频预置数模块 基于 FPGA 音乐硬件演奏电路设计 9 T on eT ab ain s tInd ex [3. .0] C O D E [3. .0]H IG HT on e[ 10 ..0] 图 音乐谱分频预置数模块 (2) 音乐谱对应分频预制数查表电路 VHDL 程序设计 音乐谱分频预置数模块是乐曲简谱码对应的分频预置数查表电路。 它提供了每个音符所对应的分频预置数,即给数控分频模块提供计数初值,这里以 “梁祝 ”乐曲为例,列出了在这个乐曲中所用到的 13 个音符的分频预置数。 在这个模块的 VHDL 逻辑描述中设置了四四拍乐曲中全部音符所对应的分频预置数,共 13 个,每一音符的停留时间由音乐节拍和地址发生器 模块的时钟( Clk)的输入频率决定,在此为 4Hz。 这 13 个值的输出由程序 [3]的 4 位输入值 index[3..0]确定。 输向程序 [4]中 index[3..0]的值又由地址发生器模块的输出 toneindex[3..0]的输出值和持续时间决定。 模块的功能是输出各个音符所对应的分频预置数,即当 index 是 “0000”, tone 输出为2047,即休止符的分频预置数;当 index 是 “0101”时, tone 输出为 1197 即低音 5 的分频预置数;当 index 是 “1111”时, tone 输出为 1728 即高音 1 的分频预置数等 等其它状态时,tone 分别输出相应音符的分频预置数。 分频预置数模块的 VHDL 设计程序如下: LIBRARY IEEE。 音乐谱对应分频预制数查表电路模块 USE。 ENTITY ToneTaba IS PORT ( Index : IN STD_LOGIC_VECTOR (3 DOWNTO 0)。 4 位预制数查表 CODE : OUT STD_LOGIC_VECTOR (3 DOWNTO 0)。 HIGH : OUT STD_LOGIC。 音乐高 8 度指示 Tone : OUT STD_LOGIC_VECTOR (10 DOWNTO 0) )。 音乐符对应分频 11 位 END。 ARCHITECTURE one OF ToneTaba IS BEGIN Search : PROCESS(Index) BEGIN CASE Index IS 译码电路,查表方式,控制音调的预置数 13 组频率 WHEN 0000 = Tone=11111111111。 CODE=0000。 HIGH =39。 039。 2047 WHEN 0001 = Tone=01100000101。 CODE=0001。 HIGH =39。 039。 773。 WHEN 0010 = Tone=01110010000。 CODE=0010。 HIGH =39。 039。 912。 WHEN 0011 = Tone=10000001100。 CODE=0011。 HIGH =39。 039。 1036。 WHEN 0101 = Tone=10010101101。 CODE=0101。 HIGH =39。 039。 1197。 基于 FPGA 音乐硬件演奏电路设计 10 WHEN 0110 = Tone=10100001010。 CODE=0110。 HIGH =39。 039。 1290。 WHEN 0111 = Tone=10101011100。 CODE=0111。 HIGH =39。 039。 1372。 WHEN 1000 = Tone=10110000010。 CODE=0001。 HIGH =39。 139。 1410。 WHEN 1001 = Tone=10111001000。 CODE=0010。 HIGH =39。 139。 1480。 WHEN 1010 = Tone=11000000110。 CODE=0011。 HIGH =39。 139。 1542。 WHEN 1100 = Tone=11001010110。 CODE=0101。 HIGH =39。 139。 1622。 WHEN 1101 = Tone=11010000100。 CODE=0110。 HIGH =39。 139。 1668。 WHEN 1111 = Tone=11011000000。 CODE=0001。 HIGH =39。 139。 1728。 WHEN OTHERS = NULL。 END CASE。 END PROCESS。 END。 音乐符数控 11 分频电路模块 音乐谱对应分频预置数查表电路模块 (1) 音乐符数控 11 分频电路模块 S pe ak erain s tc lkT on e[ 10 ..0]S pk S 图 音乐符数控 11 分频电路模块 (2) 音乐符数控 11 分频电路模块 RTL 电路图 DE N AQP R EC L RA [ 3 . . 0 ]B [ 3 . . 0 ]O U T [ 3 . . 0 ]A D D E RA [ 1 0 . . 0 ]B [ 1 0 . . 0 ]O U T [ 1 0 . . 0 ]A D D E RA [ 1 1 . . 0 ]B [ 1 1 . . 0 ]O U TE Q U A LDE N AQP R EC L RA [ 3 . . 0 ]B [ 3 . . 0 ]O U TL E S S _ T H A NDE N AQP R EC L RD QP R EE N AC L RD QP R EE N AC L RSELD A T A AD A T A BO U T 0M U X 2 1\ D e l a y Sp kS : C o u n t 2 Sp kS ~re g 0cl kSp kST o n e [ 1 0 . . 0 ]F u l l Sp kS\ G e n Sp kS : C o u n t 1 1 [ 1 0 . . 0 ]Eq u a l 01 39。 h 0 1 2 39。 h 7 F F \ D i v i d e C L K: C o u n t 4 [ 3 . . 0 ]A d d 04 39。 h 1 A d d 11 1 39。 h 0 0 1 C o u n t 1 1 ~[ 1 0 . . 0 ]L e s s T h a n 04 39。 h B 图 音乐符数控 11 分频电路模块 RTL电路图 基于 FPGA 音乐硬件演奏电路设计 11 (3) 音乐符数控 11 分频模块电路 VHDL 程序设计 音符的频率由数控分频模块获得,这是一个数控分频电路。 它是由一个初值可变的加法计数器构成。 该计数器的模为 2047,当计数器记满时,计数器产生一个溢出信号 FULL,此溢出信号就是用作发音的频率信号。 在计数器的输入端 给定不同的初值,而此预置数就是表 1 中的计数初值,就可得到不同音符的发音频率信号。 它计满时所需要的计数初值可由下式来表示。 计数初值( Tone) =2047分频系数 而分频系数又可有下式来求: 分频系数 =基准频率 /音符的发生频率 低音时 Tone 值小,分频系数大,溢出信号周期长,扬声器发出的声音低, Tone 随音乐的乐谱变化大,自动控制分频比,实现了数控分频,发生信号的频率与音调 Tone 成正比。 这就是利用数控分频器自动演奏音乐的原理。 时钟( Clk)端输入的是在十六进制模块里对 12MHz 的信号进行 16 分频得到的750KHz, 750KHz 的信号根据分频预置数模块中所提供的计数初值,分别得出相应音符频率的两倍值。 此时从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个 D 触发器以均衡其占空比,这时的频率就变为原来的 1/2,刚好就是相应音符的频率。 数控分频模块中对 Clk 输入信号的分频比由 11 位预置数 tone[10..0]决定。 Fout 的输出频率将决定每一个音符的音调,这样,分频计数器的预置值 tone[10..0]与 Fout 的输出频率就有了对应关系。 例如在分频预置数模块中若取 tone[10..0]=1036,将发出音符为 “3”音的信号频率。 音符的频率由数控分频模块 VHDL 程序如下: LIBRARY IEEE。 音乐符数控分频电路模块 USE。 USE。 ENTITY Speakera IS PORT ( clk : IN STD_LOGIC。 音调频率信号 12MHZ Tone : IN STD_LOGIC_VECTOR (10 DOWNTO 0)。 音乐符对应分频 11 位 SpkS : OUT STD_LOGIC )。 声音输出 END。 ARCHITECTURE one OF Speakera IS SIGNAL PreCLK, FullSpkS : STD_LOGIC。 BEGIN DivideCLK : PROCESS(clk) VARIABLE Count4 : STD_LOGIC_VECTOR (3 DOWNTO 0)。 BEGIN PreCLK = 39。 039。 将 CLK 进行 16 分频, PreCLK 为 CLK 的 16 分频 IF Count411 THEN PreCLK = 39。 139。 Count4 := 0000。 ELSIF clk39。 EVENT AND clk = 39。 139。 THEN Count4 := Count4 + 1。 基于 FPGA 音乐硬件演奏电路设计 12 END IF。 END PROCESS。 GenSpkS : PROCESS(PreCLK, Tone) 11 位可预置计数器 VARIABLE Count11 : STD_LOGIC_VECTOR (10 DOWNTO 0)。 BEGIN 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)将输出再 2 分频,展宽脉冲,使扬声器有足够功率发音 VARIABLE Count2 : STD_LOGIC。 BEGIN 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。 乐曲演奏音符数据文件(梁祝、月亮代表我的心) WIDTH = 4。 乐曲演奏数据 DEPTH = 256。 Address_radix = dec。 Data_radix = dec。 CONTENT BEGIN 3 3 3 3 5 5 5 6 8 8 8 9 6 8 5 5 12 12 12 15 13 12 10 12 9 9 9 9 9 9 9 0 9 9 9 10 7 7 6 6 5 5 5 6 8 8 9 9 3 3 8 8 6 5 6 8 5 5 5 5 5 5 5 5 10 10 10 12 7 7 9 9 6 8 5 5 5 5 5 5 3 5 03 3 5 6 7 9 6 6 6 6 6 6 5 6 8 8 8 9 12 12 12 10 9 9 10 9 8 8。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。