EDA课程设计_原创文档.pdfVIP

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

设计一:梁祝乐曲演奏电路设计

一.设计任务

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;

ifcount411thenpreclk=1;count4:=0;

elsifclkeventandclk=1thencount4:=count4+1;

endif;

endprocess;

genspks:process(preclk,tone)

variablecount11:integerrange0to16#7FF#;

begin

ifpreclkeventandpreclk=1then

ifcount11=16#7FF#then

文档评论(0)

152****7812 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档