收藏 分享(赏)

周祥 音乐演奏系统.doc

上传人:czsj190 文档编号:8089319 上传时间:2019-06-08 格式:DOC 页数:25 大小:358.50KB
下载 相关 举报
周祥  音乐演奏系统.doc_第1页
第1页 / 共25页
周祥  音乐演奏系统.doc_第2页
第2页 / 共25页
周祥  音乐演奏系统.doc_第3页
第3页 / 共25页
周祥  音乐演奏系统.doc_第4页
第4页 / 共25页
周祥  音乐演奏系统.doc_第5页
第5页 / 共25页
点击查看更多>>
资源描述

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

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

3、,可设置不同按键对应不同的音符,实现手动按键输入,达到电子琴的功能,提高了设计的灵活性和可扩展性。经过对整体进行模块化分析、编程、综合、仿真及最终下载,完整实现简易音乐器的播放功能。关键字:EDA,VHDL ,数控分频, FPGA,音乐演奏系统。车辆与动力工程学院课程设计说明书II目录第一章 绪论 .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.

4、3 自动播放乐曲节奏控制 .52.1.4 乐谱发生器 .62.1.5 44 矩阵式键盘 62.1.6 音乐演奏电路总体设计 .62.2 总体程序设计 72.2.1 顶层模块 VHDL 程序 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 位

5、数据宽度的二选一多路选择器 Mux21c VHDL 程序设计 .152.3 VHDL 音乐演奏系统仿真与调试 .162.3.1 自动乐曲播放模块 NoteTabs 的仿真 .162.3.2 音乐谱对应分频预置数查表电路 Tone_tab1 模块的仿真 172.3.2 Speakera 音乐符数控分频模块的仿真 .172.3.3 4X4 矩阵式键盘 Key_encoder 模块仿真 182.3.4 4 位数据宽度的二选一多路选择器 Mux21c 模块仿真 .19第三章 设计结论 .21第四章 心得体会 .22参考文献 .23车辆与动力工程学院课程设计说明书1第一章 绪论1.1 设计目的和任务要求

6、1.1.1 设计目的进一步巩固理论知识,培养所学理论知识在实际中的应用能力;掌握 EDA设计的一般方法;熟悉一种 EDA 软件,掌握一般 EDA 系统的调试方法;利用EDA 软件设计一个电子技术综合问题,培养 VHDL 编程、书写技术报告的能力。为以后进行工程实际问题的研究打下设计基础。1.1.2 设计任务要求本次设计要求利用 44 矩阵式键盘作为电子琴按键输入,用 FPGA 设计一个既可以区分不同音高和音阶进行乐曲的演奏,又可以自动播放乐曲的电子琴。要求掌握乐曲的发声原理,掌握 44 键盘以及音频功放模块的原理及编程控制。下载并测试电路功能,分析芯片资源的占用情况。1.2 EDA 技术EDA

7、 技术即电子设计自动化技术,它是以可编程逻辑器件(PLD) 为载体,以硬件描述语言(HDL)为主要的描述方式,以 EDA 软件为主要的开发软件的电子设计过程。它主要采用“自顶向下” 的设计方法,设计流程主要包括:设计输入、综合、仿真、适配、下载。EDA 技术主要有以下特征:(1)高层综合的理论和方法取得进展,从而将 EDA 设计层次由 RT 级提高到了系统级,并推出了相应的系统级综合优化工具,大大缩短了复杂 ASIC 的设计周期。(2)采用硬件描述语言来描述 10 万门以上的设计,并形成了 VHDL 和车辆与动力工程学院课程设计说明书2Verilog-HDL 两种标准硬件描述语言。(3)采用平

