VHDL实验:乐曲演奏专用课件.pptVIP

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

内容概要 实验目的 掌握乐曲演奏电路的工作原理。 了解怎样控制音调的高低变化。 了解音长的控制。 实验原理 乐曲演奏电路的原理 乐曲的每个音符的频率值(音调) 持续的时间(音长) 音调的控制 频率的高低决定了音调的高低。音乐的十二平均率规定:每两个八度音(如简谱中的中音1与高音1)之间的频率相差一倍。在两个八度音之间,又可以分为十二个半音,每两个半音的频率比为21/12 ≈1.12246 。 音名A(简谱中的低音6)的频率为440Hz,音名B到C之间,E到F之间为半音,其余为全音。 简谱中的音名与频率的关系 本实验中选取4MHz为基准频率。 本实验演奏的是梁祝乐曲,该乐曲各音阶频率及相应的分频系数如下图所示。 为减小输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,在到达扬声器之前,有一个二分频的分频器。上表中的分频系数就是在从4MHz频率二分频得到的2MHz频率基础上计算得出的。 分频的方法 反馈复0法 加载预置数法 (本实验采用这种方法) 预置数 = 计数器最大值-分频系数 = (213 -1) -分频系数 = 8191 -分频系数。 音长的控制 本例演奏的“梁祝”片段,最小的节拍为1/4拍。将1拍的时长定为1秒,则只需要再提供一个4 Hz的时钟频率即可产生1/4拍的时长。演奏的时间控制通过记谱来完成,对于占用时间较长的节拍(一定是1/4拍的整数 倍),如2/4拍,只需将该音名连续记录两次即可。 乐曲演奏电路原理图 反馈预置计数器对基准频率4MHz进行分频,产生分频后的输出时钟信号。再经过2分频器,成为方波信号,以驱动扬声器发声。 音名显示电路显示乐曲演奏时对应的音符。 乐谱产生电路用来根据高音、中音和低音的值决定分频计数器的预置数的值 。 程序流程图 乐曲演奏电路子模块 程序分为4个部分: 反馈预置计数器 2分频器,产生驱动扬声器的方波信号 音名显示,根据时长计数器的值决定高音、中音和低音的值 乐谱产生电路,根据高音、中音和低音的值决定分频计数器的预置数origin的值 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY song IS PORT( clk_4MHz, clk_4Hz: IN STD_LOGIC; --预置计数器和乐谱产生器的时钟 digit: BUFFER STD_LOGIC_VECTOR(6 DOWNTO 0); --低三位表示低音,中间三位表示中音,最高位表示高音;本曲仅仅有高音1,故此用1位表示。 speaker: out STD_LOGIC --扬声器 ); END song; ARCHITECTURE song_arch OF song IS SIGNALdivider,origin:STD_LOGIC_VECTOR(12 DOWNTO 0); --13位计数值和预置值 SIGNAL counter:integer range 0 to 140; --记录1/4拍曲谱的内容 SIGNAL count:STD_LOGIC_VECTOR(1 DOWNTO 0); SIGNAL carrier:STD_LOGIC; BEGIN PROCESS(clk_4MHz) BEGIN IF(clk_4MHzevent AND clk_4MHz=1) THEN IF(divider=1111111111111) THEN carrier=1; divider=origin; ELSE divider=divider+1; carrier=0; END IF; END IF; END PROCESS; PROCESS(carrier) BEGIN IF(carrierevent AND carrier=1) THEN count=count+1; --输出时钟四分频 IF count=00 THEN speaker=1; ELSE speaker=0; END IF; END IF; END PROCESS; PROCESS(clk_4Hz) --1/4节拍 BEGIN IF(clk_4Hzevent AND clk_4Hz=1) THEN IF(counter=140) THEN counter=0; ELSE counter=counter+1; END IF; END IF; CASE counter IS -- 音调digit的赋值 WHEN 0=digit=0000011; WHEN 1=digit=0000011; WHEN 2=digit=0000011; WHEN 3=digit=0

文档评论(0)

dart004 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档