课程设计(论文)基于VHDL的简易乐曲演奏器的设计.doc
《课程设计(论文)基于VHDL的简易乐曲演奏器的设计.doc》由会员分享,可在线阅读,更多相关《课程设计(论文)基于VHDL的简易乐曲演奏器的设计.doc(23页珍藏版)》请在三一办公上搜索。
1、1 引言VHDL是一种硬件描述语言,它可以对电子电路和系统的行为进行描述,基于这种描述,结合相关的软件工具,可以得到所期望的实际电路与系统。使用VHDL语言描述的电路,可以进行综合和仿真。然而,值得注意的是,尽管所有VHDL代码都是可仿真的,但并不是所有代码都能综合。VHDL被广泛使用的基本原因在于它是一种标准语言,是与工具和工艺无关的,从而可以方便地进行移植和重用。VHDL两个最直接的应用领域是可编程逻辑器件(PLD)和专用集成电路(ASIC),其中可编程逻辑器件包括复杂可编程逻辑器件(CPLD)和现场可编程门阵列(FPGA)。关于VHDL最后要说明的是:与常规的顺序执行的计算机程序不同,V
2、HDL从根本上讲是并发执行的。在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高音61760低音7439.88中音7987.76高音71975.52表2-1 音名和频率的关系1
5、. 基准频率的选取各音名所对应的频率可由一频率较高的基准频率进行整数分频得到,所以实际产生各音名频率为近似的整数值。这是由于音阶频率多为非整数,而分频系数又不能为小数,故必须将得到的分频系数四舍五入取整,若基准频率过低,则由于分频系数过小,四舍五入取整后的误差较大,若基准频率过高,虽然误码差较小,但分频结构将变大,实际的设计应综合考虑两方面的因素,在尽量减小频率差的前提下取舍合适的基准频率。本次设计选择12MHz作为基准频率。2. 分频系数A、公用二进制的计数容量N及初始值的选取D(1)分频系数的选取 首先将12MHz的基准频率进行12分频,得到1MHz的基准频率,分频系数A1MHz音名频率,
6、此分频系数可由计数器实现。但若不加处理语句,其分频后的信号将不是对称方波。而占空比很小的方波很难使扬声器有效地发出声响。为得到对称方波,可将分频系数A分解为:分频系数A=分频系数n2。即先进行分频系数n的分频,得到不对称方波,然后再2分频得到对称方波。(2)公用二进制的计数容量N的选取n分频可由n进制计数器实现。n进制计数器可用复位法或置位法实现,由于加载初始值d的置位法可有效地减少设计所占用的可编程逻辑器件资源,因此,此次设计采用置位法。低音1的分频数n为最大,其值为1275,应取公用二进制计数器的计数容量N大与“最大分频系数n”,故本次设计的公用二进制计数器应该设计为十一位二进制加法计数器
7、,其计数最大容量为2048,计数的最大值N为2047,可满足本次设计中所有音名对音频系数的要求。3. 初始值的选取D初始值D = 计数最大值N - 分频系数n此次设计中应用的各音名对应的分频系数值及初始值如表2-2所示:由于对应的频率点都有小数部分,在分频时不需花大量时间去产生分频电路,只要大概频率点在此范围内即可,本实验采用频率点及音符与音谱对应定义如表2-2所示。音符对应频率点对应音谱区别高中低音5771506911601109111211962131289314133141514095161479617154171表2-2 音符和音谱等关系该演奏电路的最小节拍为1拍,将一拍的时长定为0.
8、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 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
9、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(clk:in std_logic;out1:buffer std_logic);end fpq;architecture bhv of fpq isbeginprocess(clk)variable count:integer range 0 to 1
11、500000;begin If clkevent and clk=1 then count:=count+1;If count=1500000 then out1=not out1;count:=0;end if;end if;end process;end bhv;3.1.2仿真图图3-1 分频器仿真图3.2音调发生器3.2.1功能描述在此模块中设置了一个计数器(计数最大值为200),这个计数器的计数频率选为4Hz,即每一计数值的停留时间为0.25s,恰好为当全音符设为1s时,四四拍的4分音符的持续时间。例如,ydfsq在以下的VHDL逻辑描述中,“北京欢迎你”乐曲的第一个音符为“3”,此音
12、在逻辑中停留了2个时钟节拍,即为0.5s时间,相应地所对应“3”音符分频预置数为1289在skfpq的输入端停留了0.5s。随着计数器按4Hz的时钟频率做加法计数时,乐谱逐次被选取,乐曲就开始自然连续而且循环地演奏起来。源程序如下:library ieee;use ieee.std_logic_1164.all; -库的声明entity ydfsq isport(clk:in std_logic;toneindex:out integer range 0 to 15);end;architecture bhv of ydfsq issignal counter:integer range 0
13、to 200; -读取音符谱中的音符beginprocess(clk,counter)beginif counter=63 thencounter=0;elsif clkevent and clk=1 thencountertoneindextoneindextoneindextoneindextoneindextoneindextoneindexnull;end case;end process;end;3.2.2仿真图图3-2 音调发生器仿真图通过仿真图可以清楚的看到,时钟clk由0开始计数,每计一次数输出toneindex的值随之发生一定的变化,只不过根据乐谱的不同,输出的变化也不尽相同
14、。然后把输出toneindex输入到音调编码器模块,进行下一步编码工作。于是,由仿真图印证了ydfsq模块逐次选取音符的功能。3.3手动自动选择器3.3.1功能描述根据设计的要求,该简易乐曲演奏器能实现手动或自动演奏乐曲的功能。于是,可通过一个按键cs来进行自动与手动的选择,当cs按下时,乐曲自动演奏,其他情况下均为手动演奏乐曲,即可以通过按下其他的按键来控制不同的音符。与此同时,还需要一个复位信号rst来控制该演奏器是否工作,当rst为1时,停止演奏,为0时可以演奏。以上提到的手动与自动的选择只能在rst为0时有效。源程序如下:library ieee;use ieee.std_logic_
15、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 qqqqtone=771;code=5;code1tone=911;code=6;code1tone=1091;code=1;code1tone=1196;code=2;code1tone=1289;code=3;code1tone=133
16、1;code=4;code1tone=1409;code=5;code1tone=1479;code=6;code1tone=1541;code=7;code1NULL;end case;end process;end ;3.4.2仿真图图 3-4 音调编码器仿真图在此程序中index为音乐节拍产生模块输出的音符数据,经过翻译后将tone输出到数控分频模块为其提供分频系数的初始值,code为数码管显示的字符数,应用模式5,所以直接输出音符的二进制值,code1为高音阶指示信号,当code1为是说明输出为高音阶的音符。通过仿真图可以清楚地看到结果。3.5数控分频器3.5.1功能描述该模块的clk
17、端输入一个具有较高频率(本实验为12MHz)的信号,通过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 int
18、eger range 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 preclk=0;if count4=12 then -将基准频率进行12分频preclk=1;count4:=0;elsif clkevent and clk=1 then count4:=count4+1;end if;end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 论文 基于 VHDL 简易 乐曲 演奏 设计
链接地址:https://www.31ppt.com/p-4018013.html