周祥音乐演奏系统

上传人:痛*** 文档编号:73692588 上传时间:2022-04-12 格式:DOC 页数:25 大小:309KB
收藏 版权申诉 举报 下载
周祥音乐演奏系统_第1页
第1页 / 共25页
周祥音乐演奏系统_第2页
第2页 / 共25页
周祥音乐演奏系统_第3页
第3页 / 共25页
资源描述:

《周祥音乐演奏系统》由会员分享,可在线阅读,更多相关《周祥音乐演奏系统(25页珍藏版)》请在装配图网上搜索。

1、车辆与动力工程学院课程设计说明书音乐演奏系统摘 要音乐演奏系统目前得到广泛应用,实现方法也有许多种,但随着FPGA集成度的提高,价格下降,EDA设计工具更新换代,功能日益普及与流行,使运用EDA技术设计该系统的方案的应用越来越多。因为FPGA预装了很多已构造好的参数化库单元LPM器件,通过引入支持LPM的EDA软件工具,设计者可以设计出结构独立而且硅片的使用效率非常高的产品。本次课程设计在EDA开发工具 QuartusII 9.1平台上利用VHDL语言设计4X4矩阵式键盘电路Key_encoder,自动音乐播放控制电路NoteTabs,数控分频器电路Tone_Tab1,二选一数据选择电路Mux

2、21c,音节频率产生电路Speakera,利用数控分频的原理设计实现手动按键输入和自动播放功能的音乐演奏系统电路,并通过定制LPM-ROM存储音乐数据,以 “两只蝴蝶”乐曲为例,将音乐数据存储到LPM-ROM,就达到了以纯硬件的手段来实现乐曲的演奏效果。要想实现其他乐曲的演奏效果,只要修改LPM-ROM所存储的音乐数据,将其换成其他乐曲的音乐数据,再重新定制LPM-ROM,连接到程序中就可以实现其它乐曲的演奏。基于FPGA芯片的设计方法能够使设计者有更多机会充分发挥创造性思维,实现多种复杂数字逻辑系统的功能,因此基于上述同一原理,可设置不同按键对应不同的音符,实现手动按键输入,达到电子琴的功能

3、,提高了设计的灵活性和可扩展性。经过对整体进行模块化分析、编程、综合、仿真及最终下载,完整实现简易音乐器的播放功能。关键字:EDA,VHDL,数控分频,FPGA,音乐演奏系统。目录第一章 绪论11.1设计目的和任务要求11.1.1设计目的11.1.2设计任务要求11.2 EDA技术11.3 VHDL语言21.4 FPGA简介2第二章 总体设计42.1 音乐演奏系统组成42.1.1音乐演奏系统电路基本原理42.1.2 音符频率的得到52.1.3自动播放乐曲节奏控制52.1.4 乐谱发生器62.1.5 44 矩阵式键盘62.1.6 音乐演奏电路总体设计62.2 总体程序设计72.2.1 顶层模块V

4、HDL程序72.2.2 单元模块设计92.2.3 4X4矩阵式键盘Key_encoder VHDL程序设计92.2.4 自动乐曲播放模块NoteTabs VHDL程序设计102.2.5 定制音符数据的ROM文件112.2.6 音乐谱对应分频预置数查表电路Tone_tab1 VHDL程序设计122.2.7 Speakera 音乐符数控分频模块 VHDL程序设计142.2.8 4位数据宽度的二选一多路选择器Mux21c VHDL程序设计152.3 VHDL音乐演奏系统仿真与调试162.3.1自动乐曲播放模块NoteTabs的仿真162.3.2音乐谱对应分频预置数查表电路Tone_tab1模块的仿真

5、172.3.2 Speakera 音乐符数控分频模块的仿真172.3.3 4X4矩阵式键盘Key_encoder模块仿真182.3.4 4位数据宽度的二选一多路选择器Mux21c模块仿真19第三章 设计结论21第四章 心得体会22参考文献2323第一章 绪论1.1设计目的和任务要求1.1.1设计目的进一步巩固理论知识,培养所学理论知识在实际中的应用能力;掌握EDA设计的一般方法;熟悉一种EDA软件,掌握一般EDA系统的调试方法;利用EDA软件设计一个电子技术综合问题,培养VHDL编程、书写技术报告的能力。为以后进行工程实际问题的研究打下设计基础。1.1.2设计任务要求本次设计要求利用44矩阵式

