首页 百科知识 乐曲硬件演奏电路的设计

乐曲硬件演奏电路的设计

时间:2022-10-10 百科知识 版权反馈
【摘要】:硬件演奏电路分为三个模块,音乐节拍发生器NoteTabs模块,音符译码电路Tonetaba模块,数控分频模块Speaker。二进制计数器的位数将根据所存放的乐曲简谱的基本节拍数决定。乐曲“梁祝”片段最小节拍数为138,选择计数器的位数为8。其VHDL源程序如例7.37所示。音符的频率由数控分频模块获得,这是一个数控分频电路,由一个初值可变的加法计数器构成,该计数器的模为2047。这就是利用数控分频器自动演奏音乐的原理。

7.8.3 乐曲硬件演奏电路的设计

硬件演奏电路分为三个模块,音乐节拍发生器NoteTabs模块,音符译码电路Tonetaba模块,数控分频模块Speaker。

1)音乐节拍发生器NoteTabs

该模块利用FPGA的片内ROM存放乐曲简谱真值表,有一个二进制计数器为乐曲数据存储其ROM的地址发生器。该计数器的计数频率为4 Hz,随着NoteTabs中的计数器按4 Hz的时钟频率做加法计数,即随地址值递增,乐曲数据存储器ROM中的音符数据从ROM的输出端向音符译码电路Tonetaba输入,所存储乐曲就开始连续自然地演奏起来。二进制计数器的位数将根据所存放的乐曲简谱的基本节拍数决定。乐曲“梁祝”片段最小节拍数为138,选择计数器的位数为8。

(1)定制音符数据存储器music1

利用MegaWizard Plug-In Manager定制音符数据存储器。进入MAX+plus II,在菜单栏中选择“File”→“MegaWizard Plug-In Manager”命令,启动兆功能模块制作向导;选择“Create a new custom megafunction variation”,单击“Next”按钮,在出现的对话框中选择“VHDL”语言方式;双击storage,单击下拉栏中的LPM_ROM,然后在Browse栏中选择存储路径并键入文件名music1。在后续的对话框中选择数据位宽为8,地址位宽为8,完成music1的定制。其VHDL源程序如例7.37所示。

【例7.37】

img506

(2)定制ROM模块的初始化数据文件

用初始化存储器编辑mif文件。打开仿真窗口Simulator,选择“Initialize”菜单中“Initialize Memory”选项,在表格中将“梁祝”片段的音符数据(共138个)以十进制数形式输入表中,如图7.27所示。

img507

图7.27 数据存储器music1的初始化数据文件内容

(3)音乐节拍发生器设计

音乐节拍发生器的源程序见例7.38。

【例7.38】

img508

img509

例7.38的仿真波形如图7.28所示。程序的功能是每到来一个时钟信号,地址值递增1,并将这个地址上所存储的音符数据输出。从图中可以看到,当clk第一个时钟脉冲到达时,输出相应地址上的音符3,地址值递增1;接下来的三个时钟脉冲到来时,输出也是音符3,地址连续递增3次;第4个脉冲来时,输出为音符5,这些都符合模块音符数据文件中的地址/数据表

img510

图7.28 音乐节拍发生器仿真波形

2)音符译码电路

音符译码电路(音调发生器)实际上是一个查表电路,它提供了每个音符所对应的分频预置数,即给数控分频模块提供计数初值。这里以“梁祝”乐曲为例,列出了在这个乐曲中所用到的13个音符的分频预置数;每一音符的停留时间由音乐节拍发生器模块的时钟(clk)的输入频率决定,在此为4 Hz;这13个值的输出由例7.39的4位输入值Index[3..0]确定。

【例7.39】

img511

img512

例7.39的仿真波形如图7.29所示。从仿真波形图可以看到,当Index是"0000",Tone输出为2047,即休止符的分频预置数;当Index是"0101"时,Tone输出为1197,即低音5的分频预置数;当Index是"1001"时,Tone输出为1480,即中音2的分频预置数;当Index为其他状态时,Tone分别输出相应音符的分频预置数。这个仿真波形图证明程序实现了模块的功能。

img513

图7.29 音符译码电路仿真波形

3)数控分频模块设计

音符的频率由数控分频模块获得,这是一个数控分频电路,由一个初值可变的加法计数器构成,该计数器的模为2047。当计数器计满时,计数器产生一个溢出信号,此溢出信号就是用作发音的频率信号。在计数器的输入端给定不同的初值(见表7.2),就可得到不同音符的发音频率信号。计满时所需要的计数初值由下式可得:

计数初值(Tone)=2047-分频系数

低音时Tone值小,分频系数大,溢出信号周期长,扬声器发出的声音低,Tone随音乐的乐谱变化大,自动控制分频比实现了数控分频,发声信号的频率与音调Tone成正比。这就是利用数控分频器自动演奏音乐的原理。

数控分频模块的时钟端(clk)输入的是对12 MHz的信号进行十六分频得到的750 KHz信号,再根据分频预置数模块中所提供的计数初值,分别得出相应音符频率的两倍值。此时从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了能驱动扬声器,在音调输出时进行二分频,这就是相应音符的频率。数控分频模块中clk输入信号的分频比由11位预置数Tone[10..0]决定;SpkS的输出频率决定每一个音符的音调,这样,分频计数器的预置值Tone[10..0]与SpkS的输出频率就有了对应关系。例如在分频预置数模块中取Tone [10..0]=1036,将输出音符为“3”的信号频率。程序如例7.40所示。

【例7.40】

img514

img515

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