- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
EDA课程设计
班级: 通信工程四班
姓名:
学号:
时间:
设计一: 梁祝乐曲演奏电路设计
设计任务
了解乐曲演奏电路的实验原理。
掌握利用可编程器件实现乐曲演奏的设计方法。
二.设计分析
根据声学知识,组成乐曲的每个音符的发声频率值及其持续的时间是乐曲能连续弹奏所需的两个基本要素,获取这两个要素所对应的数值和通过纯硬件的手段来利用这些数值实现所希望乐曲的演奏效果是该实验的关键。
实验原理图
原理电路如上图所示,实验由三个模块组成:
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):
library ieee;
use ieee.std_logic_1164.all;
entity speakera is
port(clk:in std_logic;
tone:in integer range 0 to 16#7FF#;
spks:out std_logic);
end ;
architecture one of speakera is
signal preclk :std_logic;
signal fullspks:std_logic;
begin
divideclk:process(clk)
variable count4:integer range 0 to 15;
begin
preclk=0;
if count411 then preclk=1;count4:=0;
elsif clkevent and clk=1then count4:=count4+1;
end if;
end process;
genspks:process(preclk,tone)
variable count11:integer range 0 to 16#7FF#;
begin
if preclkevent and preclk=1then
if count11=16#7FF# then
count11:=tone;
fullspks=1;
else count11:=count11+1;
fullspks=0;end if;
end if;
end pro
文档评论(0)