周祥音乐演奏系统_第1页
周祥音乐演奏系统_第2页
周祥音乐演奏系统_第3页
周祥音乐演奏系统_第4页
周祥音乐演奏系统_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

车辆与动力工程学院课程设计说明书 I 音乐演奏系统 摘 要 音乐演奏系统目前得到广泛应用 实现方法也有许多种 但随着 FPGA 集 成度的提高 价格下降 EDA 设计工具更新换代 功能日益普及与流行 使运 用 EDA 技术设计该系统的方案的应用越来越多 因为 FPGA 预装了很多已构 造好的参数化库单元 LPM 器件 通过引入支持 LPM 的 EDA 软件工具 设计 者可以设计出结构独立而且硅片的使用效率非常高的产品 本次课程设计在 EDA 开发工具 QuartusII 9 1 平台上利用 VHDL 语言设计 4X4 矩阵式键盘电路 Key encoder 自动音乐播放控制电路 NoteTabs 数控分 频器电路 Tone Tab1 二选一数据选择电路 Mux21c 音节频率产生电路 Speakera 利用数控分频的原理设计实现手动按键输入和自动播放功能的音乐 演奏系统电路 并通过定制 LPM ROM 存储音乐数据 以 两只蝴蝶 乐曲为例 将音乐数据存储到 LPM ROM 就达到了以纯硬件的手段来实现乐曲的演奏效 果 要想实现其他乐曲的演奏效果 只要修改 LPM ROM 所存储的音乐数据 将其换成其他乐曲的音乐数据 再重新定制 LPM ROM 连接到程序中就可以 实现其它乐曲的演奏 基于 FPGA 芯片的设计方法能够使设计者有更多机会充 分发挥创造性思维 实现多种复杂数字逻辑系统的功能 因此基于上述同一原 理 可设置不同按键对应不同的音符 实现手动按键输入 达到电子琴的功能 提高了设计的灵活性和可扩展性 经过对整体进行模块化分析 编程 综合 仿真及最终下载 完整实现简易音乐器的播放功能 关键字字 EDA VHDL 数控分频 FPGA 音乐演奏系统 车辆与动力工程学院课程设计说明书 II 目录 第一章 绪论 1 1 1 设计目的和任务要求 1 1 1 1 设计目的 1 1 1 2 设计任务要求 1 1 2 EDA 技术 1 1 3 VHDL 语言 2 1 4 FPGA 简介 2 第二章 总体设计 4 2 1 音乐演奏系统组成 4 2 1 1 音乐演奏系统电路基本原理 4 2 1 2 音符频率的得到 5 2 1 3 自动播放乐曲节奏控制 5 2 1 4 乐谱发生器 6 2 1 5 4 4 矩阵式键盘 6 2 1 6 音乐演奏电路总体设计 6 2 2 总体程序设计 7 2 2 1 顶层模块 VHDL 程序 7 2 2 2 单元模块设计 9 2 2 3 4X4 矩阵式键盘 Key encoder VHDL 程序设计 9 2 2 4 自动乐曲播放模块 NoteTabs VHDL 程序设计 10 2 2 5 定制音符数据的 ROM 文件 11 2 2 6 音乐谱对应分频预置数查表电路 Tone tab1 VHDL 程序设计 12 2 2 7 Speakera 音乐符数控分频模块 VHDL 程序设计 14 2 2 8 4 位数据宽度的二选一多路选择器 Mux21c VHDL 程序设计 15 2 3 VHDL 音乐演奏系统仿真与调试 16 2 3 1 自动乐曲播放模块 NoteTabs 的仿真 16 2 3 2 音乐谱对应分频预置数查表电路 Tone tab1 模块的仿真 17 2 3 2 Speakera 音乐符数控分频模块的仿真 17 2 3 3 4X4 矩阵式键盘 Key encoder 模块仿真 18 2 3 4 4 位数据宽度的二选一多路选择器 Mux21c 模块仿真 19 第三章 设计结论 21 第四章 心得体会 22 参考文献 23 车辆与动力工程学院课程设计说明书 1 第一章 绪论 1 1 设计目的和任务要求 1 1 1 设计目的 进一步巩固理论知识 培养所学理论知识在实际中的应用能力 掌握 EDA 设计的一般方法 熟悉一种 EDA 软件 掌握一般 EDA 系统的调试方法 利用 EDA 软件设计一个电子技术综合问题 培养 VHDL 编程 书写技术报告的能力 为以后进行工程实际问题的研究打下设计基础 1 1 2 设计任务要求 本次设计要求利用 4 4 矩阵式键盘作为电子琴按键输入 用 FPGA 设计一 个既可以区分不同音高和音阶进行乐曲的演奏 又可以自动播放乐曲的电子琴 要求掌握乐曲的发声原理 掌握 4 4 键盘以及音频功放模块的原理及编程控制 下载并测试电路功能 分析芯片资源的占用情况 1 2 EDA 技术 EDA 技术即电子设计自动化技术 它是以可编程逻辑器件 PLD 为载体 以硬件描述语言 HDL 为主要的描述方式 以 EDA 软件为主要的开发软件的电 子设计过程 它主要采用 自顶向下 的设计方法 设计流程主要包括 设计输 入 综合 仿真 适配 下载 EDA 技术主要有以下特征 1 高层综合的理论和方法取得进展 从而将 EDA 设计层次由 RT 级提高 到了系统级 并推出了相应的系统级综合优化工具 大大缩短了复杂 ASIC 的 设计周期 2 采用硬件描述语言来描述 10 万门以上的设计 并形成了 VHDL 和 车辆与动力工程学院课程设计说明书 2 Verilog HDL 两种标准硬件描述语言 3 采用平面规划技术对逻辑综合和物理版图设计联合管理 做到在逻辑设 计综合早期阶段就考虑到物理设计信息的影响 4 为带有嵌入式 IP 核的 ASIC 设计提供软 硬件协同设计工具 5 建立并行设计工具框架结构的集成化设计环境 以适应当今 ASIC 规 模大而复杂 数字与模拟电路并存 硬件与软件设计并存 产品上市速度快等 特点 1 3 VHDL 语言 VHDL 是一种硬件描述语言 它可以对电子电路和系统的行为进行描述 基于这种描述 结合相关的软件工具 可以得到所期望的实际电路与系统 VHDL 程序结构包括 实体 Entity 结构体 Architecture 配置 Configuration 包集合 Package 及库 Library 其中 实体是一个 VHDL 程序 的基本单元 由实体说明和结构体两部分组成 实体说明用于描述设计系统的 外部接口信号 结构体用于描述系统的行为 系统数据的流程或系统组织结构 形式 配置用语从库中选取所需的单元来组成系统设计的不同规格的不同版本 使被设计系统的功能发生变化 包集合存放各设计模块能共享的数据类型 常 数 子程序等 库用于存放已编译的实体 构造体 包集合及配置 一种是用 户自己开发的工程软件 另一种是制造商提供的库 关于 VHDL 最后要说明的是 与常规的顺序执行的计算机程序不同 VHDL 从根本上讲是并发执行的 在 VHDL 中 只有在进程 PROCESS 函数 FUNCTION 和过程 PROCEDURE 内部的语句才是顺序执行的 1 4 FPGA 简介 FPGA 是现场可编程门阵列的简称 FPGA 在结构上主要分为三个部分 即可编程逻辑单元 可编程输入 输出单元和可编程连线三个部分 高集成度 高速度和高可靠性是 FPGA 最明显的特点 于 FPGA 的集成规模非常大 可利 车辆与动力工程学院课程设计说明书 3 用先进的 EDA 工具进行电子系统设计和产品开发 由于开发工具的通用性 设计语言的标准化以及设计过程几乎与所用器件 的硬件结构没有关系 因而设计开发成功的各类逻辑功能块软件有很好的兼容 性和可移植性 FPGA 掉电后将丢失原有的逻辑信息 所以在实用中需要为 FPGA 芯片配 置一个专用 ROM 车辆与动力工程学院课程设计说明书 4 第二章 总体设计 2 1 音乐演奏系统组成 自动播放 Notetabs 选择器 mux21c 按键输入 key encoder 分频器 tone tab1 音节频率产生 speakera 发出音乐 spkout 图 2 1 音乐演奏系统组成图 该主系统由三个模块 Spiel 顶层文件 Spkout 分频器 自动播放控制 按键 输入音乐 二选一选择器 音阶频率产生电路组成 且 Spiel 顶层文件还包括 4 个子文件分别是 Key encoder NoteTabs ToneTaba 和 Speakera 此外 我们 还需建立一个名为 music 的 LPM ROM 模块和与 NoteTabs 模块连接 2 1 1 音乐演奏系统电路基本原理 硬件电路的发声原理 声音的频谱范围约在几十到几千赫兹 利用程序来 控制 FPGA 芯片某个引脚输出一定频率的矩形波 接上扬声器就能发出相应频 率的声音 乐曲中的每一音符对应着一个确定的频率 要想 FPGA 发出不同音 符的音调 实际上只要控制它输出相应音符的频率即可 乐曲都是由一连串的 音符组成 因此按照乐曲的乐谱依次输出这些音符所对应的频率 就可以在扬 声器上连续地发出各个音符的音调 而要准确地演奏出一首乐曲 仅仅让扬声 器能够发生是不够的 还必须准确地控制乐曲的节奏 即乐曲中每个音符的发 生频率及其持续时间是乐曲能够连续演奏的两个关键因素 车辆与动力工程学院课程设计说明书 5 2 1 2 音符频率的得到 多个不同频率的信号可通过对某个基准频率进行分频器获得 由于各个音 符的频率多为非整数 而分频系数又不能为小数 故必须将计算机得到的分频 系数四舍五入取整 若基准频率过低 则分频系数过小 四舍五入取整后的误 差较大 若基准频率过高 虽然可以减少频率的相对误差 但分频结构将变大 实际上应该综合考虑这两个方面的因素 在尽量减少误差的前提下 选取合适 的基准频率 本设计中选取 1MHz 的基准频率 由于现有的高频时钟脉冲信号 的频率为 12MHz 故需先对其进行 12 分频 才能获得 1MHz 的基准频率 对 基准频率分频后的输出信号是一些脉宽极窄的尖脉冲信号 占空比 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 低音 6440低音 6880高音 61760 低音 7493 88低音 7987 76高音 71975 52 2 1 3 自动播放乐曲节奏控制 本设计以 两只蝴蝶 为例 最小的节拍为 1 4 拍 若将 1 拍的时间定为 0 5 秒 则只需要提供一个 8Hz 的时钟频率即可产生 1 4 拍的时长 0 125 秒 对 于其它占用时间较长的节拍 必为 1 4 拍的整数倍 则只需要将该音符连续输 出相应的次数即可 车辆与动力工程学院课程设计说明书 6 计数时钟信号作为输出音符快慢的控制信号 时钟快时输出节拍速度就快 演奏的速度也就快 时钟慢时输出节拍的速度就慢 演奏的速度自然降低 2 1 4 乐谱发生器 本设计将乐谱中的音符数据存储在 LPM ROM 中 如 两只蝴蝶 乐曲中的 第一个音符为 3 此音在逻辑中停留了 4 个时钟节拍 即 0 5 秒的时间 相应 地 音符 3 就要在 LPM ROM 中连续的四个地址上都存储 当一个 8Hz 的时 钟来时 相应地就从 LPM ROM 中输出一个音符数据 2 1 5 4 4 矩阵式键盘 在数字系统中 用二进制代码表示特定信息的过程称为编码 能完成编码 的电路称为编码器 十六进制编码键盘是一个 4 4 的矩阵结构 用 x3 x0 和 y3 y0 等八条信号线接受十六个键的信息 X 3 0 是行信息输入端 Y 3 0 是列 信息输入端 没有按下键时 信号线呈高电平 有按下键时 相应信号线呈低 电平 例如 当 0 键按下时 x3x2x1x0 1110 y3y2y1y0 1110 编码器输出 k code 3 0 0 当 1 按下时 x3x2x1x0 1110 y3y2y1y0 1101 k code 3 0 1 依此类推 2 1 6 音乐演奏电路总体设计 组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需 的两个基本要素 问题是如何来获取这两个要素所对应的数值以及通过纯硬件 的手段来利用这些数值实现所希望乐曲的演奏效果 如图 2 1 模块 NoteTabs 类 似于音乐播放器 Key encoder 类似于电子琴键 Speakera 类似于琴弦或音调发 声器 音符的频率可以由图 2 1 中的 Speakera 获得 这是一个数控分频器 由其 clk 端输入一具有较频率 这里是 12MHz 的信号 通过 Speakera 分频后由 Spkout 输出 由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信 号 为了有利于驱动扬声器 需另加一个 D 触发器以均衡其占空比 但这时的 频率将是原来的 1 2 Speakera 对 clk 输入信号的分频比由 11 位预置数 车辆与动力工程学院课程设计说明书 7 Tone 10 0 决定 Spkout 的输出频率将决定每一音符的音调 这样 分频计数 器的预置值 Tone 10 0 与 Spkout 的输出频率 就有了对应关系 音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定 图 2 1 中 模块 Tone tab1 的功能首先是为 Speakera 提供决定所发音符的分频预置数 而 此数在 Speakera 输入口停留的时间即为此音符的节拍值 输向 Tone tab1 中 Index 3 0 的值 ToneIndex 3 0 和 K code 3 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 程序 程序如下 LIBRARY ieee USE ieee std logic 1164 all 车辆与动力工程学院课程设计说明书 8 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 notetabs PORT clk IN STD LOGIC toneindex OUT STD LOGIC VECTOR 3 DOWNTO 0 END COMPONENT COMPONENT mux21c PORT 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 tab1 PORT index IN STD LOGIC VECTOR 3 DOWNTO 0 tone OUT STD LOGIC VECTOR 10 DOWNTO 0 END COMPONENT COMPONENT key encoder PORT 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 DOWNTO 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 notetabs PORT MAP clk clk8hz toneindex SYNTHESIZED WIRE 1 b2v inst4 mux21c PORT MAP key key k code SYNTHESIZED WIRE 0 toneindex SYNTHESIZED WIRE 1 index SYNTHESIZED WIRE 2 车辆与动力工程学院课程设计说明书 9 b2v inst5 tone tab1 PORT MAP index SYNTHESIZED WIRE 2 tone SYNTHESIZED WIRE 3 b2v inst6 speakera PORT MAP clk clK12mhz tone SYNTHESIZED WIRE 3 spks spk out b2v inst7 key encoder PORT MAP x x1 y y1 k code SYNTHESIZED WIRE 0 END bdf type 顶层设计按自顶向下的设计方法进行 首先通过自动音乐播放控制 notetabs 模块和 4X4 矩阵式键盘 key encoder 模块产生对应音节所对应的索引 值 然后通过二选一多路选择器 mux21c 模块实现手动和自动的切换 把对应音 节的索引值送到数控分频 tone tab1 模块产生用于分频的分频系数 利用分频 系数 通过音节频产生 speakera 模块进行分频 产生音节发声所需的频率 接 到蜂鸣器既可以发出音乐 2 2 2 单元模块设计 根据顶层原理图 共分为 key encoder 模块 notetabs 模块 mux21c 模块 tone tab1 模块 speakera 模块这五个模块 music 模块存放乐曲中的音符数据 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 LOGIC 1164 ALL 车辆与动力工程学院课程设计说明书 10 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 IS BEGIN PROCESS x y VARIABLE xy STD LOGIC VECTOR 7 DOWNTO 0 BEGIN XY x CASE xy IS WHEN 11101110 k codek codek codek codek codek codek codek codek codek codek codek codek codek codek codek codek code 0000 END CASE END PROCESS END one 该段程序用于按键输入电子琴键盘 按下一个键响一个音 分别设定对应 为休止符 低音 1 到高音 1 X 3 0 是行信息输入端 Y 3 0 是列信息输入端 没有按下键时 信号线呈高电平 有按下键时 相应信号线呈低电平 例如 当 0 键按下时 x3x2x1x0 1110 y3y2y1y0 1110 编码器输出 k code 3 0 0000 当 1 按下时 x3x2x1x0 1110 y3y2y1y0 1101 k code 3 0 0001 依 此类推 2 2 4 自动乐曲播放模块 NoteTabs VHDL 程序设计 音乐的播放就是通过外部 8Hz 时钟驱动 内部以计数器进行计数 产生地 车辆与动力工程学院课程设计说明书 11 址 送到 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 DOWNTO 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 ELSIF clk EVENT 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 拍的整数倍 则需将这个音符存储 在相应次数的连续几个地址上 即随地址递增时 将从音符数据 ROM 中将连续 取出 4 个音符 3 通过 toneindex 3 0 端口输向分频预置数模块 这样 两只蝴蝶 乐曲中的音符就一个接一个的通过 toneindex 3 0 端口输向分频预置数模块 然 车辆与动力工程学院课程设计说明书 12 后对音符数据进行 ROM 定制 最后对定制好的 ROM 文件进行测试和仿真 ROM 定制的基本步骤如下 1 进入 QuartusII 选菜单 TOOL megawizard 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 定制 ROM 初始化文件 music mif 车辆与动力工程学院课程设计说明书 13 2 2 6 音乐谱对应分频预置数查表电路 Tone tab1 VHDL 程序设计 各音符的分频系数就是从 1MHz 的基准频率二分频得到的 500KHz 频率基础上 计算得到的 由于最大分频系数是 1911 故分频器采用 11 位二进制计数器能 满足要求 乐曲中的休止符 只要将分频系数设为 0 表 2 5 音阶 频率 预置分频系数的对应关系 音阶频率 预置分 频系数 二进制音阶频率 预置分 频系数 二进制 低 1 261 6 3 1911 11101110 111 中 2587 33851 011010 10011 低 2 293 6 7 1703 11010100 111 中 3659 25758 010111 10110 低 3 329 6 3 1520 10111110 000 中 4698 46716 010110 01100 低 4 349 2 3 1432 10110011 000 中 5783 99638 010011 11110 低 5 391 9 9 1276 10011111 100 中 6880568 010001 11000 低 64401136 10001110 000 中 7987 76506 001111 11010 低 7 493 8 8 1012 01110111 100 高 11046 5478 001110 11110 中 1 523 2 5 956 01110111 100 000 000000 00000 在这个模块的 VHDL 逻辑描述中设置了 两只蝴蝶 全部音符所对应的分频 预置数 共 16 个 每一音符的停留时间由音乐节拍和地址发生器模块的时钟 Clk 的输入频率决定 在此为 8Hz 这 16 个值的输出由程序的 4 位输入值 index 3 0 确定 输向分频预置数模块的程序中 index 3 0 的值又由地址发生器 模块的输出 toneindex 3 0 的输出值和持续时间决定 程序如下 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 车辆与动力工程学院课程设计说明书 14 BEGIN CASE index IS WHEN 0000 tonetonetonetonetonetonetonetonetonetonetonetonetonetonetonetoneNULL 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 程序设计 音阶产生电路在获取上面的音阶索引值对应的分频系数后 通过可控计数 器进行分频 分频器电路中 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 车辆与动力工程学院课程设计说明书 15 spks OUT STD LOGIC END ARCHITECTURE six OF speakera IS SIGNAL preclk fullspks STD LOGIC BEGIN divideclk PROCESS clk VARIABLE count4 STD LOGIC VECTOR 3 DOWNTO 0 BEGIN PRECLK11 THEN PRECLK 1 COUNT4 0000 ELSIF CLK EVENT 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 PRECLK EVENT AND PRECLK 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 FULLSPKS EVENT AND FULLSPKS 1 THEN COUNT2 NOT COUNT2 IF COUNT2 1 THEN SPKS 1 ELSE SPKS 0 END IF END IF END PROCESS END 在该 VHDL 描述程序中 进程 dicideclk 将外部时钟进行预分频 即 12 分 频 因此外部输入的时钟信号如果为 12MHZ 则经过此分频后得到 1MHZ 的 信号 因为表 2 2 的个音节的分频系数是以 1MHZ 外部时钟信号为前提的 这 样在移植程序时 可根据硬件条件调整此分频系数 保证获得 1MHZ 时钟信号 系数即可 车辆与动力工程学院课程设计说明书 16 进程 GENSPKS 的作用是根据预置数的不同 产生 2 倍音阶信号 因为此 信号的脉冲宽度极小 1 个 Preclk 周期 所以需要调整占空比才使外部驱动电 路提供足够的驱动蜂鸣器的功率 2 2 8 4 位数据宽度的二选一多路选择器 Mux21c VHDL 程序设计 为了实现自动音乐播放和按键输入电子琴功能切换 本例设置了一个二选 一多路选择器 通过按键控制选择段端按键音和存储音乐的选择播放 程序如 下 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 BEGIN 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 所示 车辆与动力工程学院课程设计说明书 17 图 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 Tone tab1 分频预置数查表模块的仿真结果 2 模块功能分析与调试 Tone tab1 分频预置数模块的功能是输出各个音符所对应的分频预置数 车辆与动力工程学院课程设计说明书 18 由上面的仿真波形图可看到若当 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 音乐符数控分频模块的仿真结果 2 模块功能分析与调试 Speakera 音乐符数控分频此模块的功能是根据初始值 Tone 的值 对输入 时钟信号 Clk 的频率进行分频 得到想要的音符的发声频率其时钟 Clk 端输 入的是在十六进制模块里对 12MHz 的信号进行 12 分频得到的 1MHz 1MHz 的信号根据分频预置数模块中所提供的计数初值 分别得出相应音符频率的两 倍值 此时从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号 为了有 利于驱动扬声器 需另加一个 D 触发器以均衡其占空比 这时的频率就变为原 来的 1 2 刚好就是相应音符的频率 在 clk 端输入一具有较高频率的信号 这 车辆与动力工程学院课程设计说明书 19 里是 12MHz 的信号 通过分频后由 cout 输出 这里是对 12MHz 的信号进行 12 分频得到 1MHz 的信号 1MHz 的时钟脉冲信号是给数控分频模块提供时钟 信号 数控分频模块中对 Clk 输入信号的分频比由 11 位预置数 tone 10 0 决定 spkout 的输出频率将决定每一个音符的音调 这样 分频计数器的预置 tone 10 0 与 spkout 的输出频率就有了对应关系 2 3 3 4X4 矩阵式键盘 Key encoder 模块仿真 1 波形仿真 将所编写的 4X4 矩阵式键盘 Key encoder 模块的程序设为 工程 进行仿真 仿真结果如图

温馨提示

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

评论

0/150

提交评论