- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
EDA实验乐曲播放器设
实验六 乐曲播放器设
一、实验目的
(1)进一步熟练EDA设计流程、系统仿真及硬件测试分析。
(2)学习多层次的设计方法,掌握基本的VHDL语言的设计方法。
(3)学习利用LPM(Library of Parameterized Modules 参数可设置模块库)进行设计。
(4)通过设计乐曲播放增加学生对EDA技术的了解。
二、实验内容与要求
使用层次化设计方法,实现乐曲播放器功能,乐曲选取《梁祝》中化蝶部分。可通过LPM_ROM存储节拍音符数,装载多首乐曲播放器供选择。
三、设计思路/原理图
组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需的2个基本要素,发音频率值可以查阅相关资料,产生各音符所需的频率可通过分频器实现。所选乐曲为《梁祝》中化蝶部分及欢乐颂部分,其数字简谱可在相关资料查得。
由于各音符对应的频率多为非整数,而分频系数又不能为小数,故必须将计算得到的分频数四舍五入取整。若分频器时钟频率过低,则由于分频系数过小,四舍五入取整后的误差较大;若时钟频率过高,虽然误差变小,但会增加分频器的分频级数。实际的设计应综合考虑两方面的因素,在尽量减小频率误差的前提下取合适的时钟频率。本文设计的乐曲发生器选取6mhz的基准频率。
所选乐曲最小节拍为1/4拍,将1拍的时间长度定为1s,则只需要再提供一个4Hz的时钟频率即可产生1/4拍的时长。演奏的时间控制通过记录来完成,对于占用时间较长的节拍(一定是1/4拍的整数倍),如2/4拍,只需将该音符连续记录2次即可。
设计采用层次化设计方法,其关键是如何获取发音频率值和其持续时间及通过硬件的手段实现乐曲演奏效果,因此要求程序主要有三个模块:
1、speakera 模块
音符频率产生模块,即数控分频器。由于直接从数控分频器中出来的输出信号时脉宽极窄的脉冲式信号,为有效的驱动扬声器,需重新加个D触发器以均衡其占空比,但是频率变为1/2。其分频比由11位的预置数决定,分频预置值由 tonetaba模块提供。
2、tonetaba模块
音符的持续时间需要根据乐曲的速度及每个音符的节拍来确定。此模块的功能首先是为speakera模块提供绝所发音符的分频预置数,而此数在Speakera输入口停留的时间极为此音符的节拍值。tonetaba模块是乐曲简谱对应的分频预置数查表电路,其中设置了所选乐曲的全部音符的分频预置数。每一音符的停留时间由音乐节拍和音调发生器模块notetabs的clk的输入频率决定。
3、notetabs模块
在该模块中设置计数器,作为音符数据ROM的地址发生器,计数频率为4 HZ,为全音符四分之一拍持续时间。由于本设计方案用的ROM实现乐曲谱的音符查找,在查找过程中式按照地址遍历的方式对ROM中的音符数据进行访问的。
如果要实现两首歌的切换,如果要实现两首歌的切换,只需要使用多个notetabs模块再用一个2选1多路选择器mvx21a来进行选择即可以实现对两首音乐的切换。
图一、 实验原理图
四、实验程序 (程序来源:参考EDA技术实用教程P223 )
(1)speakera 模块
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY Speakera IS
PORT ( clk : IN STD_LOGIC;
Tone : IN STD_LOGIC_VECTOR (13 DOWNTO 0);
SpkS : OUT STD_LOGIC );
END ENTITY Speakera ;
ARCHITECTURE one OF Speakera IS
SIGNAL PreCLK, FullSpkS : STD_LOGIC;
BEGIN
DivideCLK : PROCESS(clk)
VARIABLE Count2 : STD_LOGIC_VECTOR (1 DOWNTO 0) ;
BEGIN
PreCLK = 0;
IF Count21 THEN PreCLK = 1; Count2 := 00;
ELSIF clkEVENT AND clk = 1 THEN Count2 := Count2 + 1;
END IF;
END PROCESS;
GenSpkS : PROCESS(PreCLK, Tone)
VARIABLE Count11 : STD_LOGIC_VECTOR (
原创力文档


文档评论(0)