8、面规划技术对逻辑综合和物理版图设计联合管理,做到在逻辑设计综合早期阶段就考虑到物理设计信息的影响。(4)为带有嵌入式 IP 核的 ASIC 设计提供软、硬件协同设计工具。(5)建立并行设计工具框架结构的集成化设计环境,以适应当今 ASIC 规模大而复杂、数字与模拟电路并存、硬件与软件设计并存、产品上市速度快等特点。1.3 VHDL 语言VHDL 是一种硬件描述语言,它可以对电子电路和系统的行为进行描述,基于这种描述,结合相关的软件工具,可以得到所期望的实际电路与系统。VHDL 程序结构包括:实体(Entity) 、结构体(Architecture)、配置(Configuration)、包集合(

9、Package)及库(Library)。其中,实体是一个 VHDL 程序的基本单元,由实体说明和结构体两部分组成:实体说明用于描述设计系统的外部接口信号;结构体用于描述系统的行为、系统数据的流程或系统组织结构形式。配置用语从库中选取所需的单元来组成系统设计的不同规格的不同版本,使被设计系统的功能发生变化。包集合存放各设计模块能共享的数据类型、常数、子程序等。库用于存放已编译的实体、构造体、包集合及配置:一种是用户自己开发的工程软件,另一种是制造商提供的库。关于 VHDL 最后要说明的是:与常规的顺序执行的计算机程序不同,VHDL 从根本上讲是并发执行的。在 VHDL 中,只有在进程(PROCE

10、SS)、函数(FUNCTION)和过程(PROCEDURE)内部的语句才是顺序执行的。1.4 FPGA 简介FPGA 是现场可编程门阵列的简称。FPGA 在结构上主要分为三个部分,即可编程逻辑单元,可编程输入/输出单元和可编程连线三个部分。高集成度、高速度和高可靠性是 FPGA 最明显的特点。于 FPGA 的集成规模非常大,可利车辆与动力工程学院课程设计说明书3用先进的 EDA 工具进行电子系统设计和产品开发。由于开发工具的通用性、设计语言的标准化以及设计过程几乎与所用器件的硬件结构没有关系,因而设计开发成功的各类逻辑功能块软件有很好的兼容性和可移植性。 FPGA 掉电后将丢失原有的逻辑信息,

11、所以在实用中需要为 FPGA 芯片配置一个专用 ROM。车辆与动力工程学院课程设计说明书4第二章 总体设计2.1 音乐演奏系统组成 自动播放Notetabs选择器mux21c按键输入key_encoder分频器tone_tab1音节频率产生speakera发出音乐spkout图 2-1 音乐演奏系统组成图该主系统由三个模块:Spiel 顶层文件,Spkout,分频器,自动播放控制,按键输入音乐,二选一选择器,音阶频率产生电路组成。且 Spiel 顶层文件还包括 4个子文件分别是 Key_encoder,NoteTabs ,ToneTaba 和 Speakera,此外,我们还需建立一个名为“mu

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

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

14、频率分频后的输出信号是一些脉宽极窄的尖脉冲信号(占空比=1/分频系数)。为提高输出信号的驱动能力,以使扬声器有足够的功率发音,需要再通过一个分频器将原来的分频器的输出脉冲均衡为对称方波(占空比=1/2),但这时的频率将是原来的 1/2。下表就是简谱中音名与频率的对应关系。表 2-2 简谱中音名与频率的对应关系音名 频率/Hz 音名 频率/Hz 音名 频率/Hz低音 1 261.63 中音 1 523.25 高音 1 1046.5低音 2 293.67 低音 2 587.33 高音 2 1174.66低音 3 329.63 低音 3 659.25 高音 3 1318.51低音 4 349.23

15、低音 4 698.46 高音 4 1396.92低音 5 391.99 低音 5 783.99 高音 5 1567.98低音 6 440 低音 6 880 高音 6 1760低音 7 493.88 低音 7 987.76 高音 7 1975.522.1.3 自动播放乐曲节奏控制本设计以“两只蝴蝶 ”为例 ,最小的节拍为 1/4 拍,若将 1 拍的时间定为 0.5秒,则只需要提供一个 8Hz 的时钟频率即可产生 1/4 拍的时长(0.125 秒),对于其它占用时间较长的节拍(必为 1/4 拍的整数倍)则只需要将该音符连续输出相应的次数即可。车辆与动力工程学院课程设计说明书6计数时钟信号作为输出音

16、符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低2.1.4 乐谱发生器本设计将乐谱中的音符数据存储在 LPM-ROM 中,如“两只蝴蝶”乐曲中的第一个音符为“3”,此音在逻辑中停留了 4 个时钟节拍,即 0.5 秒的时间,相应地,音符“3”就要在 LPM-ROM 中连续的四个地址上都存储。当一个 8Hz 的时钟来时,相应地就从 LPM-ROM 中输出一个音符数据 。2.1.5 44 矩阵式键盘在数字系统中,用二进制代码表示特定信息的过程称为编码。能完成编码的电路称为编码器。十六进制编码键盘是一个 44 的矩阵结构,用 x3-x0 和

17、y3-y0 等八条信号线接受十六个键的信息,X30是行信息输入端, Y30是列信息输入端,没有按下键时,信号线呈高电平,有按下键时,相应信号线呈低电平。例如,当 0 键按下时,x3x2x1x0=1110,y3y2y1y0=1110,编码器输出k_code 30=0,当 1 按下时,x3x2x1x0=1110,y3y2y1y0=1101,k_code30=1;依此类推。 2.1.6 音乐演奏电路总体设计组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需的两个基本要素,问题是如何来获取这两个要素所对应的数值以及通过纯硬件的手段来利用这些数值实现所希望乐曲的演奏效果。如图 2-1 模块

