简易乐曲演奏器的设计

上传人:Bod****ee 文档编号:47507478 上传时间:2018-07-02 格式:DOC 页数:23 大小:1.34MB
返回 下载 相关 举报
简易乐曲演奏器的设计_第1页
第1页 / 共23页
简易乐曲演奏器的设计_第2页
第2页 / 共23页
简易乐曲演奏器的设计_第3页
第3页 / 共23页
简易乐曲演奏器的设计_第4页
第4页 / 共23页
简易乐曲演奏器的设计_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《简易乐曲演奏器的设计》由会员分享,可在线阅读,更多相关《简易乐曲演奏器的设计(23页珍藏版)》请在金锄头文库上搜索。

1、1 引言VHDL 是一种硬件描述语言,它可以对电子电路和系统的行为进行描述,基于这种描述,结合相关的软件工具,可以得到所期望的实际电路与系统。使用 VHDL 语言描述的电路,可以进行综合和仿真。然而,值得注意的是,尽管所有 VHDL 代码都是可仿真的,但并不是所有代码都能综合。VHDL 被广泛使用的基本原因在于它是一种标准语言,是与工具和工艺无关的,从而可以方便地进行移植和重用。VHDL 两个最直接的应用领域是可编程逻辑器件(PLD)和专用集成电路(ASIC),其中可编程逻辑器件包括复杂可编程逻辑器件(CPLD)和现场可编程门阵列(FPGA)。关于 VHDL 最后要说明的是:与常规的顺序执行的

2、计算机程序不同,VHDL 从根本上讲是并发执行的。在 VHDL 中,只有在进程(PROCESS)、函数(FUNCTION)和过程(PROCEDURE)内部的语句才是顺序执行的。本课程设计主要是基于 VHDL 文本输入法设计乐曲演奏电路,该系统基于计算机中时钟分频器的原理,采用自顶向下的设计方法来实现,通过按键输入来控制音响或者自动演奏已存入的歌曲。系统实现是用硬件描述语言 VHDL 按模块化方式进行设计,然后进行编程、时序仿真、电路功能验证,奏出美妙的乐曲(当然由于条件限制,暂不进行功能验证,只进行编程和时序仿真) 。该设计最重要的一点就是通过按键控制不同的音调发生,每一个音调对应不同的频率,

3、从而输出对应频率的声音。我们知道,与利用单片机来实现乐曲演奏相比,以纯硬件完成乐曲演奏电路的逻辑要复杂得多,如果不借助于功能强大的 EDA 工具与硬件描述语言,仅凭传统的数字逻辑技术,即使最简单的演奏电路也难以实现。2 整体功能介绍2.1 准备知识在本次设计中采用了铃声北京欢迎你作为要播放的乐曲,它的旋律如下: 3 5 3 2 3 2 3 3 2 6 1 3 2 2 2 1 6 1 2 3 5 2 3 6 5 6 2 1 12 1 6 1 2 3 5 2 3 6 5 5 3 2 3 2 1 5 6 2 5 3 3 2 3 (加粗表示低音,其他为中音) 根据声乐知识,组成乐曲的每个音符的发音频率

4、值及其持续的时间是乐曲能连续演奏所需的两个基本要素,获取这两个要素所对应的数值以及通过纯硬件的手段来利用这些数值实现所希望乐曲的演奏效果是本实验的关键。表 2-1为简谱中音名与频率的对应关系。音名频率(Hz)音名频率(Hz)音名频率(Hz)低音 1261.63中音 1523.25高音 11046.50 低音 2293.67中音 2587.33高音 21174.66 低音 3329.63中音 3659.25高音 31381.51 低音 4349.23中音 4698.46高音 41396.92 低音 5391.99中音 5783.99高音 51567.98 低音 6440中音 6880高音 617

5、60 低音 7439.88中音 7987.76高音 71975.52表 2-1 音名和频率的关系1. 基准频率的选取各音名所对应的频率可由一频率较高的基准频率进行整数分频得到,所以实际产生各音名频率为近似的整数值。这是由于音阶频率多为非整数,而分频系数又不能为小数,故必须将得到的分频系数四舍五入取整,若基准频率过低,则由于分频系数过小,四舍五入取整后的误差较大,若基准频率过高,虽然误码差较小,但分频结构将变大,实际的设计应综合考虑两方面的因素,在尽量减小频率差的前提下取舍合适的基准频率。本次设计选择 12MHz 作为基准频率。2. 分频系数 A、公用二进制的计数容量 N 及初始值的选取 D(1

6、)分频系数的选取首先将 12MHz 的基准频率进行 12 分频,得到 1MHz 的基准频率,分频系数 A1MHz音名频率,此分频系数可由计数器实现。但若不加处理语句,其分频后的信号将不是对称方波。而占空比很小的方波很难使扬声器有效地发出声响。为得到对称方波,可将分频系数 A 分解为:分频系数 A=分频系数 n2。即先进行分频系数 n 的分频,得到不对称方波,然后再 2 分频得到对称方波。(2)公用二进制的计数容量 N 的选取n 分频可由 n 进制计数器实现。n 进制计数器可用复位法或置位法实现,由于加载初始值 d 的置位法可有效地减少设计所占用的可编程逻辑器件资源,因此,此次设计采用置位法。低

7、音 1 的分频数 n 为最大,其值为 1275,应取公用二进制计数器的计数容量 N 大与“最大分频系数 n”,故本次设计的公用二进制计数器应该设计为十一位二进制加法计数器,其计数最大容量为 2048,计数的最大值 N 为 2047,可满足本次设计中所有音名对音频系数的要求。3. 初始值的选取 D初始值 D = 计数最大值 N - 分频系数 n此次设计中应用的各音名对应的分频系数值及初始值如表 2-2 所示:由于对应的频率点都有小数部分,在分频时不需花大量时间去产生分频电路,只要大概频率点在此范围内即可,本实验采用频率点及音符与音谱对应定义如表 2-2 所示。音符对应频率点对应音谱区别高中低音5