6、键盘作为电子琴按键输入,用FPGA设计一个既可以区分不同音高和音阶进行乐曲的演奏,又可以自动播放乐曲的电子琴。要求掌握乐曲的发声原理,掌握44键盘以及音频功放模块的原理及编程控制。下载并测试电路功能,分析芯片资源的占用情况。1.2 EDA技术EDA技术即电子设计自动化技术,它是以可编程逻辑器件(PLD)为载体,以硬件描述语言(HDL)为主要的描述方式,以EDA软件为主要的开发软件的电子设计过程。它主要采用“自顶向下”的设计方法,设计流程主要包括:设计输入、综合、仿真、适配、下载。EDA技术主要有以下特征:(1)高层综合的理论和方法取得进展,从而将EDA设计层次由RT级提高到了系统级,并推出了相

7、应的系统级综合优化工具,大大缩短了复杂ASIC的设计周期。(2)采用硬件描述语言来描述10万门以上的设计,并形成了VHDL和Verilog-HDL两种标准硬件描述语言。(3)采用平面规划技术对逻辑综合和物理版图设计联合管理,做到在逻辑设计综合早期阶段就考虑到物理设计信息的影响。 (4)为带有嵌入式IP核的ASIC设计提供软、硬件协同设计工具。(5)建立并行设计工具框架结构的集成化设计环境,以适应当今ASIC规模大而复杂、数字与模拟电路并存、硬件与软件设计并存、产品上市速度快等特点。1.3 VHDL语言VHDL是一种硬件描述语言,它可以对电子电路和系统的行为进行描述,基于这种描述,结合相关的软件

8、工具,可以得到所期望的实际电路与系统。VHDL程序结构包括:实体(Entity)、结构体(Architecture)、配置(Configuration)、包集合(Package)及库(Library)。其中,实体是一个VHDL程序的基本单元,由实体说明和结构体两部分组成:实体说明用于描述设计系统的外部接口信号;结构体用于描述系统的行为、系统数据的流程或系统组织结构形式。配置用语从库中选取所需的单元来组成系统设计的不同规格的不同版本,使被设计系统的功能发生变化。包集合存放各设计模块能共享的数据类型、常数、子程序等。库用于存放已编译的实体、构造体、包集合及配置:一种是用户自己开发的工程软件,另一种

9、是制造商提供的库。关于VHDL最后要说明的是:与常规的顺序执行的计算机程序不同,VHDL从根本上讲是并发执行的。在VHDL中,只有在进程(PROCESS)、函数(FUNCTION)和过程(PROCEDURE)内部的语句才是顺序执行的。1.4 FPGA简介FPGA是现场可编程门阵列的简称。FPGA 在结构上主要分为三个部分,即可编程逻辑单元,可编程输入/输出单元和可编程连线三个部分。高集成度、高速度和高可靠性是FPGA最明显的特点。于FPGA的集成规模非常大,可利用先进的EDA工具进行电子系统设计和产品开发。由于开发工具的通用性、设计语言的标准化以及设计过程几乎与所用器件的硬件结构没有关系,因而

10、设计开发成功的各类逻辑功能块软件有很好的兼容性和可移植性。 FPGA掉电后将丢失原有的逻辑信息,所以在实用中需要为FPGA芯片配置一个专用ROM。第二章 总体设计2.1 音乐演奏系统组成 自动播放Notetabs选择器mux21c按键输入key_encoder分频器tone_tab1音节频率产生speakera发出音乐spkout图2-1 音乐演奏系统组成图该主系统由三个模块:Spiel顶层文件,Spkout,分频器,自动播放控制,按键输入音乐,二选一选择器,音阶频率产生电路组成。且Spiel顶层文件还包括4个子文件分别是Key_encoder,NoteTabs,ToneTaba和Speake

11、ra,此外,我们还需建立一个名为“music”的LPM_ROM模块和与NoteTabs模块连接。2.1.1音乐演奏系统电路基本原理硬件电路的发声原理,声音的频谱范围约在几十到几千赫兹,利用程序来控制FPGA芯片某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在扬声器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音