18、 NoteTabs 类似于音乐播放器;Key_encoder 类似于电子琴键; Speakera 类似于琴弦或音调发声器。音符的频率可以由图 2-1 中的 Speakera 获得,这是一个数控分频器。由其clk 端输入一具有较频率(这里是 12MHz)的信号,通过 Speakera 分频后由Spkout 输出,由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个 D 触发器以均衡其占空比,但这时的频率将是原来的 1/2。Speakera 对 clk 输入信号的分频比由 11 位预置数车辆与动力工程学院课程设计说明书7Tone100决定。 Spkout 的

19、输出频率将决定每一音符的音调,这样,分频计数器的预置值 Tone100与 Spkout 的输出频率,就有了对应关系。音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定,图 2-1 中模块 Tone-tab1 的功能首先是为 Speakera 提供决定所发音符的分频预置数,而此数在 Speakera 输入口停留的时间即为此音符的节拍值。输向 Tone-tab1 中Index30的值 ToneIndex30和 K_code30的输出值与持续的时间由模块NoteTabs 和 Key_encoder 决定。当一个 8Hz 的时钟脉冲来到时,NoteTabs 模块输出一个音符数据给 Tone-tab

20、1 模块,Tone-tab1 模块输出此音符相应的分频系数,将分频系数送给 Speakera 模块,。在 NoteTabs 中设置了一个 music 模块,作为音符数据 ROM 的地址发生器。音乐演奏电路主要是用 VHDL 语言来设计,并利用 QuartusII 9.1 软件工具来编译、测试和仿真 ,综上得到乐曲演奏电路的原理图如图 2-3 所示。图 2-3 顶层模块原理图2.2 总体程序设计2.2.1 顶层模块 VHDL 程序程序如下:LIBRARY ieee;USE ieee.std_logic_1164.all; 车辆与动力工程学院课程设计说明书8LIBRARY work;ENTITY

