《乐曲硬件演奏电路设计毕业.doc》由会员分享,可在线阅读,更多相关《乐曲硬件演奏电路设计毕业.doc(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流乐曲硬件演奏电路设计毕业.精品文档.电子技术课程设计 乐谱演奏电路设计 学 院:电子工程与电气自动化学院 专业、班级:电子科学与技术(1)班 姓 名: 王志愿 学 号:12021034 指导教师: 常红霞 2014年12月目录一:设计任务要求.2 1:课程设计题目2 2:设计分析2 3:工程设计总述5二:总体框图8三:选择器件9四:功能模块:(模块图形、程序、功能仿真图、功能仿真图分析)9 1:分频器(div)9 2:计数器(notetabs)11 3:选择模块(choice)12 4:数据翻译模块(tontaba)14 5:译码器模块(de
2、led)16 6:数控分频器模块(speakera)17 7:乐谱数据ROM(四个模块)19 8:地址线的选择27 9:led数码管位选功能的解决方案28五:总体设计电路图28六:六:结束语29乐谱演奏电路设计摘要 设计了一种基于FPGA的乐谱演奏,该乐谱演奏由用Verilog硬件描述语言设计的核心部件和适当的外围电路构成,可从蜂鸣器上进行演奏也可自动行乐曲演奏。 基于FPGA(现场可编程门阵列)芯片,利用Verilog语言,介绍了一种通用乐曲演奏电路的设计,可实现多个八度音阶的乐曲演奏,与简谱的对应关系简单,编程方便,占用资源少,通用性好,可作为IP core模块引用,构成复杂的SOPC系统
3、 关键词:乐谱演奏;现场可编程门阵列(FPGA);智力产权核(IP core);超高速集成电路硬件描述语言(Verilog);乐曲 Abstract An electronic piano is designed based on FPGA,which consists of core paris that designed by using Verilog hardware description languages,as well as some periphery circuits.The musical perform ance can be donenot only by keys
4、but also with automatic type in the electronic piano Based on FPGA,by Verilog language,this paper introduces a universal music circuit design,it can play high,middle and low multiple tonality,simple corresponding relation with simple musical notation,which programs easily using little resourceIt can
5、 be used universally for IP core in making complicated SOPC system Key words:electronic piano;Field Programmable Gate Array(FPGA);Intelligence Property core(IP core) ;Very-High-Speed Integrated Circuit Hardware Description Language(Verilog);music 一、 设计任务要求1、课程设计题目 设计一个乐曲演奏电路,能够自动播放编写好的音乐。要求将音乐通过实验箱上
6、的喇叭播放出来,数码管显示播放至第几首音乐。 (附加功能:本设计在题目所要求的功能全部实现的基础之上又添加了许多附加功能,所有的功能将在“工程设计总述”中阐明,特此声明。)2、 设计分析 (1) 音乐硬件演奏电路基本原理 硬件电路的发声原理,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA芯片某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。而要
7、准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。 (2) 音符频率的获得多个不同频率的信号可通过对某个基准频率进行分频器获得。由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。本设计中选取1MHz的基准频率。数控分频器采用12位二进制计数器,乐曲中的
8、休止符,只要将分频系数设为0,即初始值=4095,此时扬声器不会发声。根据分频系数,可计算数控分频器得到的初始值。(语言已经无法描述其中的原理了,程序可以说明此问题,关于初始值的解释,请看下文给出的程序)初始值的计算公式如下:由于所设计的数控分频计采用12MHZ作为时钟源,并通过一次12分频给出频率为1MHZ的脉冲溢出信号,再对该1MHZ的溢出信号进行12位2进制码的带预置数进行计数,并给出一个频率随预置数变化的脉冲信号。由于该脉冲信号不具有驱动蜂鸣器的能力,故对此脉冲信号进行2分频以推动蜂鸣器发声,故最终输出信号的频率与预置数的关系如下:其中为音阶对应的频率。 表1 简谱中的音名与频率的关系
9、音名频率/Hz音名频率/Hz音名频率/Hz低音1261.63中音1532.25高音11046.50低音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 各音阶频率对应的分频值音名分频系数初始值音名分频系数初始值音名分频系数初始值低音17644547中音138224369高音119116280低音268101381中音23405
10、4786高音212706921低音360672124中音330345157高音315176674低音457272464中音428645327高音414326759低音551023089中音525515640高音512566935低音645453646中音622735918高音611377054低音740504141中音720256166高音710137178 (3) 乐曲节奏的控制 一般乐曲最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要输出4Hz的1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。计数时钟信号作为输出
11、音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低,由于最后的蜂鸣器前需加一个二分频的程序,因此计数器的时钟信号应为4Hz的2倍,即8Hz。 (4) 乐谱的发生本设计将乐谱中的音符数据存储在LPM-ROM中,若某音在逻辑中停留了4个时钟节拍,即1秒的时间,相应地,该音符就要在LPM-ROM中连续的四个地址上都存储。当一个4Hz的时钟来时,相应地就从LPM-ROM中输出一个音符数据。(5) 选择模块 选择模块将用一个4位数的控制信号控制乐谱模块数据的选择性,用vhdl语言描述比较简单,不在此详述。(6) 译码器等其他模块译码器等模块在以
12、前做实验的时候做过,且原理比较简单易懂,不再这里阐述。3、 工程设计总述 当一个4Hz的时钟脉冲来到时,乐谱发生器模块输出一个音符数据给分频系数模块,分频系数模块输出此音符相应的分频系数所需的初始值,将初始值送给数控分频器模块,当12MHz的时钟脉冲来到时,数控分频器就根据分频系数输出相应的频率(即此音符所对应的发生频率)给扬声器,扬声器就可发出对应音符的声音来.连续的8Hz的时钟脉冲就将乐谱发生器里所存储的音符数据一个接一个的送给了分频系数模块,再经过数控分频模块,最后扬声器一个接一个的发出音符数据所对应的声音来。曲子也就流畅的播放出来了。同时led数码管会随着音乐显示相应的乐谱,当乐曲一遍
13、演奏完成后,乐曲发生器能自动从头开始循环演奏,这时用拨码开关选择播放的乐曲,拨码开关给选择器一个选择信号,即可选择相应的歌曲莫开中的数据进入数据翻译模块,播放出相应的歌曲,本工程选取了四首乐曲,以格雷码的形式编码,每次只变一位拨码开关,比较方便选择。分别为: 0001菊花台 0011世上只有妈妈好 0010一剪梅 0110隐形的翅膀 乐谱如下:二、总体框图 该工程由是个模块构成,其中有四个为乐谱储存模块ROM,如图所示。1、 分频器的功能是将芯片上提供的50MHz的时钟分频为12MHz和8Hz的时钟,分别供计数器与分频驱动器(数控分频器)使用。2、 计数器完成计数功能,183进制(最长的歌曲菊
14、花台有183个字符)每个时钟沿加一。3、 四个音乐模块分别记录了4首歌的乐谱。根据上一模块计数器所计的数读取相应地址里的数据传递给下一模块。4、 选择器完成选择歌曲的功能。5、 数据翻译模块将选择器所选择的歌曲rom里的地址的数据翻译成分频驱动器(数控分频器)分频所需的控制数据、3个led灯数据(高中低音)、以及译码器所需的数据。6、 分频驱动器也就是一个数控分频器,完成分频的功能,并驱动蜂鸣器。7、 译码器将乐谱数据在led数码管上显示。三、选择器件1.EP2C5T144C8N芯片2.实验箱底板电路 (包括 蜂鸣器 7段数码管3.计算机四、功能模块1.分频器(div)将芯片上提供的50MHz
15、的时钟分频为12MHz和8Hz的时钟,分别供计数器与分频驱动器(数控分频器)使用。(1)模块图形:(2)程序如下:reg 23:0 counter8Hz; reg 23:0 counter12MHz;always (negedge reset_l or posedge clk)begin /6MHz分频 if (!reset_l) begin counter6MHz = 24b0; clk_6m = 1b0; end else begin if(counter12MHz=24d4) begin Counter12MHz=0; clk_12m=clk_12m; end else begin Co
16、unter12MHz=Counter12MHz+1; end end end always (negedge reset_l or posedge clk) begin /4Hz分频 if (!reset_l) begin Counter8Hz = 24b0; clk_8hz = 1b0; end else begin if(Counter8Hz=24d6519999) begin counter4Hz=0; clk_8hz=clk_8hz; end else begin Counter8Hz=Counter8Hz+1; end end end (3)仿真波形:(4) 仿真波形分析由波形可看出
17、ckl为输入50MHz的时钟信号,ckl12输出为平12MHz的时钟信号,clk8为8Hz的时钟信号,由于纸张有限没有打印出其全部波形。经分析该模块功能完全正确。2计数器(notetabs)计数器完成计数功能,183进制(最长的歌曲菊花台有183个字符)每个时钟沿加一。用于选择rom模块中的地址。(1) 模块图像:(2) 程序如下:reg7:0counter1;always(posedgeclkornegedgereset_l)beginif(!reset_l)begincounter1=8b0;endelseif(counter1=8hff)begincounter1=8b0;endelse
18、counter1=counter1+1b1;end(3) 仿真波形:(4)仿真波形分析由波形可看出,CLK为输入时钟信号,八位输出二进制信号在每个时钟上升沿加一(这一点由counter7counter0可以看出,而counter1由于某某原因未能显示出,并不影响对该模块功能的判断)经分析,该模块功能完全正确。3选择模块(choice)选择器完成选择歌曲的功能。当a的信号为0001时将Q1的信号输出为0011时将Q2的信号输出为0010时将Q3的信号输出为0110时将Q4的信号输出(1) 模块图像:(2) 程序如下:module music_display(input clk , input r
19、eset_l ,inputa,output reg q1,q2,q3 reg 3:0 a;reg 4:0 q1,q2,q3; /5位宽度的信号输出reg 13:0 start; /start为预置数reg 7:0 cnt ; /cnt为8位计数器 用于循环演奏reg 7:0 cnt_music ; /cnt为8位计数器 用于循环演always(posedgeclkornegedgereset_l)beginif(!reset_l)begina b=0001; INDEX b=0010; INDEX b=0011; INDEX b=0100; INDEX null;end case ;endmo
20、dule(3) 仿真波形:(4)仿真波形分析由波形可看出,当输入信号a为0010时输出信号b与q3信号相同(即播放q3的音乐),输出信号index与a相同(即音乐选取显示与音乐选取按键相同)第二个波形图,当输入信号为0001时,同样可以看出这一点,因此该模块功能完全正确。4数据翻译模块(tontaba):将选择器所选择的歌曲rom里的地址的数据翻译成分频驱动器(数控分频器)分频所需的控制数据、3个led灯数据(高中低音)、以及译码器所需的数据。(1) 模块图像:(2) 程序如下:/*-数码管扫描 译码-*/timescale 1ns/100psmodulesmg_display(inputcl
21、k,inputreset_l,input2:0data,output reg3:0seg_s,outputreg7:0segwire3:0data0;wire3:0data1;wire3:0data2;wire3:0data3;assigndata0=data/1000;assigndata1=data%1000/100;assigndata2=data%100/10;assigndata3=data%10;reg1:0case_cnt;always(posedgeclkornegedgereset_l)beginif(!reset_l)begincase_cnt=2b0;endelsebeg
22、incase_cnt=case_cnt+1b1;endend/*-数码管位选扫描-*/always(posedgeclkornegedgereset_l)beginif(!reset_l)beginseg_s=4b0;endelsebegincase(case_cnt1:0)2b00:seg_s=4b0001; 2b01:seg_s=4b0010; 2b10:seg_s=4b0100; 2b11:seg_s=4b1000; default:;endcaseendend/*-把计算出的值放入寄存器hex中准备译码-*/reg3:0hex;always(*)begincase(case_cnt1:
23、0)2b00:hex=data3;2b01:hex=data2;2b10:hex=data1;2b11:hex=data0;default:hex=4b0 ;endcaseendalways (negedge reset_l or posedge clk)beginif(!reset_l)beginseg=8b0;endelsebegincase(hex3:0) 4h0: seg = 8b11000000; 4h1: seg = 8b11111001; 4h2: seg = 8b10100100; 4h3: seg = 8b10110000; 4h4: seg = 8b10011001; 4h
24、5: seg = 8b10010010; 4h6: seg = 8b10000010; 4h7: seg = 8b11111000; 4h8: seg = 8b10000000; 4h9: seg = 8b10010000; 4hA: seg = 8b01110111; 4hB: seg = 8b01111100; 4hC: seg = 8b00111001; 4hD: seg = 8b01011110; 4hE: seg = 8b01111001; 4hF: seg = 8b01110001; default:;endcaseendendendmodule(3) 仿真波形:(4)仿真波形分析
25、由波形可看出,当输入信号index为00110时high0显示1,code显示6(即 中音6),预置初值为101010111000,查询上文所列的表,可发现功能完全正确。第二个波形图,输入信号00010,输出为中音2,再查预置初值,同样可发现完全正确。因此该模块功能完全正确。5.数控分频器模块(speakera) 不多说其功能,直接看程序。(1)模块图像:reg clk_12m ; reg clk_8hz; reg 23:0 counter8Hz; reg 23:0 counter12MHz;always (negedge reset_l or posedge clk)begin /12MHz
26、分频 if (!reset_l) begin counter12MHz = 24b0; clk_6m = 1b0; end else begin if(counter12MHz=24d4) begin Counter12MHz=0; clk_12m=clk_12m; end else begin Counter12MHz=counter12MHz+1; end end end always (negedge reset_l or posedge clk) begin /4Hz分频 if (!reset_l) begin Counter8Hz = 24b0; clk_8hz = 1b0; end
27、 else begin if(counter8Hz=24d6519999) begin Counter8Hz=0; clk_4hz=clk_8hz; end else begin counter4Hz=counter8Hz+1; end end always(posedge clk_6m or negedge reset_l )begin if (!reset_l) begin tone=14d16383; end else begin if(tone=14d16383)begin tone= start; spks=spks; /2 分频得到方波信号 end else begin /通过置数
28、改变分频比 tone=tone+1; end endend (3)仿真波形:将波形放大来看:(4)仿真波形分析此波形仿真分析比较复杂,如果由于输入信号为12MHz,其中的分频系数比较大,如果直接用该模块程序进行仿真可能导致仿真时间过长而失败,因此更改程序,减小其分频系数,同样能说明问题,在此,我将12位的预置初值改为3位,得到如上的仿真波形图,可发现在tone给出不同的预置初值时的分频效果,仔细细数一下,发现数控分频功能完全正确。end process;end; 6.乐谱数据ROM(四个模块)由于储存音乐数据。这四个模块原理一模一样,由于篇幅的关系,这里只给出菊花台的仿真波形图。并附上四首音乐
29、的rom数据以及rom的定制过程。(1) rom数据程序:(2) always(posedge clk_4hz) /音调频率计数数 begin case(high,mid,low) /根据不同的音符,预置分频比 12b000000000000: start= 16383; 12b000000000001: start= 4915; 12b000000000010: start= 6168; 12b000000000011: start= 7281; 12b000000000100: start= 7792; 12b000000000101: start= 8730; 12b000000000110: start= 9565; 12b000000000111: start= 10309; 12b000000010000: start= 10650; 12b000000100000: start= 11275; 12b000000110000: start= 11833; 12b000001000000: start= 12088; 12b000001010000: start= 12556;