12、符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。2.1.2 音符频率的得到多个不同频率的信号可通过对某个基准频率进行分频器获得。由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。本设计中选取1MHz的基准频率。由于现有的高频时钟脉冲信号的频率为12MHz,故需先对其进行12分频,才能获得1MHz的基准频率。对基准频率分频后的输出信号是一些脉宽

13、极窄的尖脉冲信号(占空比=1/分频系数)。为提高输出信号的驱动能力,以使扬声器有足够的功率发音,需要再通过一个分频器将原来的分频器的输出脉冲均衡为对称方波(占空比=1/2),但这时的频率将是原来的1/2。下表就是简谱中音名与频率的对应关系。表2-2 简谱中音名与频率的对应关系音名频率/Hz音名频率/Hz音名频率/Hz低音1261.63中音1523.25高音11046.5低音2293.67低音2587.33高音21174.66低音3329.63低音3659.25高音31318.51低音4349.23低音4698.46高音41396.92低音5391.99低音5783.99高音51567.98低音

14、6440低音6880高音61760低音7493.88低音7987.76高音71975.522.1.3自动播放乐曲节奏控制本设计以“两只蝴蝶”为例,最小的节拍为1/4拍,若将1拍的时间定为0.5秒,则只需要提供一个8Hz的时钟频率即可产生1/4拍的时长(0.125秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低2.1.4 乐谱发生器本设计将乐谱中的音符数据存储在LPM-ROM中,如“两只蝴蝶”乐曲中的第一个音符为“3”,

15、此音在逻辑中停留了4个时钟节拍,即0.5秒的时间,相应地,音符“3”就要在LPM-ROM中连续的四个地址上都存储。当一个8Hz的时钟来时,相应地就从LPM-ROM中输出一个音符数据。2.1.5 44 矩阵式键盘在数字系统中,用二进制代码表示特定信息的过程称为编码。能完成编码的电路称为编码器。十六进制编码键盘是一个44的矩阵结构,用x3-x0和y3-y0等八条信号线接受十六个键的信息,X30是行信息输入端,Y30是列信息输入端,没有按下键时,信号线呈高电平,有按下键时,相应信号线呈低电平。例如,当0键按下时,x3x2x1x0=1110,y3y2y1y0=1110,编码器输出k_code 30=0

16、,当1按下时,x3x2x1x0=1110,y3y2y1y0=1101,k_code30=1;依此类推。 2.1.6 音乐演奏电路总体设计组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需的两个基本要素,问题是如何来获取这两个要素所对应的数值以及通过纯硬件的手段来利用这些数值实现所希望乐曲的演奏效果。如图2-1模块NoteTabs类似于音乐播放器;Key_encoder类似于电子琴键;Speakera类似于琴弦或音调发声器。音符的频率可以由图2-1中的Speakera获得,这是一个数控分频器。由其clk端输入一具有较频率(这里是12MHz)的信号,通过Speakera分频后由Spk

17、out输出,由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,但这时的频率将是原来的1/2。Speakera对clk输入信号的分频比由11位预置数Tone10.0决定。Spkout的输出频率将决定每一音符的音调,这样,分频计数器的预置值Tone10.0与Spkout的输出频率,就有了对应关系。音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定,图2-1中模块Tone-tab1的功能首先是为Speakera提供决定所发音符的分频预置数,而此数在Speakera输入口停留的时间即为此音符的节拍值。输向Tone-tab1中Inde

18、x3.0的值ToneIndex3.0和K_code3.0的输出值与持续的时间由模块NoteTabs和Key_encoder决定。当一个8Hz的时钟脉冲来到时,NoteTabs模块输出一个音符数据给Tone-tab1模块,Tone-tab1模块输出此音符相应的分频系数,将分频系数送给Speakera模块,。在NoteTabs中设置了一个music模块,作为音符数据ROM的地址发生器。音乐演奏电路主要是用VHDL语言来设计,并利用QuartusII 9.1软件工具来编译、测试和仿真,综上得到乐曲演奏电路的原理图如图2-3所示。图2-3 顶层模块原理图2.2 总体程序设计2.2.1 顶层模块VHDL

19、程序程序如下:LIBRARY ieee;USE ieee.std_logic_1164.all; LIBRARY work;ENTITY spiel IS PORT(clk8hz : IN STD_LOGIC;key : IN STD_LOGIC;clK12mhz : IN STD_LOGIC;x1 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);y1 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);spk_out : OUT STD_LOGIC);END spiel;ARCHITECTURE bdf_type OF spiel IS COMPONENT

