乐曲硬件演奏电路设计_verilog
EDA课程设计---乐曲硬件演奏电路的VHDL设计
EDA课程设计题目:乐曲硬件演奏电路的VHDL设计一、 设计题目:乐曲硬件演奏电路的VHDL 设计二、 设计目标:1)能够播放“梁祝”乐曲。
2)能够通过LED 显示音阶。
3)具有“播放/停止”功能,并在此基础上实现“按键演奏”的电子琴功能。
三、 设计原理:1. 音乐基础知识一段简单乐谱由音调和节拍组成,音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。
音符的节拍我们可以举例来说明。
在一张乐谱中,我们经常会看到这样的表达式,如1=C 44、1=G 43……等等。
以43为例加以说明,它表示乐谱中以四分音符为节拍,每一小结有三拍。
比如:图1其中1 、2 为一拍,3、4、5为一拍,6为一拍共三拍。
1 、2的时长为四分音符的一半,即为八分音符长,3、4的时长为八分音符的一半,即为十六分音符长,5的时长为四分音符的一半,即为八分音符长,6的时长为四分音符长。
那么一拍到底该唱多长呢?一般说来,如果乐曲没有特殊说明,一拍的时长大约为400—500ms 。
我们以一拍的时长为400ms为例,则当以四分音符为节拍时,四分音符的时长就为400ms,八分音符的时长就为200ms,十六分音符的时长就为100ms。
2.原理图框图:图2.框图3.原理图说明音乐播放原理说明音符的频率由数控分频器模块Speakera产生。
ToneTaba模块从NoteTabs模块中输入的音符数据,将对应的分频预置数据传送给Speakera模块,并将音符数据送到LED模块显示音阶。
NoteTabs模块中包含有一个音符数据ROM,里面存有歌曲“梁祝”的全部音调,在此模块中设置了一个8位二进制计数器,作为音符数据ROM的地址发生器。
这个计数器的计数频率为4Hz,即每一个数值的停留时间为0.25秒。
例如:“梁祝”乐曲的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒钟时间,所对应的“3”音符分频预置数为1036,在Speakera的输入端停留了1秒。
基于Verilog HDL的简易电子琴控制电路设计与实现
基于Verilog HDL的简易电子琴控制电路设计与实现
张皓祎;郑冰;卢炽杏;郑惠之;胡锦程
【期刊名称】《电子制作》
【年(卷),期】2024(32)2
【摘要】介绍了一种基于硬件描述语言(Verilog HDL)的简易电子琴控制电路设计,在系统可编程门阵列(FPGA)芯片上实现,可实现自动演奏预存乐曲、弹奏及音符码制显示等常用功能。
该设计采用自顶向下的模块化设计,基于硬件描述语言(Verilog HDL)编程实现。
根据产生各个音符的频率不同,通过将系统的基准频率通过分频器进行分频,得到曲谱中所有音符的频率,再由驱动电路驱动蜂鸣器发声,便可实现乐曲的弹奏或播放功能,用八段数码管显示弹奏或播放音符对应的数字。
该方法设计简单、修改方便、设计周期短。
通过FPGA验证了所设计的控制电路,并完成了简易电子琴的调试及制作。
【总页数】4页(P94-97)
【作者】张皓祎;郑冰;卢炽杏;郑惠之;胡锦程
【作者单位】航天工程大学信息学院
【正文语种】中文
【中图分类】TP3
【相关文献】
1.基于Verilog HDL的逻辑分析仪电路设计
2.基于Verilog HDL的CMOS图像敏感器驱动电路设计
3.基于Verilog HDL的LED显示屏扫描控制模块的实现
4.基于FPGA的简易电子琴控制电路设计
5.基于Verilog HDL的洗衣机控制电路设计
因版权原因,仅展示原文概要,查看原文内容请购买。
乐曲硬件演奏电路设计
目录目录 0前言: (1)1.题目分析 (1)1.1 功能要求 (1)1.2 性能指标 (1)2.设计方案 (2)2.1顶层实体描述 (2)2.2模块划分 (3)2.3模块描述 (3)2.3.1 Speakera模块 (3)2.3.2 ToneTaba模块 (3)2.3.3 NoteTabs模块 (4)2.4顶层电路图 (5)3.方案实现 (5)3.1 NoteTabs模块仿真及描述 (5)3.2 ToneTaba模块仿真及描述 (5)3.3 Speakera模块仿真及描述 (6)3.4顶层电路仿真及描述 (6)4.硬件测试及说明 (6)5.结论 (7)6.课程总结 (7)7.附录 (8)前言:这次设计实验我做的是乐曲硬件演奏电路设计,通过在系统编程技术课程的学习,我已经学会了用VHDL语言来实现系统要求的电路设计。
VHDL语言具有良好的电路行为描述和系统描述的能力,用VHDL语言进行电子系统的设计非常方便和实用,而基于VHDL的自顶向下的设计方法是其很大的一个优点。
1.题目分析1.1 功能要求(1)播放歌曲(2)简谱码输出显示在数码管显示(3)通过LED灯显示音阶1.2 性能指标(1)乐曲硬件演奏电路的基本原理乐曲都是由一连串的音符组成,每一音符对应着一个确定的频率,按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在扬声器上连续地发出各个音符的音调。
我们知道,组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需的两个基本要素,所以,掌握好一首歌曲的节奏,就能完整地演奏出来。
(2)音符频率和乐曲节奏多个不同频率的信号可通过对某个基准频率进行分频器获得,本设计中选取750KHz的基准频率,由于clk端输入的是较高频率12MHz信号,可以对其进行16分频。
计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低。
电子课程设计 EDA课程设计 乐曲硬件演奏电路
电子课程设计——乐曲硬件演奏电路设计学院太原科技大学华科学院专业、班级电子信息工程姓名学号指导教师2011年12月目录一、设计任务与要求 (3)二、总框体图 (3)三、选择器件 (4)四、功能模块 (4)1、音乐数据模块 (4)2、音符控制输出模块 (7)3、音符译码模块 (8)4、数控分频器模块 (11)5、分频器模块 (12)6、译码模块 (13)五、总体设计电路图 (15)1、总体电路原理图 (15)2、管脚分配图 (15)3、电路仿真结果 (15)4、硬件验证 (16)六、设计心得 (17)七、附录 (19)乐曲硬件演奏电路设计一、设计任务与要求:1、实验内容利用可编程逻辑器件FPGA,设计乐曲硬件演奏电路,可自动演奏乐曲。
2、实验要求(1)利用数控分频器设计硬件乐曲演奏电路。
(2)利用给定的音符数据定制ROM“music”。
(3)设计乘法器逻辑框图,并在QuartusII上完成全部设计。
(4)将音乐通过实验箱上的喇叭播放出来。
(5)与演奏发音相对应的简谱码输出在数码管上显示。
二、总体框图设计思路:C调音阶频率表:同的预置数即可发出不同频率的声音。
由此,可以以此为设计基础。
设计一功能模块,能够将乐曲中的音符逐一以对应的频率以预置数的形式置入数控分频计中,即可利用该数控分频计产生不同的声音,演奏出设定好的音乐。
ROM中的音乐数据文件刚可由编辑好的音符填入MIF文件中再定制LPM_ROM将音符数据加载入ROM中,并设计程序在运行时自动读取ROM中的文件并置入数控分频器中。
当采用四四拍曲子时,每节拍持续时间为0.5秒。
置入数控分频器的速度也应与此同步或一致,避免音乐过快或过快慢而失真。
由已知的C调音阶频率表,各频率对应的预置数就与数控分频推动蜂鸣器发出声音的频率对应。
在编写数控分频器时,不仅要考虑预置数的输入方式,还要考虑输入的速度,以及驱动蜂鸣器发声的频率。
为了显示高音音调,可在音符预置数的译码过程中,同时译出高音音阶的信号,并利用LED灯输出信号。
梁祝基于-VerilogHDL的演奏设计
设计题目:“梁祝乐曲发生器”一、设计任务及要求:利用EDA/SOPC实验开发平台提供的16*16点阵LED以及EP2C35核心板,实现“梁祝”乐曲发生器。
1、查阅相关资料,明确设计步骤;2、采用Verilog HDL编程语言设计程序;3、能够按照设定节拍(每拍持续1s)顺畅的播放“梁祝”乐曲并且听着基本无错;4、扩张要求:自主设计(如快放、倒放、换歌等)。
二、设计原理及方案乐曲播放器的基本原理是,一个音符对应一个频率信号。
频率的高低决定了音调的高低。
音乐的十二个平均率规定:每两个八度音之间的频率相差一倍。
在两个八度音之间又可以分为十二个半音,每两个半音的频率比为2.另外,音名A(简谱中的低音6)的频率为440HZ,音名B到C之间、E到F之间为半音,其余为全音。
由此可以计算出简谱中从低音1至高音1之间每个音名对应的频率,;利用高低音如下关系可得下表:低8度音:基本音频率/2 ,例如低音1的频率为523/2=261.5;高8度音:基本音频率×2,例如高音1的频率为523×2=1046音符与频率的对应关系如下各音阶频率对应的分频比及预置数对于乐曲中的休止符,只要将分频系数设为0,即初始值为1047,此时扬声器不发音。
从上表中可以看出,最大分频系数为1912,所以采用11位二进制计数器分频可满足需要。
对于不同的分频系数,只要加载不同的预置数即可。
采用加载预置数实现分频的方法比采用反馈复零法节约资源,实现起来也容易一些。
音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定。
本设计中将全音的持续时间设为1s,提供的4Hz的时钟频率即可产生四分音符的时长。
控制音长通过控制计数器预置数的停留时间来实现的,预置数停留的时间越长,则该音符演奏的时间也就越长。
每个音符的演奏时间都是0.25s的整数倍,对于节拍较长的音符,如二分音符,在记谱时将该音名联系记录两次即可。
对照以上规则可编制乐谱的程序。
EDA实验报告5_乐曲硬件演奏电路设计
EDA技术与应用实验报告姓名学号专业年级电子信息工程实验题目乐曲硬件演奏电路设计实验目的1.学习利用数控分频器设计硬件乐曲演奏电路2.掌握模块化和层次化的设计方法以及音符编码的设计思想实验原理1.一定频率的矩形波通过扬声器可以发出相应频率的声音,乐曲是由一系列的音符组成的。
所以,如果我们通过控制每个音符的发音频率值及其持续的时间,就可以以纯硬件的手段,利用这些数值来实现所希望演奏的乐曲。
2.该硬件演奏电路由三个模块构成<1>音符数据ROM的地址发生器模块NoteTabs.vhdl内置8位二进制计数器,作为ROM的地址发生器,计数频率4Hz,即每一计数值的停留时间为0.25s,恰为全音符设为1s时,四四拍的4音符持续时间。
随着NoteTabs中的计数器按4Hz的时钟速率作加法计数即地址值递增时,ROM中的音符数据将通过ToneIndex[3..0]输向ToneTaba模块,乐曲即开始演奏起来。
<2>乐曲简谱码对应的分频预置数查表电路模块ToneTaba.vhdlToneTaba为Speakera提供决定所发音符的分频预置数,此数在Speakera输入口停留的时间即为此音符的节拍值。
输入Index[3..0]可确定乐曲全部音符所对应的分频预置数(13个)每一音符的停留时间由NoteTabs模块的clk决定(4Hz)。
<3>决定每一个音符音调的数控分频器模块Speakera.vhdl输入端clk输入一较高频率(12MHz)的信号,经Speakera分频,再经2分频以展宽脉冲后,由SpkOut输出。
11位预置数Tone[10..0]决定由clk输入信号的分频比,SpkOut输出的频率决定每一音符的音调。
实验内容1.定制存放LPM-ROM模块Music,在连续地址上存放乐曲的音符数据,2.用vhdl文本输入法和元件例化语句完成NoteTabs.vhdl的设计,该模块包含音符数据ROM模块Music.vhdl3.完成ToneTaba.vhdl的设计,此模块给数控分频模块提供每个音符所对应的分频预置数,即计数初值4.完成Speakera.vhdl的设计,该模块是一个初值可变的加法计数器。
Verilog_HDL—乐曲演奏电路设计
文理学院Verilog HDL乐曲演奏电路设计专业:自动化学号:2012118064:一天虹影设计目的与要求1.课程设计目的:1)加深对EDA技术的理解,掌握乐曲演奏电路的工作原理2)了解怎样控制音调的高低变化和音长,从而完成乐曲的自动循环演奏。
3)培养自主学习、正确分析和解决问题的能力2.课程设计要求:1)使用Verilog HDL设计乐曲演奏电路,系统实现是用硬件描述语言Verilog HDL按分频控制的方式进行设计,然后进行编程、时序仿真、电路功能验证,奏出美妙的乐曲。
2) 通过控制输出到扬声器的激励信号频率的高低和持续的时间,从而使扬声器发出连续的乐曲声,且当乐曲演奏完成时,保证能自动从头开始演奏。
3.该方案可以实现的功能:1)通过蜂鸣器播放音乐;2)通过三位动态数码管输出相应的高中低音符;3)通过一个开关实现两首乐曲的切换;4)在音乐播放的同时,会有led流水灯的闪烁.应用工具介绍作为当今最流行的计算机软件系统,EDA技术是以计算机为工作平台,融合了应用电子技术、计算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动设计。
EDA 可提供文本输入以及图形编辑的方法将设计者的意图用程序或者图形方式表达出来,而我们经常用到的VHDL语言便是用于编写源程序所需的最常见的硬件描述语言(HDL)之一。
2.1 EDA技术介绍EDA是电子设计自动化(Electronic Design Automation)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来。
EDA技术是在电子CAD技术基础上发展起来的计算机软件系统,是指以计算机为工作平台,融合了应用电子技术、计算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动设计[1]。
EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
硬件乐曲自动演奏电路设计.
SOPC/EDA综合课程设计报告设计题目:硬件乐曲自动演奏电路设计设计者:学号:班级:指导老师:王忠锋完成时间:2012年01月6日目录前言 (3)乐曲硬件演奏电路EDA设计 (4)1.设计要求 (4)2.设计方案 (4)3.原理描述 (5)3.1 音名与频率的关系 (5)3.2 控制音长的节拍发生器 (7)4.乐曲硬件演奏电路的层次化设计方案 (7)4.1 音乐节拍发生器NoteTabs (7)4.2 音符译码电路Tonetaba模块 (15)4.3数控分频模块(speaker)设计 (18)4.4乐曲硬件演奏电路顶层电路的设计和仿真 (21)5.实验总结与心得 (24)6.参考文献 (25)前言乐曲演奏广泛用于自动答录装置、手机铃声、集团电话、及智能仪器仪表设备。
实现方法有许多种,随着FPGA集成度的提高,价格下降,EDA设计工具更新换代,功能日益普及与流行,使这种方案的应用越来越多。
如今的数字逻辑设计者面临日益缩短的上市时间的压力,不得不进行上万门的设计,同时设计者不允许以牺牲硅的效率达到保持结构的独特性。
使用现今的EDA软件工具来应付这些问题,并不是一件简单的事情。
FPGA预装了很多已构造好的参数化库单元LPM 器件。
通过引入支持LPM的EDA软件工具,设计者可以设计出结构独立而且硅片的使用效率非常高的产品。
本课设在EDA开发平台上利用VHDL语言设计数控分频器电路,利用数控分频的原理设计乐曲硬件演奏电路,以“欢乐颂”乐曲为例,将音乐数据存储到音乐节拍器中,就达到了以纯硬件的手段来实现乐曲的演奏效果。
只要修改音乐节拍器所存储的音乐数据,将其换成其他乐曲的音乐数据,连接到程序中就可以实现其它乐曲的演奏。
关键词:FPGA;EDA;VHDL;音乐乐曲硬件演奏电路EDA 设计1.设计要求利用可编程逻辑器件FPGA ,设计一个乐曲硬件演奏电路。
由键盘输入控制音响,同时可自动演奏乐曲。
演奏时可选择键盘输入乐曲或者已存入的乐曲,并配以一个小扬声器。
EDA课程设计——乐曲硬件演奏电路资料
《电子技术基础Ⅲ》项目设计报告课程名称任课教师设计题目乐曲硬件演奏电路设计班级姓名学号成绩日期一、题目分析1.设计要求利用FPGA,设计一硬件乐曲硬件演奏电路,能够利用硬件电路,自动播放音乐。
2.题目分析乐曲是由一连串的音符组成,而每个音符的发音频率值及其持续时间是乐曲能连续演奏所需的两个基本因素。
所以,设计音乐发生电路,需要得到相应音符的频率值,及其持续时间。
如果能够得到这两个基本元素,利用程序来控制FPGA 某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。
所以,获取这两个要素是本实验的关键。
(1)频率值频率的高低决定了音调的高低。
由于乐曲都是由一连串的音符组成,因此按照乐曲的乐谱,依次输出这些音符相对应的频率,就可以在蜂鸣器上连续地发出各个音符的音调。
简谱的音名与频率的关系如下表:表1 简谱中的音名与频率的关系(2)时长这次设计中所演奏的乐曲的最短的音符为四分音符,如果将全音符的持续时间设为1s的话,那么一拍所应该持续的时间为0.25秒,则只需要再提供一个4Hz 的时钟频率即可产生四分音符的时长。
系统工作时就按4Hz的频率依次读取简谱,当系统读到某个音符的简谱时就对应发这个音符的音调,持续时间为0.25秒,如果在曲谱文件中某个音符为三拍音长,只要将该音符连续书写三遍,系统读乐曲文件的时候就会连续读到三次,也就会发三个0.25秒的音长,这时我们听上去就会持续了三拍的时间,这样就可以控制音乐的音长了。
二、设计方案1.顶层实体描述音乐播放器,是能够演奏一曲完整的乐曲,在外部时钟的作用下,产生相应频率的方波信号,即在乐曲中对应相应的音符。
并且信号要持续一定的时间,即对应乐曲中的节拍。
得到了音调和节拍后,就可以组成相应的乐曲了。
2.模块划分采用“自顶向下”的设计方法,将音乐播放器模块主要划分为地址发生模块、数控分频模块、music模块和预置数模块。
(1)地址发生模块:增地址计数器,用于产生地址数。
基于Verilog_HDL的乐曲演奏电路设计
1 引言随着EDA技术的进展,基于可编程的数字电子系统设计的完整方案越来越受到人们的重视。
与利用微处理器(CPU或MCU)来实现乐曲演奏相比,以纯硬件完成乐曲演奏电路的逻辑要复杂得多,如果不借助于功能强大的EDA工具和硬件描述语言,仅凭传统的数字逻辑技术,即使最简单的演奏电路也难以实现。
如何使用EDA工具设计电子系统是人们普遍关心的问题。
本课程设计主要是采用FPGA器件驱动小扬声器构成一个乐曲演奏电路,FPGA器件选择Altera的EPF10K10,在MAX + plusⅡ的EDA软件平台上,实现了乐曲演奏电路的设计。
1.1 课程设计的目的本课程设计主要是基于Verilog HDL设计乐曲演奏电路,系统实现是用硬件描述语言Verilog HDL按分频控制的方式进行设计,然后进行编程、时序仿真、电路功能验证,奏出美妙的乐曲。
该设计的目的在于加深对EDA技术的理解,掌握乐曲演奏电路的工作原理,了解怎样控制音调的高低变化和音长,从而完成乐曲的自动循环演奏。
1.2 课程设计的要求本课程设计中由于每一个音调对应不同的频率,从而输出对应频率的声音。
因此本设计要求通过控制输出到扬声器的激励信号频率的高低和持续的时间,从而使扬声器发出连续的乐曲声,且当乐曲演奏完成时,保证能自动从头开始演奏。
1.3 设计平台MAX + plusⅡ是美国Altera 公司的一种EDA 软件,用于开发CPLD 和FPGA 进行数字系统的设计。
2 应用工具介绍作为当今最流行的计算机软件系统,EDA技术是以计算机为工作平台,融合了应用电子技术、计算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动设计。
EDA可提供文本输入以及图形编辑的方法将设计者的意图用程序或者图形方式表达出来,而我们经常用到的VHDL语言便是用于编写源程序所需的最常见的硬件描述语言(HDL)之一。
2.1 EDA技术介绍EDA是电子设计自动化(Electronic Design Automation)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来。
verilog hdl 简易乐曲设计
指导教师:日期:EDA技术课程设计题目: EDA技术及其应用——简易电子琴设计姓名:院系:电子信息工程学系专业:通信工程班级: 091班级学号:指导教师:2012年1 月EDA技术课程设计报告——简易电子琴的设计(电子信息工程学系指导教师:)摘要在现代的电子设计中,EDA技术已经成为一种普遍的工具,它在电子信息、通信、自动控制用计算机等领域的重要性日益突出。
本课程设计主要采用EDA技术设计一个简易的八音符电子琴,它采用EDA作为开发工具,Verilog HDL 语言为硬件描述语言,MAX + PLUS II作为程序运行平台,所开发的程序通过调试运行、波形仿真验证,初步实现了设计目标。
本程序使用的硬件描述语言Verilog HDL,既能进行面向综合的电路设计,又可用于电路的模拟仿真,能够在多层次上对所设计的系统加以描述,易学易用,语言功能强。
关键词课程设计;EDA;Verilog HDL;电子琴1.课程设计的目的系统实现是用硬件描述语言verilog按模块化方式进行设计,然后进行编程、时序仿真、电路功能验证,奏出美妙的乐曲。
巩固和运用所学课程,理论联系实际,提高分析、解决计算机技术实际问题的独立工作能力,通过对一个简易的八音符电子琴的设计,进一步加深对计算机原理以及数字电路应用技术方面的了解与认识,进一步熟悉数字电路系统设计、制作与调试的方法和步骤。
巩固所学课堂知识,理论联系实际,提高分析、解决计算机技术实际问题的独立工作能力。
2.课程设计的要求(1)设计一个简易的八音符电子琴,它可通过按键输入来控制音响。
(2)演奏时可以选择是手动演奏(由键盘输入)还是自动演奏已存入的乐曲。
(3)能够自动演奏多首乐曲,且每首乐曲可重复演奏。
3. EDA技术EDA是电子设计自动化(Electronic Design Automation)缩写,是90年代初从CAD(计算机辅助设计)、CAM(计算机辅助制造)、CAT(计算机辅助测试)和CAE(计算机辅助工程)的概念发展而来的。
verilogHDL的电子琴设计
河海大学计算机与信息学院(常州)课程设计报告题目电子琴设计专业/学号电科/**********授课班号278605学生姓名马东林指导教师单鸣雷完成时间2014/01/07河海大学本科课程设计报告课程设计(报告)任务书(理工科类)Ⅰ、课程设计(报告)题目:电子琴设计Ⅱ、课程设计(论文)工作内容用FPGA器件驱动蜂鸣器演奏“茉莉花”片段。
一首乐曲包含三个要素:乐曲声音频率,发音时间的长短,停顿的时间。
按照图1乐谱,设计相应电路控制speaker信号的方波频率,某一频率持续时间长短,各频率间间隔大小,就可以推动蜂鸣器演奏乐曲。
图1 茉莉花简谱一、课程设计目标1、培养综合运用知识和独立开展实践创新的能力;2、培养学生独立编写verilog hdl 程序的能力,加深对课本知识的理解。
二、研究方法及手段应用1、将任务分成若干模块,查阅相关论文资料,分模块调试和完成任务;2、两人一组合作分工完成程序的编写和调试。
三、课程设计预期效果1、完成实验环境搭建;2、完成程序的编写和调试;3、能在实验平台上顺利演示效果用蜂鸣器播放一首音乐,并可以按键弹奏;4、锻炼学生的独立分析程序,解决问题的能力以及掌握verilog hdl 的实际应用。
学生姓名:马东林专业年级:电科/2011摘 要乐曲演奏广泛用于自动答录装置、手机铃声、集团电话及智能仪器仪表设备。
实现方法有许多种,在众多的实现方法中,以纯硬件完成乐曲演奏,随着FPGA 集成度的提高,价格下降,EDA 设计工具更新换代,功能日益普及与流行,使这种方案的应用越来越多。
FPGA 预装了很多已构造好的参数化库单元LPM 器件,通过引入支持LPM 的EDA 软件工具,设计者可以设计出结构独立而且硅片的使用效率非常高的产品。
本设计由现场可编程门矩阵(FPGA )作为控制芯片,通过VreilogHDL 硬件描述语言设计,运用自顶而下的设计思想,按功能逐层分割实现层次化的设计。
总体设计方案为先用分频电路产生不同频率方波;再利用利用数控分频器实现speaker 输出信号频率的选择,某一频率持续时间长短,各频率间间隔大小,其中方波的频率决定了音调的高低。
乐曲硬件演奏电路设计
湖南人文科技学院课程设计报告课程名称:VHDL语言与EDA课程设计设计题目:乐曲硬件演奏电路设计系别:通信与控制工程系专业:电子信息工程班级:09电信学生姓名:学号:起止日期:2012年06月13日~2012年06月22日指导教师:教研室主任:指导教师评语:指导教师签名:年月日成绩评定项目权重成绩1、设计过程中出勤、学习态度等方面0.22、课程设计质量与答辩0.53、设计报告书写及图纸规范程度0.3总成绩教研室审核意见:教研室主任签字:年月日教学系审核意见:主任签字:年月日摘要乐曲演奏广泛用于自动答录装置、手机铃声、集团电话、及智能仪器仪表设备。
实现方法有许多种,随着FPGA集成度的提高,价格下降,EDA设计工具更新换代,功能日益普及与流行,使这种方案的应用越来越多。
如今的数字逻辑设计者面临日益缩短的上市时间的压力,不得不进行上万门的设计,同时设计者不允许以牺牲硅的效率达到保持结构的独特性。
使用现今的EDA软件工具来应付这些问题,并不是一件简单的事情。
FPGA预装了很多已构造好的参数化库单元LPM器件。
通过引入支持LPM的EDA软件工具,设计者可以设计出结构独立而且硅片的使用效率非常高的产品。
本课设在EDA开发平台上利用VHDL语言设计数控分频器电路,利用数控分频的原理设计乐曲硬件演奏电路,并定制LPM-ROM存储音乐数据,以“挥着翅膀的女孩”,“菊花台”,“两只老虎”,“世上只有妈妈好”等四首乐曲为例,将音乐数据存储到LPM-ROM,就达到了以纯硬件的手段来实现四首不同乐曲的演奏效果。
要想实现其他乐曲的演奏效果,只要修改LPM-ROM所存储的音乐数据,将其换成其他乐曲的音乐数据,再重新定制LPM-ROM,连接到程序中就可以实现其它乐曲的演奏。
关键词:FPGA;EDA;VHDL;音乐目录设计要求 (1)1、方案论证与对比 (1)1.1方案一 (1)1.2方案二 (2)1.3综合对比 (2)2、乐曲演奏电路原理 (2)2.1 乐曲演奏电路原理框图 (2)2.2 音符频率的获取 (3)2.3 乐曲节奏的控制 (3)2.4 乐谱发生器 (4)2.5 乐曲演奏电路原理图 (4)3、音乐硬件演奏电路的设计实现 (5)3.1 地址发生器模块的VHDL语言设计 (5)3.2 分频预置数模块的VHDL语言设计 (8)3.3 数控分频模块的VHDL语言设计 (10)3.4 music模块 (12)3.4.1 音符数据文件 (13)3.4.2 LPM-ROM定制 (13)3.5 顶层文件 (14)4、时序仿真及下载调试过程 (16)4.1 时序仿真图 (16)4.2 引脚锁定以及下载 (17)4.3调试过程及结果 (17)设计总结与心得体会 (18)参考文献 (19)乐曲硬件演奏电路设计设计要求能够播放音乐,通过按键控制音乐的播放暂停。
EDA课程设计——乐曲硬件演奏电路
《电子技术基础Ⅲ》项目设计报告课程名称任课教师设计题目乐曲硬件演奏电路设计班级姓名学号成绩日期一、题目分析1.设计要求利用FPGA,设计一硬件乐曲硬件演奏电路,能够利用硬件电路,自动播放音乐。
2.题目分析乐曲是由一连串的音符组成,而每个音符的发音频率值及其持续时间是乐曲能连续演奏所需的两个基本因素。
所以,设计音乐发生电路,需要得到相应音符的频率值,及其持续时间。
如果能够得到这两个基本元素,利用程序来控制FPGA 某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。
所以,获取这两个要素是本实验的关键。
(1)频率值频率的高低决定了音调的高低。
由于乐曲都是由一连串的音符组成,因此按照乐曲的乐谱,依次输出这些音符相对应的频率,就可以在蜂鸣器上连续地发出各个音符的音调。
简谱的音名与频率的关系如下表:表1 简谱中的音名与频率的关系(2)时长这次设计中所演奏的乐曲的最短的音符为四分音符,如果将全音符的持续时间设为1s的话,那么一拍所应该持续的时间为0.25秒,则只需要再提供一个4Hz 的时钟频率即可产生四分音符的时长。
系统工作时就按4Hz的频率依次读取简谱,当系统读到某个音符的简谱时就对应发这个音符的音调,持续时间为0.25秒,如果在曲谱文件中某个音符为三拍音长,只要将该音符连续书写三遍,系统读乐曲文件的时候就会连续读到三次,也就会发三个0.25秒的音长,这时我们听上去就会持续了三拍的时间,这样就可以控制音乐的音长了。
二、设计方案1.顶层实体描述音乐播放器,是能够演奏一曲完整的乐曲,在外部时钟的作用下,产生相应频率的方波信号,即在乐曲中对应相应的音符。
并且信号要持续一定的时间,即对应乐曲中的节拍。
得到了音调和节拍后,就可以组成相应的乐曲了。
2.模块划分采用“自顶向下”的设计方法,将音乐播放器模块主要划分为地址发生模块、数控分频模块、music 模块和预置数模块。
(1)地址发生模块:增地址计数器,用于产生地址数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EDA技术及创新实践(设计报告)题目: 乐曲硬件演奏电路设计姓名: 漩涡鸣人学院: 数理与信息工程学院专业: 电子科学与技术班级: 112 学号: 1886****20 ****: ***2014年6 月一、设计目的及要求实验目的:1、理解音乐演奏的原理及分频器的原理与使用。
2、了解怎样控制音调的高低变化和音长,从而完成乐曲的自动循环演奏。
3、培养自主学习、正确分析和解决问题的能力。
要求:利用分频器设计硬件乐曲演奏电路;能通过数码管显示动态效果;通过一个开关实现两首乐曲的切换;在音乐播放的同时,会有led流水灯的闪烁。
二、设计原理乐曲演奏的原理是这样的:组成乐曲的每个音符的频率值(音调)及其持续的时间(音长)是乐曲能连续演奏所需的两个基本数据,因此只要控制输出到扬声器的激励信号频率的高低和持续的时间,就可以使扬声器发出连续的乐曲声。
图1、顶层模块图其中,乐谱产生电路用来控制音乐的音调和音长。
控制音调通过设置计数器的预置数来实现,预置不同的数值可以使计数器产生不同频率的信号,从而产生不同的音调。
控制音长是通过控制计数器预置数的停留时间来实现的,预置数停留的时间越长,则该音符演奏的时间越长。
每个音符的演奏时间都是0.25s的整数倍,对于节拍较长的音符,如2分音符,在记谱时将该音名连续记录两次即可。
1、音调的控制频率的高低决定了音调的高低。
音乐的十二平均率规定:每两个8度音(如简谱中的中音1与高音1)之间的频率相差一倍。
在两个8度音之间,又可分为12个半音,每两个半音的频率比为12√2。
另外,音名A(简谱中的低音6)的频率为440Hz,音名B到C之间、E到F之间为半音,其余为全音[4]。
由此可以计算出简谱中从低音1至高音1之间每个音名对应的频率,如表2所示:表2简谱中的音名与频率的关系所有不同频率的信号都是从同一个基准频率分频得到的。
由于音阶频率多为非整数,而分频系数又不能为小数,故必须将计算得到的分频数四舍五入取整。
若基准频率过低,则由于分频比太小,四舍五入取整后的误差较大;若基准频率过高,虽然误差变小,但分频数将变大。
实际的设计综合考虑这两方面的因素,在尽量减小频率误差的前提下取合适的基准频率。
本例中选取6MHz为基准频率。
若无6MHz的基准频率,则可以先分频得到6MHz,或换一个新的基准频率。
实际上,只要各个音名间的相对频率关系不变,演奏出的乐曲听起来都不会"走调"。
本例需要演奏的是梁祝乐曲,该乐曲各音阶频率及相应的分频比如表2所示。
为了减小输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,因此在到达扬声器之前,有一个二分频的分频器。
表2中的分频比就是从6MHz频率二分频得到的3MHz频率基础上计算得出的。
由于最大的分频系数为9102,故采用14位二进制计数器分频可满足需要。
在表2中,除给出了分频比以外,还给出了对应于各个音阶频率时计数器不同的预置数。
对于不同的分频系数,只要加载不同的预置数即可。
采用加载预置数实现分频的方法比采用反馈复零法节省资源,实现起来也容易一些,如表3所示:表3各音阶频率对应的分频比及预置数此外,对于乐曲中的休止符,只要将分频系数设为0,即初始值为2141=16383即可,此时扬声器将不会发声。
音长的控制音符的持续时间必须根据乐曲的速度及每个音符的节拍数来确定。
本例演奏的梁祝片段,最短的音符为4分音符,如果将全音符的持续时间设为1s的话,则只需要再提供一个4Hz的时钟频率即可产生4分音符的时长。
三、底层模块设计由顶层模块图可以看到本方案分成8个模块。
1、48MHz分频成12MHz波形分频器,源代码和顶层模块如下//48mhz分成12mhz的分频模块module div_clk12mhz(clk_48mhz,clk_12mhz);input clk_48mhz;output clk_12mhz;reg clk_12mhz;reg [21:0] cnt;always @(posedge clk_48mhz)if(cnt<1) cnt=cnt+1; // (48mhz/12mhz=4,cnt<[4/2-1=1])else begin cnt=0; clk_12mhz =!clk_12mhz; endendmodule2、12MHz分频成6MHz波形分频器,源代码和顶层模块如下://12mhz分成6mhz的分频模块,提供给song模块module div_clk6mhz(clk_12mhz,clk_6mhz); input clk_12mhz;output clk_6mhz;reg clk_6mhz; reg cnt;always @(posedge clk_12mhz) clk_6mhz=!clk_6mhz; endmodule3、12MHz分频成4Hz波形分频器,源代码和顶层模块如下://12mhz分成4hz的分频模块,提供给song模块module div_clk4hz(clk_12mhz,clk_4hz); input clk_12mhz;output clk_4hz;reg clk_4hz;reg [21:0] cnt; always @(posedge clk_12mhz)if(cnt<1499999) cnt=cnt+1; // (12mhz/4hz=3000000,cnt<[3000000/2-1=149 9999])else begin cnt=0; clk_4hz =! clk_4hz;end endmodule4、12MHz分频成1mhz波形分频器,源代码和顶层模块如下://12mhz分成1mhz的分频模块,提供给quma模块module div_clk1mhz(clk_12mhz,clk_1mhz); input clk_12mhz;output clk_1mhz;reg clk_1mhz;reg [21:0] cnt;always @(posedge clk_12mhz)if(cnt<5) cnt=cnt+1; // (12mhz/1mhz=12,cnt<[12/2-1=5])else begin cnt=0; clk_1mhz =! clk_1mhz; endendmodule5、12MHz分频成1khz波形分频器,源代码和顶层模块如下://12mhz分成1khz的分频模块,提供给quma模块module div_clk1khz(clk_12mhz,clk_1khz); input clk_12mhz;output clk_1khz;reg clk_1khz;reg [21:0] cnt;always @(posedge clk_12mhz) if(cnt<5999) cnt=cnt+1; // (12mhz/1khz=12000,cnt<[12000/2-1=5999])else begin cnt=0; clk_1khz =! clk_1khz; endendmodule6、 song模块源代码和顶层模块如下://音乐产生模块modulesong(clk_6mhz,clk_4hz,speaker,high,med,low ,k);input clk_6mhz,clk_4hz; input k;output speaker;output[3:0] high,med,low; reg[3:0] high,med,low;reg[13:0] divider,origin;reg[9:0] counter;reg speaker;wire carry;assign carry=(divider==16383);always @(posedge clk_6mhz)begin if(carry) divider<=origin;else divider<=divider+1;endalways @(posedge carry)begin speaker<=~speaker;end always @(posedge clk_4hz)begincase({high,med,low})'b000000000011:origin<=7281;//低音3'b000000000101:origin<=8730;//低音5'b000000000110:origin<=9565;//低音6'b000000000111:origin<=10310;//低音7'b000000010000:origin<=10647;//中音1'b000000100000:origin<=11272;//中音2'b000000110000:origin<=11831;//中音3'b000001010000:origin<=12556;//中音5'b000001100000:origin<=12974;//中音6'b000001110000:origin<=13347;//中音7'b000100000000:origin<=13516;//高音1'b000000000000:origin<=16383;//休止符endcaseendalways @(posedge clk_4hz)if (k==0)beginif(counter==149) counter<=0;elsecounter<=counter+1;case(counter)//记谱0: {high,med,low}<='b000000000011; //低音"3"1: {high,med,low}<='b000000000011; //持续4个时钟节拍2: {high,med,low}<='b000000000011;3: {high,med,low}<='b000000000011;4: {high,med,low}<='b000000000101; //低音"5"5: {high,med,low}<='b000000000101; //发3个时钟节拍6: {high,med,low}<='b000000000101;7: {high,med,low}<='b000000000110; //低音"6"8: {high,med,low}<='b000000010000; //中音"1"9: {high,med,low}<='b000000010000; //发3个时钟节拍10: {high,med,low}<='b000000010000;11: {high,med,low}<='b000000100000; //中音"2"12: {high,med,low}<='b000000000110; //低音"6"13: {high,med,low}<='b000000010000; //中音"1"14: {high,med,low}<='b000000000101; //低音"5"15: {high,med,low}<='b000000000101;16: {high,med,low}<='b000001010000; //中音"5"17: {high,med,low}<='b000001010000; //发3个时钟节拍18: {high,med,low}<='b000001010000;19: {high,med,low}<='b000100000000; //高音"1"20: {high,med,low}<='b000001100000; //中音"6"21: {high,med,low}<='b000001010000; //中音"5"22: {high,med,low}<='b000000110000; //中音"3"23: {high,med,low}<='b000001010000; //中音"5"24: {high,med,low}<='b000000100000; //中音"2"25: {high,med,low}<='b000000100000; //持续11个时钟节拍26: {high,med,low}<='b000000100000;27: {high,med,low}<='b000000100000;28: {high,med,low}<='b000000100000;29: {high,med,low}<='b000000100000;30: {high,med,low}<='b000000100000;31: {high,med,low}<='b000000100000;32: {high,med,low}<='b000000100000;33: {high,med,low}<='b000000100000;34: {high,med,low}<='b000000100000;35: {high,med,low}<='b000000110000; //中音"3"36: {high,med,low}<='b000000000111; //低音"7"37: {high,med,low}<='b000000000111;38: {high,med,low}<='b000000000110; //低音"6"39: {high,med,low}<='b000000000110;40: {high,med,low}<='b000000000101; //低音"5"41: {high,med,low}<='b000000000101;42: {high,med,low}<='b000000000101;43: {high,med,low}<='b000000000110; //低音"6"44: {high,med,low}<='b000000010000; //中音"1"45: {high,med,low}<='b000000010000;46: {high,med,low}<='b000000100000; //中音"2"47: {high,med,low}<='b000000100000;48: {high,med,low}<='b000000000011; //低音"3"49: {high,med,low}<='b000000000011;50: {high,med,low}<='b000000010000; //中音"1"51: {high,med,low}<='b000000010000;52: {high,med,low}<='b000000000110; //低音"6"53: {high,med,low}<='b000000000101; //低音"5"54: {high,med,low}<='b000000000110; //低音"6"55: {high,med,low}<='b000000010000; //中音"1"56: {high,med,low}<='b000000000101; //低音"5"57: {high,med,low}<='b000000000101; //持续8个时钟节拍58: {high,med,low}<='b000000000101;59: {high,med,low}<='b000000000101;60: {high,med,low}<='b000000000101;61: {high,med,low}<='b000000000101;62: {high,med,low}<='b000000000101;63: {high,med,low}<='b000000000101;64: {high,med,low}<='b000000110000; //中音"3"65: {high,med,low}<='b000000110000; //发3个时钟节拍66: {high,med,low}<='b000000110000;67: {high,med,low}<='b000001010000; //中音"5"68: {high,med,low}<='b000000000111; //低音"7"69: {high,med,low}<='b000000000111;70: {high,med,low}<='b000000100000; //中音"2"71: {high,med,low}<='b000000100000;72: {high,med,low}<='b000000000110; //低音"6"73: {high,med,low}<='b000000010000; //中音"1"74: {high,med,low}<='b000000000101; //低音"5"75: {high,med,low}<='b000000000101; //持续4个时钟节拍76: {high,med,low}<='b000000000101;77: {high,med,low}<='b000000000101;78: {high,med,low}<='b000000000000; //休止符79: {high,med,low}<='b000000000000;80: {high,med,low}<='b000000000011; //低音"3"81: {high,med,low}<='b000000000101;//低音"5"82: {high,med,low}<='b000000000101;83: {high,med,low}<='b000000000011; //低音"3"84: {high,med,low}<='b000000000101; //低音"5"85: {high,med,low}<='b000000000110; //低音"6"86: {high,med,low}<='b000000000111; //低音"7"87: {high,med,low}<='b000000100000; //中音"2"88: {high,med,low}<='b000000000110; //低音"6"89: {high,med,low}<='b000000000110; //持续6个时钟节拍90: {high,med,low}<='b000000000110;91: {high,med,low}<='b000000000110;92: {high,med,low}<='b000000000110;93: {high,med,low}<='b000000000110;94: {high,med,low}<='b000000000101; //低音"5"95: {high,med,low}<='b000000000110; //低音"6"96: {high,med,low}<='b000000010000; //中音"1"97: {high,med,low}<='b000000010000; //发3个时钟节拍98: {high,med,low}<='b000000010000;99: {high,med,low}<='b000000100000; //中音"2"100: {high,med,low}<='b000001010000; //中音"5"101: {high,med,low}<='b000001010000;102: {high,med,low}<='b000000110000; //中音"3"103: {high,med,low}<='b000000110000;104: {high,med,low}<='b000000100000; //中音"2"105: {high,med,low}<='b000000100000;106: {high,med,low}<='b000000110000; //中音"3"107: {high,med,low}<='b000000100000; //中音"2"108: {high,med,low}<='b000000010000; //中音"1"109: {high,med,low}<='b000000010000;110: {high,med,low}<='b000000000110; //低音"6"111: {high,med,low}<='b000000000101; //低音"5"112: {high,med,low}<='b000000000011; //低音"3"113: {high,med,low}<='b000000000011; //持续4个时钟节拍114: {high,med,low}<='b000000000011;115: {high,med,low}<='b000000000011;116: {high,med,low}<='b000000010000; //中音"1"117: {high,med,low}<='b000000010000; //持续4个时钟节拍118: {high,med,low}<='b000000010000;119: {high,med,low}<='b000000010000;120: {high,med,low}<='b000000000110; //低音"6"121: {high,med,low}<='b000000010000; //中音"1"122: {high,med,low}<='b000000000110; //低音"6"123: {high,med,low}<='b000000000101; //低音"5"124: {high,med,low}<='b000000000011; //低音"3"125: {high,med,low}<='b000000000101; //低音"5"126: {high,med,low}<='b000000000110; //低音"6"127: {high,med,low}<='b000000010000; //中音"1"128: {high,med,low}<='b000000000101; //低音"5"129: {high,med,low}<='b000000000101; //持续6个时钟节拍130: {high,med,low}<='b000000000101;131: {high,med,low}<='b000000000101;132: {high,med,low}<='b000000000101;133: {high,med,low}<='b000000000101;134: {high,med,low}<='b000000110000;//中音"3"135: {high,med,low}<='b000001010000; //中音"5"136: {high,med,low}<='b000000100000; //中音"2"137: {high,med,low}<='b000000110000; //中音"3"138: {high,med,low}<='b000000100000; //中音"2"139: {high,med,low}<='b000000010000; //中音"1"140: {high,med,low}<='b000000000111; //低音"7"141: {high,med,low}<='b000000000111;142: {high,med,low}<='b000000000110; //低音"6"143: {high,med,low}<='b000000000110;144: {high,med,low}<='b000000000101; //低音"5"145: {high,med,low}<='b000000000101; //持续8个时钟节拍146: {high,med,low}<='b000000000101;147: {high,med,low}<='b000000000101;148: {high,med,low}<='b000000000101;149: {high,med,low}<='b000000000101; endcaseendelse if( k==1)beginif(counter==149) counter<=0;//计时,以实现循环演奏elsecounter<=counter+1;case(counter)//记谱0: {high,med,low}<='b000000110000; //中音"3"1: {high,med,low}<='b000000110000; //持续2个时钟节拍2: {high,med,low}<='b000000100000; //中音23: {high,med,low}<='b000000100000; //持续2个时钟节拍4: {high,med,low}<='b000000110000; //中音"3"5: {high,med,low}<='b000000110000; //发10个时钟节拍6: {high,med,low}<='b000000110000;7: {high,med,low}<='b000000110000;8: {high,med,low}<='b000000110000;9: {high,med,low}<='b000000110000;10: {high,med,low}<='b000000110000;11: {high,med,low}<='b000000110000;12: {high,med,low}<='b000000110000;13: {high,med,low}<='b000000110000;14: {high,med,low}<='b000000100000; //中音215: {high,med,low}<='b000000100000; //持续2个时钟节拍16: {high,med,low}<='b000000110000; //中音"3"17: {high,med,low}<='b000000110000; //发2个时钟节拍18: {high,med,low}<='b000000100000; //中音219: {high,med,low}<='b000000100000; //中音220: {high,med,low}<='b000000010000; //中音"1"21: {high,med,low}<='b000000010000;22: {high,med,low}<='b000000010000;23: {high,med,low}<='b000000010000;24: {high,med,low}<='b000000010000;25: {high,med,low}<='b000000010000;26: {high,med,low}<='b000000010000;27: {high,med,low}<='b000000010000;28: {high,med,low}<='b000000010000;29: {high,med,low}<='b000000010000;30: {high,med,low}<='b000000010000;31: {high,med,low}<='b000000010000;32: {high,med,low}<='b000000000110;//低633: {high,med,low}<='b000000000110;34: {high,med,low}<='b000000010000; //中音"1"35: {high,med,low}<='b000000010000;36: {high,med,low}<='b000000100000; //中2 有6个37: {high,med,low}<='b000000100000;38: {high,med,low}<='b000000100000;39: {high,med,low}<='b000000100000;40: {high,med,low}<='b000000100000;41: {high,med,low}<='b000000100000;42: {high,med,low}<='b000000110000; //中音343: {high,med,low}<='b000000110000;44: {high,med,low}<='b000000100000; //中音"2"45: {high,med,low}<='b000000100000;46: {high,med,low}<='b000000010000; //中音"1"47: {high,med,low}<='b000000010000;48: {high,med,low}<='b000000000110; //低音"6"49: {high,med,low}<='b000000000110;50: {high,med,low}<='b000000010000; //中音"1"51: {high,med,low}<='b000000010000;52: {high,med,low}<='b000000000101; //低音"5"53: {high,med,low}<='b000000000101; //低音"5"54: {high,med,low}<='b000000000101;55: {high,med,low}<='b000000000101;56: {high,med,low}<='b000000000101; //低音"5"57: {high,med,low}<='b000000000101;58: {high,med,low}<='b000000000101;59: {high,med,low}<='b000000000101;60: {high,med,low}<='b000000000101;61: {high,med,low}<='b000000000101;62: {high,med,low}<='b000000000101;63: {high,med,low}<='b000000000101;64: {high,med,low}<='b000000000101;65: {high,med,low}<='b000000000101;66: {high,med,low}<='b000000000101;67: {high,med,low}<='b000000000101;68: {high,med,low}<='b000000110000; //中音"3"69: {high,med,low}<='b000000110000;70: {high,med,low}<='b000000100000; //中音"2"71: {high,med,low}<='b000000100000;72: {high,med,low}<='b000000110000; //中音"3"73: {high,med,low}<='b000000110000; //中音"3"74: {high,med,low}<='b000000110000; //中音"3"75: {high,med,low}<='b000000110000; //中音"3"76: {high,med,low}<='b000000110000; //中音"3"77: {high,med,low}<='b000000110000; //中音"3"78: {high,med,low}<='b000000110000; //中音"3"79: {high,med,low}<='b000000110000; //中音"3"80: {high,med,low}<='b000000110000; //中音"3"81: {high,med,low}<='b000000110000; //中音"3"82: {high,med,low}<='b000000100000; //中音"2"83: {high,med,low}<='b000000100000;84: {high,med,low}<='b000000110000; //中音"3"85: {high,med,low}<='b000000110000; //中音"3"86: {high,med,low}<='b000000100000; //中音"2"87: {high,med,low}<='b000000100000; //中音"2"88: {high,med,low}<='b000000010000; //中音"1"89: {high,med,low}<='b000000010000; //中音"1"90: {high,med,low}<='b000000010000; //中音"1"91: {high,med,low}<='b000000010000; //中音"1"92: {high,med,low}<='b000000010000; //中音"1"93: {high,med,low}<='b000000010000; //中音"1"94: {high,med,low}<='b000000010000; //中音"1"95: {high,med,low}<='b000000010000; //中音"1"96: {high,med,low}<='b000000010000; //中音"1"97: {high,med,low}<='b000000010000; //中音"1"98: {high,med,low}<='b000000010000; //中音"1"99: {high,med,low}<='b000000010000; //中音"1"100: {high,med,low}<='b000000010000; //中音"1"101: {high,med,low}<='b000000010000; //中音"1"102: {high,med,low}<='b000000010000; //中音"1"103: {high,med,low}<='b000000010000; //中音"1"104: {high,med,low}<='b000000010000; //中音"1"105: {high,med,low}<='b000000000110; //低音"6"106: {high,med,low}<='b000000000110; //低音"6"107: {high,med,low}<='b000000010000; //中音"1"108: {high,med,low}<='b000000010000; //中音"1"109: {high,med,low}<='b000000100000; //中音"2"110: {high,med,low}<='b000000100000; //中音"2"111: {high,med,low}<='b000000100000; //中音"2"112: {high,med,low}<='b000000100000; //中音"2"113: {high,med,low}<='b000000100000; //中音"2"114: {high,med,low}<='b000000100000; //中音"2"115: {high,med,low}<='b000000110000; //中音3116: {high,med,low}<='b000000110000;117: {high,med,low}<='b000000100000; //中音"2"118: {high,med,low}<='b000000100000;119: {high,med,low}<='b000000010000; //中音"1"120: {high,med,low}<='b000000010000;121: {high,med,low}<='b000000000110; //低音"6"122: {high,med,low}<='b000000000110;123: {high,med,low}<='b000000010000; //中音"1"124: {high,med,low}<='b000000010000;125: {high,med,low}<='b000000100000; //中音"2"126: {high,med,low}<='b000000100000; //中音"2"127: {high,med,low}<='b000000100000; //中音"2"128: {high,med,low}<='b000000100000; //中音"2"129: {high,med,low}<='b000000100000; //中音"2"130: {high,med,low}<='b000000100000; //中音"2"131: {high,med,low}<='b000000100000; //中音"2"132: {high,med,low}<='b000000100000; //中音"2"133: {high,med,low}<='b000000100000; //中音"2"134: {high,med,low}<='b000000100000; //中音"2"135: {high,med,low}<='b000000100000; //中音"2"136: {high,med,low}<='b000000100000; //中音"2"137: {high,med,low}<='b000000100000; //中音"2"138: {high,med,low}<='b000000100000; //中音"2"139: {high,med,low}<='b000000100000; //中音"2"140: {high,med,low}<='b000000100000;//中音"2"141: {high,med,low}<='b000000110000; //中音"3"142: {high,med,low}<='b000000110000; //持续2个时钟节拍143: {high,med,low}<='b000000100000; //中音2144: {high,med,low}<='b000000100000; //持续2个时钟节拍145: {high,med,low}<='b000000110000; //中音"3"146: {high,med,low}<='b000000110000; //发10个时钟节拍147:{high,med,low}<='b000000110000;148:{high,med,low}<='b000000110000;149:{high,med,low}<='b000000110000; endcaseendendmodule //模块结束7、取码模块源代码和顶层模块如下://取码模块,从song模块取得数码管显示部分的位码和段码modulequma(high,med,low,clk_1mhz,dig,duan); input [3:0] high,med,low;input clk_1mhz;reg[7:0] dig;output [7:0]dig;//定义输出八位位码reg [7:0] duan;output [7:0] duan;//定义用于输出的段码的代码always @(posedge clk_1mhz)//扫描high,med,low三个寄存器的值,取出位码和段码的代码beginif (high!=0)begin dig<=8'b11111011;case (high)1:duan<=8'b00000001;2:duan<=8'b00000010;3:duan<=8'b00000011;4:duan<=8'b00000100; 5:duan<=8'b00000101;6:duan<=8'b00000110;7:duan<=8'b00000111;endcaseendelse if (med!=0)// 如果med的值不为0,则只输出med的值begin dig<=8'b11111101;case (med )1:duan<=8'b00000001;2:duan<=8'b00000010;3:duan<=8'b00000011;4:duan<=8'b00000100;5:duan<=8'b00000101;6:duan<=8'b00000110;7:duan<=8'b00000111;endcaseendelse if (low!=0)//如果low的值不为0,则只输出low的值begin dig<=8'b11111110;case (low )1:duan<=8'b00000001; 2:duan<=8'b00000010; 3:duan<=8'b00000011; 4:duan<=8'b00000100; 5:duan<=8'b00000101; 6:duan<=8'b00000110; 7:duan<=8'b00000111; endcaseendendendmodule8、disp:显示模块,每位输出转换为七段数码管显示。