21、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 notetabsPORT(clk : IN STD_LOGIC;toneindex : OUT STD_LOGIC_VECTOR(3 D

22、OWNTO 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(index : IN STD_LOGIC_VECTOR(3 DOWNTO 0);tone : OUT STD_LOGIC_VECTOR(10 DO

23、WNTO 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;SIGNAL SYNTHESIZED_WIRE_0 : STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL SYNTHESIZED_WIRE_1 : STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL SYN

24、THESIZED_WIRE_2 : STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL SYNTHESIZED_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_code = SYNTHESIZED_WIRE_0,toneindex = SYNTHESIZED_WIRE_1,index = SYNTHESIZED_

25、WIRE_2);车辆与动力工程学院课程设计说明书9b2v_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 = y1,k_code = SYNTHESIZED_WIRE_0);END bdf_type;顶层设计按自顶向下的设计方法进行,

26、首先通过自动音乐播放控制notetabs 模块和 4X4 矩阵式键盘 key_encoder 模块产生对应音节所对应的索引值,然后通过二选一多路选择器 mux21c 模块实现手动和自动的切换,把对应音节的索引值送到数控分频 tone_tab1 模块产生用于分频的分频系数,利用分频系数,通过音节频产生 speakera 模块进行分频,产生音节发声所需的频率,接到蜂鸣器既可以发出音乐。2.2.2 单元模块设计根据顶层原理图,共分为 key_encoder 模块、notetabs 模块、mux21c 模块、tone_tab1 模块、speakera 模块这五个模块。music 模块存放乐曲中的音符数

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

28、LOGIC_1164.ALL;车辆与动力工程学院课程设计说明书10ENTITY key_encoder ISPORT(x,y:IN STD_LOGIC_VECTOR(3 DOWNTO 0);k_code:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END;ARCHITECTURE one OF key_encoder ISBEGINPROCESS(x,y)VARIABLE xy:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGINXY:=(xCASE xy ISWHEN “11101110“=k_codek_codek_codek_codek_codek_

29、codek_codek_codek_codek_codek_codek_codek_codek_codek_codek_codek_codecounter,q=toneindex,inclock=clk);END; 2.2.5 定制音符数据的 ROM 文件Music 模块存放乐曲中的音符数据,它是利用 LPM-ROM 来实现的,地址线为 9 位,数据线宽度为 4 位。ROM 内存储的数据即各音阶的索引值,根据乐谱转换的需要,16 个索引值即可满足乐谱编写的需要,所以设置了 4 位数据线。地址线的宽度主要取决于乐曲的长度,本例用到了 256 个 4bit 单元,将数据线宽度定义为 9 位。表 1

30、 列出了索引值与音阶的对应关系。因为 1 拍的时间定为0.5 秒,提供的是 8Hz 的时钟频率(即 1/4 拍的整数倍) ,则需将这个音符存储在相应次数的连续几个地址上,即随地址递增时,将从音符数据 ROM 中将连续取出 4 个音符“3”通过 toneindex30端口输向分频预置数模块。这样“ 两只蝴蝶”乐曲中的音符就一个接一个的通过 toneindex30端口输向分频预置数模块。然车辆与动力工程学院课程设计说明书12后对音符数据进行 ROM 定制,最后对定制好的 ROM 文件进行测试和仿真。ROM 定制的基本步骤如下:(1)进入 QuartusII,选菜单 TOOL-megawizard

31、plug-in manager,选择“creat a new”,然后按“next”键,选择 LPM-ROM;最后在 browse 下的栏中键入路径与输出文件名。(2)单击“next”键, ,选择 ROM 数据位宽度为 4,地址线宽为 256,即设置此 ROM 能存储 8 位二进制数据共 256 个。(3)通过“browse” 钮,找到 ROM 中的加载文件路径和文件名:注意 ROM元件的 inclock 是地址锁存时钟。(4)打开已定制的 ROM 文件,将它设置为工程,并确定目标器件,进行测试仿真波形,按照定制步骤对音符数据文件进行 ROM 定制。后缀为 mif 的部分文件如图图 2-4 定制

32、 ROM初始化文件 music.mif车辆与动力工程学院课程设计说明书132.2.6 音乐谱对应分频预置数查表电路 Tone_tab1 VHDL 程序设计各音符的分频系数就是从 1MHz 的基准频率二分频得到的 500KHz 频率基础上计算得到的。由于最大分频系数是 1911,故分频器采用 11 位二进制计数器能满足要求,乐曲中的休止符,只要将分频系数设为 0表 2-5 音阶、频率、预置分频系数的对应关系音阶 频率 预置分频系数 二进制 音阶 频率 预置分频系数 二进制低 1 261.63 1911 11101110111 中 2 587.33 851 01101010011低 2 293.6

33、7 1703 11010100111 中 3 659.25 758 01011110110低 3 329.63 1520 10111110000 中 4 698.46 716 01011001100低 4 349.23 1432 10110011000 中 5 783.99 638 01001111110低 5 391.99 1276 10011111100 中 6 880 568 01000111000低 6 440 1136 10001110000 中 7 987.76 506 00111111010低 7 493.88 1012 01110111100 高 1 1046.5 478 00

34、111011110中 1 523.25 956 01110111100 0 0 0 00000000000在这个模块的 VHDL 逻辑描述中设置了“两只蝴蝶” 全部音符所对应的分频预置数,共 16 个,每一音符的停留时间由音乐节拍和地址发生器模块的时钟(Clk)的输入频率决定,在此为 8Hz。这 16 个值的输出由程序的 4 位输入值index30确定。输向分频预置数模块的程序中 index30的值又由地址发生器模块的输出 toneindex30的输出值和持续时间决定。程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGI

35、C_UNSIGNED.ALL;ENTITY tone_tab1 ISPORT(index:IN STD_LOGIC_VECTOR(3 DOWNTO 0);tone:OUT STD_LOGIC_VECTOR(10 DOWNTO 0);END;ARCHITECTURE five OF tone_tab1 ISBEGINPROCESS(index)车辆与动力工程学院课程设计说明书14BEGINCASE index ISWHEN“0000“=tonetonetonetonetonetonetonetonetonetonetonetonetonetonetonetoneNULL;END CASE;END

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

37、数,进行减一计数,其程序如下LIBRARY IEEE;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY speakera ISPORT(clk:IN STD_LOGIC;tone:IN STD_LOGIC_VECTOR(10 DOWNTO 0);车辆与动力工程学院课程设计说明书15spks:OUT STD_LOGIC);END;ARCHITECTURE six OF speakera ISSIGNAL preclk,fullspks:STD_LOGIC;BEGINdivideclk:P

38、ROCESS(clk)VARIABLE count4:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPRECLK11 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);BEGINIF PRECLKEVENT AND PRECLK=1 THENIF COUNT11=0 THEN COUNT

39、11:=TONE;FULLSPKS=1; ELSE COUNT11:=COUNT11-1; FULLSPKS=0;END IF;END IF;END PROCESS;DELAYSPKS:PROCESS(fullspks)VARIABLE COUNT2:STD_LOGIC;BEGINIF FULLSPKSEVENT AND FULLSPKS=1 THENCOUNT2:=NOT COUNT2;IF COUNT2=1 THENSPKS=1;ELSE SPKS=0;END IF;END IF;END PROCESS;END; 在该 VHDL 描述程序中,进程“dicideclk”将外部时钟进行预分频,

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

41、切换,本例设置了一个二选一多路选择器,通过按键控制选择段端按键音和存储音乐的选择播放。程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux21c ISPORT(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 ISBEGINPROCESS(k_code,toneindex,key)BEGINIF key=0 TH

42、EN 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 所示。车辆与动力工程学院课程设计说明书17图

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

44、one_tab1 分频预置数查表模块的仿真结果(2)模块功能分析与调试Tone_tab1 分频预置数模块的功能是输出各个音符所对应的分频预置数,车辆与动力工程学院课程设计说明书18由上面的仿真波形图可看到若当 index 是“0000” ,tone 输出为 0,即休止符的分频预置数;当 index 是“0101” 时, tone 输出为 1432 即低音 4 的分频预置数;当index 是“1111”时, tone 输出为 478 即高音 1 的分频预置数等等其它状态时,tone 分别输出相应音符的分频预置数,仿真波形图证明了程序实现了模块的功能。 2.3.2 Speakera 音乐符数控分频

45、模块的仿真(1)波形仿真:将所编写的音乐符数控分频模块 Speakera 的程序设为工程进行仿真,仿真结果如图 2-8 所示。图 2-8 Speakera 音乐符数控分频模块的仿真结果(2)模块功能分析与调试Speakera 音乐符数控分频此模块的功能是根据初始值 Tone 的值,对输入时钟信号 Clk 的频率进行分频,得到想要的音符的发声频率其时钟(Clk )端输入的是在十六进制模块里对 12MHz 的信号进行 12 分频得到的 1MHz,1M Hz的信号根据分频预置数模块中所提供的计数初值,分别得出相应音符频率的两倍值。此时从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动

46、扬声器,需另加一个 D 触发器以均衡其占空比,这时的频率就变为原来的 1/2,刚好就是相应音符的频率。在 clk 端输入一具有较高频率的信号(这车辆与动力工程学院课程设计说明书19里是 12MHz)的信号,通过分频后由 cout 输出。这里是对 12MHz 的信号进行12 分频得到 1MHz 的信号。1MHz 的时钟脉冲信号是给数控分频模块提供时钟信号。数控分频模块中对 Clk 输入信号的分频比由 11 位预置数 tone100决定。spkout 的输出频率将决定每一个音符的音调,这样,分频计数器的预置tone100与 spkout 的输出频率就有了对应关系。2.3.3 4X4 矩阵式键盘 K

47、ey_encoder 模块仿真(1)波形仿真:将所编写的 4X4 矩阵式键盘 Key_encoder 模块的程序设为工程,进行仿真,仿真结果如图 2-9 所示。图 2-9 4X4 矩阵式键盘 Key_encoder 模块仿真(2)模块功能分析与调试4X4 矩阵式键盘实现按下一个键对应输出一个音, k_code 中放的是对应音阶索引值,例如 xy 输入为 ED 即化为二进制为 11101101,输出为 0001;输入为 77 即化为二进制为 01110111,输出为 1111。仿真结果完全正确。2.3.4 4 位数据宽度的二选一多路选择器 Mux21c 模块仿真(1)波形仿真:将所编写的 4 位

48、数据宽度的二选一多路选择器 Mux21c 模块程序设为工程,进行仿真,仿真结果如图 2-10车辆与动力工程学院课程设计说明书20图 2-10 4 位数据宽度的二选一多路选择器 Mux21c 模块仿真(2)模块功能分析与调试二选一多路选择器就是实现自动音乐播放和按键输入的切换,当 key 为低电平时,输出的是 k_code,当 key 为高电平时,输出的是 indextone。仿真结果正确。车辆与动力工程学院课程设计说明书21第三章 设计结论本文介绍了基于 FPGA 的音乐演奏系统的设计,设计实现了乐曲自动播放和手动播放的自由切换。本设计经过了整体分析、模块化分析、整体与模块的仿真分析这样三个步骤,描述了其工作原理、设计思路及实现方法,实现了自动演奏以

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报