20、 notetabsPORT(clk : IN STD_LOGIC; toneindex : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END COMPONENT;COMPONENT mux21cPORT(key : IN STD_LOGIC; k_code : IN STD_LOGIC_VECTOR(3 DOWNTO 0); toneindex : IN STD_LOGIC_VECTOR(3 DOWNTO 0); index : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END COMPONENT;COMPONENT tone_tab1PORT(

21、index : IN STD_LOGIC_VECTOR(3 DOWNTO 0); tone : OUT STD_LOGIC_VECTOR(10 DOWNTO 0);END COMPONENT;COMPONENT key_encoderPORT(x : IN STD_LOGIC_VECTOR(3 DOWNTO 0); y : IN STD_LOGIC_VECTOR(3 DOWNTO 0); k_code : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END COMPONENT;SIGNALSYNTHESIZED_WIRE_0 : STD_LOGIC_VECTOR(3 DO

22、WNTO 0);SIGNALSYNTHESIZED_WIRE_1 : STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNALSYNTHESIZED_WIRE_2 : STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNALSYNTHESIZED_WIRE_3 : STD_LOGIC_VECTOR(10 DOWNTO 0);BEGIN b2v_inst : notetabsPORT MAP(clk = clk8hz, toneindex = SYNTHESIZED_WIRE_1);b2v_inst4 : mux21cPORT MAP(key = key, k_cod

23、e = SYNTHESIZED_WIRE_0, toneindex = SYNTHESIZED_WIRE_1, index = SYNTHESIZED_WIRE_2);b2v_inst5 : tone_tab1PORT MAP(index = SYNTHESIZED_WIRE_2, tone = SYNTHESIZED_WIRE_3);b2v_inst6 : speakeraPORT MAP(clk = clK12mhz, tone = SYNTHESIZED_WIRE_3, spks = spk_out);b2v_inst7 : key_encoderPORT MAP(x = x1, y =

24、 y1, k_code = SYNTHESIZED_WIRE_0);END bdf_type;顶层设计按自顶向下的设计方法进行,首先通过自动音乐播放控制notetabs模块和4X4矩阵式键盘key_encoder模块产生对应音节所对应的索引值,然后通过二选一多路选择器mux21c模块实现手动和自动的切换,把对应音节的索引值送到数控分频tone_tab1模块产生用于分频的分频系数,利用分频系数,通过音节频产生speakera模块进行分频,产生音节发声所需的频率,接到蜂鸣器既可以发出音乐。2.2.2 单元模块设计根据顶层原理图,共分为key_encoder模块、notetabs模块、mux21c模

25、块、tone_tab1模块、speakera模块这五个模块。music模块存放乐曲中的音符数据,notetabs模块作为music模块中所定制的音符数据ROM的地址发生器,tone_tab1模块提供分频预置数即给数控分频模块提供分频系数。speakera模块根据分频预置数输出各个音符所对应的频率。在乐曲构成中,乐音的频率和持续时间是其构成要素。音阶的频率可以通过高频时钟进行分频得到。因此采用一个较为合适的时钟频率12MHz。2.2.3 4X4矩阵式键盘Key_encoder VHDL程序设计4X4矩阵式键盘采用16进制编码键盘结构,用x3-x0和y3-y0等八条信号线接受十六个键的信息。程序如

26、下LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY key_encoder IS PORT(x,y:IN STD_LOGIC_VECTOR(3 DOWNTO 0); k_code:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END;ARCHITECTURE one OF key_encoder ISBEGIN PROCESS(x,y) VARIABLE xy:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN XY:=(x&y); CASE xy IS WHEN 11101110=k_codek_codek

27、_codek_codek_codek_codek_codek_codek_codek_codek_codek_codek_codek_codek_codek_codek_code=0000; END CASE; END PROCESS; END one;该段程序用于按键输入电子琴键盘,按下一个键响一个音,分别设定对应为休止符,低音1到高音1。X30是行信息输入端,Y30是列信息输入端,没有按下键时,信号线呈高电平,有按下键时,相应信号线呈低电平。例如,当0键按下时,x3x2x1x0=1110,y3y2y1y0=1110,编码器输出k_code 30=0000,当1按下时,x3x2x1x0=11

28、10,y3y2y1y0=1101,k_code30=0001;依此类推。 2.2.4 自动乐曲播放模块NoteTabs VHDL程序设计音乐的播放就是通过外部8Hz时钟驱动,内部以计数器进行计数,产生地址,送到ROM单元中作为存储器地址,将对应地址的数据音阶索引值输出。自动乐曲播放模块模块程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY notetabs IS PORT(clk:IN STD_LOGIC; toneindex:OUT STD_LOGIC_VECTOR(3 DO

29、WNTO 0);END;ARCHITECTURE two OF notetabs IS COMPONENT music PORT(address:IN STD_LOGIC_VECTOR(8 DOWNTO 0); inclock:IN STD_LOGIC; q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); END COMPONENT; SIGNAL counter:STD_LOGIC_VECTOR(8 DOWNTO 0); BEGIN cnt8:PROCESS(clk,counter) BEGIN IF counter=256 THEN counter=000000000;

30、 ELSIF(clkEVENT AND clk=1) THEN countercounter,q=toneindex,inclock=clk);END; 2.2.5 定制音符数据的ROM文件Music模块存放乐曲中的音符数据,它是利用LPM-ROM来实现的,地址线为9位,数据线宽度为4位。ROM内存储的数据即各音阶的索引值,根据乐谱转换的需要,16个索引值即可满足乐谱编写的需要,所以设置了4位数据线。地址线的宽度主要取决于乐曲的长度,本例用到了256个4bit单元,将数据线宽度定义为9位。表1列出了索引值与音阶的对应关系。因为1拍的时间定为0.5秒,提供的是8Hz的时钟频率(即1/4拍的整数倍

31、),则需将这个音符存储在相应次数的连续几个地址上,即随地址递增时,将从音符数据ROM中将连续取出4个音符“3”通过toneindex3.0端口输向分频预置数模块。这样“两只蝴蝶”乐曲中的音符就一个接一个的通过toneindex3.0端口输向分频预置数模块。然后对音符数据进行ROM定制,最后对定制好的ROM文件进行测试和仿真。ROM定制的基本步骤如下:(1)进入QuartusII,选菜单 TOOL-megawizard plug-in manager,选择“creat a new”,然后按“next”键,选择LPM-ROM;最后在browse下的栏中键入路径与输出文件名。(2)单击“next”键

32、,选择ROM数据位宽度为4,地址线宽为256,即设置此ROM能存储8位二进制数据共256个。(3)通过“browse” 钮,找到ROM中的加载文件路径和文件名:注意ROM元件的inclock是地址锁存时钟。(4)打开已定制的ROM文件,将它设置为工程,并确定目标器件,进行测试仿真波形,按照定制步骤对音符数据文件进行ROM定制。后缀为mif的部分文件如图图2-4 定制ROM初始化文件music.mif2.2.6 音乐谱对应分频预置数查表电路Tone_tab1 VHDL程序设计各音符的分频系数就是从1MHz的基准频率二分频得到的500KHz频率基础上计算得到的。由于最大分频系数是1911,故分频器

33、采用11位二进制计数器能满足要求,乐曲中的休止符,只要将分频系数设为0表2-5 音阶、频率、预置分频系数的对应关系音阶频率预置分频系数二进制音阶频率预置分频系数二进制低1261.63191111101110111中2587.3385101101010011低2293.67170311010100111中3659.2575801011110110低3329.63152010111110000中4698.4671601011001100低4349.23143210110011000中5783.9963801001111110低5391.99127610011111100中6880568010001

34、11000低6440113610001110000中7987.7650600111111010低7493.88101201110111100高11046.547800111011110中1523.259560111011110000000000000000在这个模块的VHDL逻辑描述中设置了“两只蝴蝶”全部音符所对应的分频预置数,共16个,每一音符的停留时间由音乐节拍和地址发生器模块的时钟(Clk)的输入频率决定,在此为8Hz。这16个值的输出由程序的4位输入值index3.0确定。输向分频预置数模块的程序中index3.0的值又由地址发生器模块的输出toneindex3.0的输出值和持续时间

35、决定。程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY tone_tab1 IS PORT(index:IN STD_LOGIC_VECTOR(3 DOWNTO 0); tone:OUT STD_LOGIC_VECTOR(10 DOWNTO 0);END;ARCHITECTURE five OF tone_tab1 IS BEGIN PROCESS(index) BEGIN CASE index IS WHEN0000=tonetonetonetonetonetonetone

36、tonetonetonetonetonetonetonetonetoneNULL; END CASE; END PROCESS; END five;程序的功能是输出各个音符所对应的分频预置数,当index是“0000”,tone输出为00000000000,即休止符的分频预置数;当index是“0010”时, tone输出为1703,即低音2的分频预置数;当index是“1111”时, tone输出为478即高音1的分频预置数。当index取不同的值时,tone分别输出相应音符的分频预置数。2.2.7 Speakera 音乐符数控分频模块 VHDL程序设计音阶产生电路在获取上面的音阶索引值对应

37、的分频系数后,通过可控计数器进行分频。分频器电路中“TONE”作为预置数,进行减一计数,其程序如下LIBRARY IEEE;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(10 DOWNTO 0); spks:OUT STD_LOGIC);END; ARCHITECTURE six OF speakera IS SIGNAL preclk,fullspks:STD_

38、LOGIC;BEGINdivideclk:PROCESS(clk) VARIABLE count4:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PRECLK11 THEN PRECLK=1; COUNT4:=0000; ELSIF CLKEVENT AND CLK=1 THEN COUNT4:=COUNT4+1; END IF; END PROCESS;GENSPKS:PROCESS(preclk,tone) VARIABLE count11:STD_LOGIC_VECTOR(10 DOWNTO 0); BEGIN IF PRECLKEVENT AND PRECLK

39、=1 THEN IF COUNT11=0 THEN COUNT11:=TONE; FULLSPKS=1; ELSE COUNT11:=COUNT11-1; FULLSPKS=0; END IF; END IF; END PROCESS;DELAYSPKS:PROCESS(fullspks) VARIABLE COUNT2:STD_LOGIC; BEGIN IF FULLSPKSEVENT AND FULLSPKS=1 THEN COUNT2:=NOT COUNT2; IF COUNT2=1 THEN SPKS=1; ELSE SPKS=0; END IF; END IF; END PROCES

40、S; END; 在该VHDL描述程序中,进程“dicideclk”将外部时钟进行预分频,即12分频,因此外部输入的时钟信号如果为12MHZ,则经过此分频后得到1MHZ的信号。因为表2-2的个音节的分频系数是以1MHZ外部时钟信号为前提的。这样在移植程序时,可根据硬件条件调整此分频系数,保证获得1MHZ时钟信号系数即可。进程“GENSPKS”的作用是根据预置数的不同,产生2倍音阶信号。因为此信号的脉冲宽度极小(1个Preclk周期),所以需要调整占空比才使外部驱动电路提供足够的驱动蜂鸣器的功率。2.2.8 4位数据宽度的二选一多路选择器Mux21c VHDL程序设计 为了实现自动音乐播放和按键输

41、入电子琴功能切换,本例设置了一个二选一多路选择器,通过按键控制选择段端按键音和存储音乐的选择播放。程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux21c IS PORT(k_code,toneindex:IN STD_LOGIC_VECTOR(3 DOWNTO 0); key:IN STD_LOGIC; index:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); END;ARCHITECTURE four OF mux21c IS BEGIN PROCESS(k_code,toneindex,key) BEGI

42、N IF key=0 THEN index=k_code; ELSE index=toneindex; END IF; END PROCESS; END four;在该VHDL描述程序中,当不按下key时,相当于低电平0,实现的是按键输入,将k_code输出到index中。当按下key时,相当于高电平1,实现的是indextone输出到index中。2.3 VHDL音乐演奏系统仿真与调试2.3.1自动乐曲播放模块NoteTabs的仿真(1)波形仿真:将所编写的音乐节拍和音调模块NoteTabs的程序设为工程。进行仿真,仿真结果如图2-6所示。图2-6 NoteTabs自动乐曲播放模块的仿真结果

43、(2)模块功能分析与调试音乐节拍和音调模块NoteTabs的功能是控制自动音乐播放,音乐的数据存储在定制的ROM中,当启动自动音乐播放时,则将ROM中存储的对应音节的索引值输出出来,再通过索引值得到对应音节的分频系数。如图2-4 music.mif中所存数据,存储次数的多少代表音节发声的长短,所以对应于图2-4,仿真正确。2.3.2音乐谱对应分频预置数查表电路Tone_tab1模块的仿真(1)波形仿真:将所编写的分频预置数查表模块Tone_tab1的程序设为工程。进行仿真,仿真结果如图2-7所示。图2-7 Tone_tab1 分频预置数查表模块的仿真结果(2)模块功能分析与调试Tone_tab

44、1 分频预置数模块的功能是输出各个音符所对应的分频预置数,由上面的仿真波形图可看到若当index是“0000”,tone输出为0,即休止符的分频预置数;当index是“0101”时, tone输出为1432即低音4的分频预置数;当index是“1111”时, tone输出为478即高音1的分频预置数等等其它状态时,tone分别输出相应音符的分频预置数,仿真波形图证明了程序实现了模块的功能。 2.3.2 Speakera 音乐符数控分频模块的仿真(1)波形仿真:将所编写的音乐符数控分频模块Speakera的程序设为工程进行仿真,仿真结果如图2-8所示。图2-8 Speakera 音乐符数控分频模

45、块的仿真结果(2)模块功能分析与调试Speakera 音乐符数控分频此模块的功能是根据初始值Tone的值,对输入时钟信号Clk的频率进行分频,得到想要的音符的发声频率其时钟(Clk)端输入的是在十六进制模块里对12MHz的信号进行12分频得到的1MHz,1MHz的信号根据分频预置数模块中所提供的计数初值,分别得出相应音符频率的两倍值。此时从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,这时的频率就变为原来的1/2,刚好就是相应音符的频率。在clk端输入一具有较高频率的信号(这里是12MHz)的信号,通过分频后由cout输出。这里是对1

46、2MHz的信号进行12分频得到1MHz的信号。1MHz的时钟脉冲信号是给数控分频模块提供时钟信号。数控分频模块中对Clk输入信号的分频比由11位预置数tone10.0决定。spkout的输出频率将决定每一个音符的音调,这样,分频计数器的预置tone10.0与spkout的输出频率就有了对应关系。2.3.3 4X4矩阵式键盘Key_encoder模块仿真(1)波形仿真:将所编写的4X4矩阵式键盘Key_encoder模块的程序设为工程,进行仿真,仿真结果如图2-9所示。图2-9 4X4矩阵式键盘Key_encoder模块仿真(2)模块功能分析与调试4X4矩阵式键盘实现按下一个键对应输出一个音,k

47、_code中放的是对应音阶索引值,例如xy输入为ED即化为二进制为11101101,输出为0001;输入为77即化为二进制为01110111,输出为1111。仿真结果完全正确。2.3.4 4位数据宽度的二选一多路选择器Mux21c模块仿真(1)波形仿真:将所编写的4位数据宽度的二选一多路选择器Mux21c模块程序设为工程,进行仿真,仿真结果如图2-10图2-10 4位数据宽度的二选一多路选择器Mux21c模块仿真(2)模块功能分析与调试二选一多路选择器就是实现自动音乐播放和按键输入的切换,当key为低电平时,输出的是k_code,当key为高电平时,输出的是indextone。仿真结果正确。第三章 设计结论本文介绍了基于FPGA的音乐演奏系统的设计,设计实现了乐曲自动播放和手动播放的自由切换。本设计经过了整体分析、模块化分析、整体与模块的仿真分析这样三个步骤,描述了其工作原理、设计思路及实现方法,实现了自动演奏以及

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!