乐曲硬件演奏电路设计-verilog
电子课程设计EDA课程设计乐曲硬件演奏电路
电子课程设计——乐曲硬件演奏电路设计学院太原科技大学华科学院专业、班级电子信息工程姓名学号指导教师2011年12月目录一、设计任务与要求 (3)二、总框体图 (3)三、选择器件 (4)四、功能模块 (4)一、音乐数据模块 (4)二、音符控制输出模块 (7)3、音符译码模块 (8)4、数控分频器模块 (11)五、分频器模块 (12)六、译码模块 (13)五、整体设计电路图 (15)一、整体电路原理图……………………………15二、管脚分派图……………………………153、电路仿真结果 (15)4、硬件验证 (16)六、设计心得 (17)七、附录 (19)乐曲硬件演奏电路设计一、设计任务与要求:一、实验内容利用可编程逻辑器件FPGA,设计乐曲硬件演奏电路,可自动演奏乐曲。
二、实验要求(1)利用数控分频器设计硬件乐曲演奏电路。
(2)利用给定的音符数据定制ROM“music”。
(3)设计乘法器逻辑框图,并在QuartusII上完成全部设计。
(4)将音乐通过实验箱上的喇叭播放出来。
(5)与演奏发音相对应的简谱码输出在数码管上显示。
二、整体框图设计思路:C调音阶频率表:同的预置数即可发出不同频率的声音。
由此,可以以此为设计基础。
设计一功能模块,能够将乐曲中的音符一一以对应的频率以预置数的形式置入数控分频计中,即可利用该数控分频计产生不同的声音,演奏出设定好的音乐。
ROM 中的音乐数据文件刚可由编辑好的音符填入MIF 文件中再定制LPM_ROM 将音符数据加载入ROM 中,并设计程序在运行时自动读取ROM 中的文件并置入数控分频器中。
当采用四四拍曲子时,每节拍持续时间为秒。
置入数控分频器的速度也应与此同步或一致,避免音乐过快或过快慢而失真。
由已知的C 调音阶频率表,各频率对应的预置数就与数控分频推动蜂鸣器发作声音的频率对应。
在编写数控分频器时,不仅要考虑预置数的输入方式,还要考虑输入的速度,和驱动蜂鸣器发声的频率。
梁祝基于-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完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
Verilog HDL课程设计-多路选择器设计与乐曲硬件演奏电路设计
Verilog HDL课程设计(多路选择器设计与乐曲硬件演奏电路设计)目录1.绪论 (1)1.1 EDA介绍 (1)1.2 FPGA介绍 (1)1.3 Verilog HDL硬件描述语言 (2)1.3.1 Verilog HDL硬件描述语言介绍 (2)1.3.2 Verilog HDL功能 (2)1.4. Quartus II 9.0介绍 (3)1.4.1 Quartus II 9.0安装 (3)1.4.2 Quartus II 9.0破解 (5)2.多路选择器的设计 (6)2.1设计要求 (6)2.2设计原理框图 (6)2.3硬件原理图 (7)2.4程序设计 (7)2.5.仿真结果 (8)2.6.引脚锁定如下 (8)2.7.分析报告 (9)3.乐曲硬件演奏电路设计 (9)3.1设计要求 (9)3.2设计原理 (9)3.3设计原理框图 (9)3.4硬件原理图 (10)3.4程序设计 (10)3.5.仿真结果及分析 (11)5.论文总结 (122)参考文献 (13)1.绪论1.1 EDA介绍EDA电子设计自动化是Electronic Design Automation的简称,从20世纪60年代中期发展开始至今,已经取得了飞跃性的进步,在电子技术设计领域,可编程逻辑器件(如CPLD、FPGA)的应用,已经非常普及,这些可编程逻辑器件为数字系统的设计带来了相当大的灵活性。
这些器件可以通过软件编程而对其硬件结构和工作方式进行重构和改变,这就使得硬件的设计可以如同软件设计那样方便快捷效率高,可编程逻辑器件加快了EDA技术的发展,在现代社会,尤其是电子信息科技行业发展突飞猛进,在化工、机械、电子、通信、医学、航空航天、矿产、生物、军事等各个领域都有EDA的广泛应用,相信在为了社会EDA 技术会发展的更加发达。
1.2 FPGA介绍FPGA是Field-Programmable Gate Array的简称,即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。
基于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)的概念发展而来。
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课程设计题目:乐曲硬件演奏电路的VHDL设计专业:通信工程班级:通信071姓名:葛鹏学号:0710920101一、设计题目:乐曲硬件演奏电路的VHDL设计二、设计目标:了解一般乐曲演奏电路设计设计方法,学习VHDL语言,熟悉EDA设计软件QuartusII和MAX+plusⅡ,加强独立完成电子设计的能力。
(1)能够播放“梁祝”乐曲。
(2)能够通过LED显示音阶。
(3)(选作)具有“播放/停止”功能,并在此基础上实现“按键演奏”的电子琴功能。
主芯片型号为FLEX10K10LC84-4三、实验电路的工作原理:(演奏电路逻辑图)组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能够连续演奏所需的两个基本要素,设计演奏电路的关键就是获得这两个要素所对应的数值以及通过纯硬件的手段来利用这些数值实现所希望乐曲的演奏效果。
演奏电路逻辑图有三部分:音乐节拍和音调发生器、简谱码对应的分频预置数查表电路、数控分频与演奏发生器。
演奏电路逻辑图:四、设计内容:1.完成程序的编辑工作。
2.将音乐数据制作成LMP_ROM文件.3.将程序加载到MAX+plusⅡ中进行编译、仿真,并保存仿真结果。
4.到实验室进行下载验证。
引脚进行锁定,然后下载到实验芯片中观察实验结果。
五、仿真结果:1.音乐节拍和音调发生器(NoteTabs.VHD)notetabs模块中设置了一个8位二进制计数器(计数最大值138),作为音符数据ROM的地址发生器。
这个计数器的计数频率选为4Hz,即每一个计数值的停留时间为0.25秒,恰为当全音符设为1秒时,四四拍的4分音符持续时间。
随着notetabs模块中的计数器按4Hz的时钟速率作为加法计数时,即随地址值递增时,音符数据ROM中的音符数据将从ROM中通过ToneIndex[3..0]端口输向ToneTaba模块,“梁祝”乐曲就开始连续自然的演奏起来了。
Notetabs模块仿真图:2.简谱码对应的分频预置数查表电路(ToneTaba.VHD)音符的持续时间需根据乐曲的速度及每个音符的节拍数来确定,tonetaba模块的功能首先是为speakera提供决定所发音符的预置数,而此数在speakera输入口停留的时间即为此音符的节拍值。
EDA课程设计——乐曲硬件演奏电路资料
«电子技术基础皿》项目设计报告课程名称____________________________任课教师____________________________设计题目乐曲硬件演奏电路设计班级姓名学号成绩日期题目分析1■设计要求利用FPGA,设计一硬件乐曲硬件演奏电路,能够利用硬件电路,自动播放音乐。
2■题目分析乐曲是由一连串的音符组成,而每个音符的发音频率值及其持续时间是乐曲能连续演奏所需的两个基本因素。
所以,设计音乐发生电路,需要得到相应音符的频率值,及其持续时间。
如果能够得到这两个基本元素,利用程序来控制FPGA 某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。
所以,获取这两个要素是本实验的关键。
(1) 频率值频率的高低决定了音调的高低。
由于乐曲都是由一连串的音符组成,因此按照乐曲的乐谱,依次输出这些音符相对应的频率,就可以在蜂鸣器上连续地发出各个音符的音调。
简谱的音名与频率的关系如下表:表1简谱中的音名与频率的关系这次设计中所演奏的乐曲的最短的音符为四分音符,如果将全音符的持续时间设为1s 的话,那么一拍所应该持续的时间为0.25秒,则只需要再提供一个4Hz 的时钟频率即可产生四分音符的时长。
系统工作时就按4Hz的频率依次读取简谱,当系统读到某个音符的简谱时就对应发这个音符的音调,持续时间为0.25秒,如果在曲谱文件中某个音符为三拍音长,只要将该音符连续书写三遍,系统读乐曲文件的时候就会连续读到三次,也就会发三个0.25秒的音长,这时我们听上去就会持续了三拍的时间,这样就可以控制音乐的音长了。
二、设计方案1■顶层实体描述音乐播放器,是能够演奏一曲完整的乐曲,在外部时钟的作用下,产生相应频率的方波信号,即在乐曲中对应相应的音符。
并且信号要持续一定的时间,即对应乐曲中的节拍。
得到了音调和节拍后,就可以组成相应的乐曲了。
138个音符,所以此计Music 模块存放乐曲的音符数据。
乐曲硬件演奏电路设计-verilog
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简谱中的音名与频率的关系所有不同频率的信号都是从同一个基准频率分频得到的。
由于音阶频率多为非整数,而分频系数又不能为小数,故必须将计算得到的分频数四舍五入取整。
乐曲硬件演奏电路设计
湖南人文科技学院课程设计报告课程名称: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课程设计-乐曲硬件演奏电路设计
课程设计名称:乐曲硬件演奏电路设计一、设计要求:利用数控分频器设计硬件乐曲演奏电路二、所用设备:计算机、MaxplusⅡ、下载实验箱(ZY11EDA13BE)三、设计原理:主系统由三个模块组成,其内部有三个功能模块:TONETABA.VHD、NOTABS.VHD和SPEAKERA.VHD。
本设计项目作为“梁祝”乐曲演奏电路的实现。
①组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需的两个基本要素,问题是如何来获取这两个要素所对应的数值以及通过纯硬件的手段来利用这些数值实现所希望乐曲的演奏效果音符的频率由U3---Speakera获得,这是一个数控分频器。
由其时钟信号输入端clk输入一具有较高频率(这里是12MHz)的信号,通过Speakera 分频后由SPKOUT输出,由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,但这时的频率将是原来的1/2。
Speakera对clk输入信号的分频比由11位预置数Tone[10...0]决定。
SPKOUT的输出频率将决定每一音符的音调,这样分频计数器的预置值Tone[10...0]与SPKOUT的输出频率就有了对应关系。
例如在ToneTaba模块中若取Tone[10...0]=1036,将发出音符为“3”音的信号频率。
②音符的持续时间需根据乐曲的速度及每个音符的接拍数来确定,模块ToneTaba的功能首先是为Speakera提供决定所发音符的分频预置数,而此数在Speakera输入口停留的时间即为此音符的节拍值。
模块ToneTaba是乐曲简谱码对应的分频预置数查表电路,其中设置了“梁祝”乐曲全部音符所对应的分频预置数,共13个,每一音符的停留时间由音乐节拍和音调发生器模块NoteTabs 的clk的输入频率决定,在此为4Hz。
这13个值的输出由对应于ToneTaba的4位输入值Index[3...0]确定,而Index[3...0]最多有16种可选值。
EDA课程设计——乐曲硬件演奏电路
《电子技术基础Ⅲ》项目设计报告课程名称任课教师设计题目乐曲硬件演奏电路设计班级姓名学号成绩日期一、题目分析1.设计要求利用FPGA,设计一硬件乐曲硬件演奏电路,能够利用硬件电路,自动播放音乐。
2.题目分析乐曲是由一连串的音符组成,而每个音符的发音频率值及其持续时间是乐曲能连续演奏所需的两个基本因素。
所以,设计音乐发生电路,需要得到相应音符的频率值,及其持续时间。
如果能够得到这两个基本元素,利用程序来控制FPGA 某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。
所以,获取这两个要素是本实验的关键。
(1)频率值频率的高低决定了音调的高低。
由于乐曲都是由一连串的音符组成,因此按照乐曲的乐谱,依次输出这些音符相对应的频率,就可以在蜂鸣器上连续地发出各个音符的音调。
简谱的音名与频率的关系如下表:表1 简谱中的音名与频率的关系(2)时长这次设计中所演奏的乐曲的最短的音符为四分音符,如果将全音符的持续时间设为1s的话,那么一拍所应该持续的时间为0.25秒,则只需要再提供一个4Hz 的时钟频率即可产生四分音符的时长。
系统工作时就按4Hz的频率依次读取简谱,当系统读到某个音符的简谱时就对应发这个音符的音调,持续时间为0.25秒,如果在曲谱文件中某个音符为三拍音长,只要将该音符连续书写三遍,系统读乐曲文件的时候就会连续读到三次,也就会发三个0.25秒的音长,这时我们听上去就会持续了三拍的时间,这样就可以控制音乐的音长了。
二、设计方案1.顶层实体描述音乐播放器,是能够演奏一曲完整的乐曲,在外部时钟的作用下,产生相应频率的方波信号,即在乐曲中对应相应的音符。
并且信号要持续一定的时间,即对应乐曲中的节拍。
得到了音调和节拍后,就可以组成相应的乐曲了。
2.模块划分采用“自顶向下”的设计方法,将音乐播放器模块主要划分为地址发生模块、数控分频模块、music 模块和预置数模块。
(1)地址发生模块:增地址计数器,用于产生地址数。
学士学位论文—-电子琴实验报告乐曲硬件演奏电路设计
武夷学院实验报告课程名称:逻辑设计与FPGA 项目名称:乐曲硬件演奏电路设计姓名:专业:微电子学班级: 14微电子学号: 04 实验日期实验预习成绩(百分制)实验指导教师签字:二、 实验过程记录部分:1.实验过程记录:1.1 输入信号锁相环PLL0调节: 图2.1 锁相环 管脚clk_50m (设置为B12)接入FPGA 内部的50mhz 的时钟信号,C0口为得到数控分屏器模块的输入时钟750KHZ ,将分频比设置为1/67,即50000000HZ/67=74.6K约等于75K ;c1口为2KHZ (配合下级的500分频模块),设置为:c1=50000000HZ/25000=2KHZ 。
1.2 500分频模块count500(即500进制的计数器):图2.2 分频电路程序设计 如图2.2,因为梁祝歌曲只用低音和中音来演奏,为1/4拍,即四分之一拍,每个音符持续0.25秒的时间。
因为前级电路已经实现了从50MHZ 到2KHZ 的转换,要得到4HZ 的频率,则用500进制的计数器(0到499的计数)产生的进位信号对2KHZ 实现500分频(输出波形分析见后)。
1.3 乐曲长度控制计数器cnt138设计:图2.3 乐曲长度控制计数器程序及元件图经查阅《EDA技术实用教程(第五版)》可知,《梁祝》这首歌曲总共有139个音符,其中包含末尾的3个休止符。
如图2.3,因此为了产生这139音符,因此想到开发一个139进制的计数器(计数值:0到138),实现用139状态代表139个音符。
又因为要配合下一级音符谱码存储模块的输入(ROM的输入一般为偶数位),因此将原本用7路线就可以表示完成的输出端cnt8增加一位线宽。
注:在本程序中,输出端cnt8由于定义成integer整型,在Quartus中被自动分配成了7根;也可以定义成vector型,而此时需要注意配合下级电路的权位最好写成cnt8: out std_logic_vector(7 downto 0).1.4 音符谱码存储模块设计构建:1.4.1 ROM的设置:图2.4 音符谱码存储模块ROM音符谱码存储模的主体构想,是为了让前级模块所产生的139个状态与实际音符(Do Re Mi Fa So La Si)构成映射。
乐曲演奏硬件电路设计报告
乐曲硬件演奏电路设计一、设计任务要求在EDA开发平台上利用VHDL语言设计数控分频器电路,利用数控分频的原理设计乐曲硬件演奏电路,并定制LPM-ROM存储音乐数据,以古典名曲“梁祝”乐曲为例,将音乐数据存储到LPM-ROM,就达到了以纯硬件的手段来实现乐曲的演奏效果。
与利用微处理器来实现乐曲演奏相比,一纯硬件完成乐曲演奏电路的逻辑要复杂得多,如果不借助于功能强大的EDA工具和硬件描述语言,仅凭传统的数字逻辑技术,即使最简单的演奏电路也难以实现。
二、系统设计总述系统设计由以下五个部分组成,分别是乐曲演奏电路基本原理,音符频率的获得,乐曲节奏的控制,乐谱发生器,乐曲演奏电路总体设计流程这五个部分。
乐曲演奏电路基本原理硬件电路的发声原理是,因为声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA芯片某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。
乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。
乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在扬声器上连续地发出各个音符的音调。
不过要准确地演奏出一首乐曲,仅仅让扬声器能够发生还是不够的,还必须准确地控制乐曲的演奏节奏,就是指乐曲能够连续演奏的两个关键因素:乐曲中每个音符的发声频率及其持续时间。
音符频率的获得多个不同频率的信号可通过对某个基准频率进行分频获得。
由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。
若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。
若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。
实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。
本设计中选取750KHz的基准频率。
由于现有的高频时钟脉冲信号的频率为12MHz,故需先对其进行16分频,才能获得750KHz的基准频率。
- 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模块modulediv_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=1499999])else begin cnt=0; clk_4hz =! clk_4hz; endendmodule4、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模块modulediv_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,me d,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;elsedivider<=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"{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;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"{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;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://中音"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"{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://中音"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;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;endcase endend endmodule8、disp:显示模块,每位输出转换为七段数码管显示。