8、77150 691160 1109111 2119621 3128931 4133141 5140951 6147961 7154171表 2-2 音符和音谱等关系该演奏电路的最小节拍为 1 拍,将一拍的时长定为 0.25s,则只需要再提供一个 4Hz 的时钟频率即可产生一拍的时长。为了能达到演奏时能循环进行,则需设置一个时长计数器,当乐曲演奏完时,保证能自动从头开始演奏。因采用 4HZ 的频率,故将音谱修改为3 3 5 5 3 3 2 2 3 3 2 2 3 3 3 3 3 3 2 2 6 6 1 1 3 3 2 2 2 2 2 2 1 1 6 6 1 1 2 2 3 3 5 5 2 2 3

9、 3 6 6 5 5 6 6 2 2 1 1 1 1 2 2 1 1 6 6 1 1 2 2 3 3 5 5 2 2 3 3 6 6 5 5 5 5 3 3 3 3 3 3 3 3 2 2 3 3 2 2 1 1 5 5 6 6 2 2 2 2 5 5 3 3 3 3 3 3 2 2 2 2 3 3 3 3 2.2 乐曲演奏电路的结构示意本设计由 5 个模块组成,顶层结构所包含的模块分别为分频器(fenpin)模块、音调发生器(ydfsq)模块、音调编码器(ydbmq)模块、手动自动选择(bmux)模块及数控分频器(skfpq)模块。如图 2-3 所示图 2-3 电路结构示意图2.3 整体功能

10、描述演奏时可以通过按键选择是手动演奏还是自动演奏,自动演奏则是演奏已存入的固定乐曲,而且自动播放能重复播放;手动演奏是通过按键进行简易乐曲的演奏;进行手动演奏和自动演奏时,数码管上要同时能显示出演奏乐曲的乐谱。手动/自动音调发生器数控分频器音调编码器分频器3 各模块及顶层介绍及仿真3.1 分频器3.1.1 功能描述根据设计要求,需要用一个时钟信号对音调发生模块和音调编码模块进行控制,该模块是将 12MHZ 的频率分成 4HZ,以便用于产生音调发生器的 CLK。源程序如下:library ieee;use ieee.std_logic_1164.all;entity fpq is port(cl

11、k:in std_logic;out1:buffer std_logic);end fpq;architecture bhv of fpq isbeginprocess(clk)variable count:integer range 0 to 1500000;begin If clkevent and clk=1 then count:=count+1;If count=1500000 then out1toneindextoneindextoneindextoneindextoneindextoneindextoneindexnull;end case;end process;end;3.

12、2.2 仿真图图 3-2 音调发生器仿真图通过仿真图可以清楚的看到,时钟 clk 由 0 开始计数,每计一次数输出toneindex 的值随之发生一定的变化,只不过根据乐谱的不同,输出的变化也不尽相同。然后把输出 toneindex 输入到音调编码器模块,进行下一步编码工作。于是,由仿真图印证了 ydfsq 模块逐次选取音符的功能。3.3 手动自动选择器3.3.1 功能描述根据设计的要求,该简易乐曲演奏器能实现手动或自动演奏乐曲的功能。于是,可通过一个按键 cs 来进行自动与手动的选择,当 cs 按下时,乐曲自动演奏,其他情况下均为手动演奏乐曲,即可以通过按下其他的按键来控制不同的音符。与此同

13、时,还需要一个复位信号 rst 来控制该演奏器是否工作,当 rst为 1 时,停止演奏,为 0 时可以演奏。以上提到的手动与自动的选择只能在 rst为 0 时有效。源程序如下:library ieee;use ieee.std_logic_1164.all;entity bmux isport(d1,d2:in integer range 0 to 15;cs,rst:in std_logic;q:out integer range 0 to 15); end;architecture bhv of bmux isbegin process(cs,rst)beginif rst=1 then

14、qqqqtonetonetonetonetonetonetonetonetoneNULL;end case;end process;end ;3.4.2 仿真图图 3-4 音调编码器仿真图在此程序中 index 为音乐节拍产生模块输出的音符数据,经过翻译后将tone 输出到数控分频模块为其提供分频系数的初始值,code 为数码管显示的字符数,应用模式 5,所以直接输出音符的二进制值,code1 为高音阶指示信号,当 code1 为是说明输出为高音阶的音符。通过仿真图可以清楚地看到结果。3.5 数控分频器3.5.1 功能描述该模块的 clk 端输入一个具有较高频率(本实验为 12MHz)的信号,

15、通过skfpq 分频后由 spkout 输出。由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲信号,为了便于驱动喇叭,需另加一个 D 触发器均衡其占空比,也即作二分频处理。skfpq 对 clk 输入信号的分频比由 11 位预置数 tone10.0决定。spkout 的输出频率将决定每一音符的音调,这样分频计数器的预置数 tone10.0与 spkout 的输出频率就有了对应关系。源程序如下:library ieee;use ieee.std_logic_1164.all;entity skfpq isport(clk:in std_logic;tone:in integer range

16、0 to 2047;spks:out std_logic);end;architecture bhv of skfpq issignal preclk:std_logic;signal fullspks:std_logic;begin process(clk)variable count4:integer range 0 to 15;begin preclktoneindextoneindextoneindextoneindextoneindextoneindextoneindexnull;end case;end process;end;音调编码器library ieee;use ieee.std_logic_1164.all;entity ydbmq isport(index:in integer range 0 to 15;code:out integer range 0 to 15;code1:out integer range 0 to 15;tone:out integer range

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 毕业论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号