预览加载中,请您耐心等待几秒...
1/6
2/6
3/6
4/6
5/6
6/6

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

设计一:梁祝乐曲演奏电路设计 一.设计任务 1)了解乐曲演奏电路的实验原理。 2)掌握利用可编程器件实现乐曲演奏的设计方法。 二.设计分析 根据声学知识,组成乐曲的每个音符的发声频率值及其持续的时间是乐曲能连续弹奏所 需的两个基本要素,获取这两个要素所对应的数值和通过纯硬件的手段来利用这些数值实现 所希望乐曲的演奏效果是该实验的关键。 实验原理图 原理电路如上图所示,实验由三个模块组成: 1)数控分频与演奏发生器模块,即SPEAKERA。 2)乐曲简谱码对应的分频预置数查表电路模块,即TONETABA。 3)音乐节拍和音调发生器模块,即NOTETABS。 模块一(SPEAKERA):产生音符的频率。这是一个数控分频器,由其clk端输入一个12MHz 的信号,通过SPEAKERA分频后由SPKOUT输出,由于直接从数控分频器中出来的输出信号是 脉宽极窄的脉冲式信号,为了有利于驱动扬声器,须另加一个D触发器以均衡其占空比,但 这时的频率将是原来的一半。SPEAKERA对clk输入信号的分频比由11位预置数TONE[10..0] 决定。SPKOUT的输出频率将决定每一音符的音调,这样,分频计数器的预置值TONE[10..0] 与SPKOUT的输出频率就有了对应关系。 模块二(TONETABA):音符的持续时间须根据乐曲的速度即每个音符的节拍数来确定, 原理图中TONETABA的功能首先是为SPEAKERA提供决定所发音符的分频预置数,而此数在 SPEAKERA输入口的停留时间即为音符的节拍值。模块TONETABA是乐曲简谱码对应的分频预 置数查表电路,其中设置了梁祝乐曲全部音符所对应的分频预置数,共13个,每一音符的 停留时间由音乐节拍和音调发生器模块NOTETABS的clk的输入频率决定,在此为4Hz.这13 个数值的输出由对应于NOTETABA1的4位输入值Index[3..0]的输出值与持续时间由模块 NOTETABS决定。 模块三(NOTETABS):在NOTETABS中设置了一个8位二进制计数器(计数最大值为138, 因为共有138个音符),这个计数器的频率选为4Hz,即每一个计数值得停留时间为0.25秒, 恰为当全音符设为1秒时,四四拍的4分音符持续时间。例如,NOTETABS在以下的VHDL逻 辑描述中,梁祝乐曲的第一个音符为3,此音在逻辑中停留了4个时钟节拍,即1秒时间, 相应地,所对应的3音符分频预置值为1036,在SPEAKERA的输入端停留了1秒。随着NOTETABS 中的计数器按4Hz的时钟速率做加法计数时,梁祝乐曲就开始连续自然地演奏起来了。 三.实验程序: 模块一(speakera): libraryieee; useieee.std_logic_1164.all; entityspeakerais port(clk:instd_logic; tone:inintegerrange0to16#7FF#; spks:outstd_logic); end; architectureoneofspeakerais signalpreclk:std_logic; signalfullspks:std_logic; begin divideclk:process(clk) variablecount4:integerrange0to15; begin preclk<='0'; ifcount4>11thenpreclk<='1';count4:=0; elsifclk'eventandclk='1'thencount4:=count4+1; endif; endprocess; genspks:process(preclk,tone) variablecount11:integerrange0to16#7FF#; begin ifpreclk'eventandpreclk='1'then ifcount11=16#7FF#then count11:=tone; fullspks<='1'; elsecount11:=count11+1; fullspks<='0';endif; endif; endprocess; delayspks:process(fullspks) variablecount2:std_logic; begin iffullspks'eventandfullspks='1'then count2:=notcount2; ifcount2='1'thenspks<='1'; elsespks<='0';endif; endif; endprocess; end; 模块二(tonetaba): libraryieee; useieee.std_logic_1164.all; entit