EDA音乐播放器.doc_第1页
EDA音乐播放器.doc_第2页
EDA音乐播放器.doc_第3页
EDA音乐播放器.doc_第4页
EDA音乐播放器.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

EDA技术及应用课程设计说明书 2013 届 电子信息工程 专业 1班级题 目 音乐播放器 学 号 姓 名 指导教师 二一 五 年 6 月 25 日一、 音乐播放器基本原理 1 硬件电子琴设计原理乐曲演奏的原理是:由于组成乐曲的每个音符的频率值(音调)及其持续时间(音长)是乐曲演奏的2个基本数据,因此需要控制输出到扬声器的激励信号的频率高低和该频率信号持续的时间。频率的高低决定了音调的高低,而乐曲的简谱与各音名的频率对应关系在后面将给出。所有不同频率的信号都是从一基准频率分频而得来的,由于音阶频率多为非整数,而分频系数有不能为小数,故必须将计算得到的分频数进行向下取整,基准频率和分频系数应综合考虑加以选择,从而保证音乐不会走调。如在48MHz 时钟下,中音1(对应的频率值是523.3Hz)的分频系数应该为:48000000/(2*523.3)=45863,这样只需对系统时钟进行45863次分频即可得到所要的中音M1(分频系数计算公式为D=F/2K,由于F/2K之后,会使分频系数D变小,所以功能模块中语句:beep_r=!beep_r,使得输出取反,K=F/2count_end,消除了前面除以2K的影响) 。 2 乐曲自动演奏设计原理硬件电路和自动演奏的原理同硬件电子琴实验原理类似。至于其他音符,同样可由一式求出对应的分频系数。在程序中设置一个状态机,每250ms改变一个状态(即一个节拍),组成乐曲的每个音符的频率值(音调)相对应于状态机的每一个状态。只要让状态机的状态按顺序转换,就可以自动演奏播放音乐了。欢乐颂乐曲的简谱如图所示: 3 消抖原理作为机械开关的键盘,在按键操作时,由于机械触点的弹性及电压突跳等原因,在触点闭合或开启的瞬间会出现电压抖动,实际应用中如果不进行处理将会造成误触发。由于这里是低电平表示按键按下,所以按键去抖动的关键在于提取稳定的低电平状态,虑除前沿、后沿抖动毛刺。对于一个按键信号,可以用一个脉冲对他进行取样,如果连续三次取样为低电平,可以认为信号已经处于键稳定状态,这时输出一个低电平按键信号。继续取样的过程中如果不能满足连续三次取样为低,则认为键稳定状态结束,这时输出变为高电平。二、 音乐播放器的硬件设计1顶层模块输入输出:管脚说明:输入:时钟信号clk ,按键6:0key ,功能切换键key7输出:LED灯6:0led ,蜂鸣器beep;Key0: DO key1: RE key2: ME key3:FA key4: SOLkey5: LA key6: SI key7:功能切换键2 按键消抖模块输入:时钟信号clk, 功能切换键key7输出:稳定脉冲信号3 电子琴模块输入:时钟信号clk ,按键6:0key ,输出:LED灯6:0led ,蜂鸣器beep;Key0: DO key1: RE key2: ME key3:FA key4: SOLkey5: LA key6: SI 按下相应的键有对应LED灯指示。4乐曲自动演奏模块输入:时钟信号clk;输出:蜂鸣器beep三 元器件列表: 序号耗材名称型号/规格技术要求与参数数量单位1PCB制版10cm*8cm2层板1块2CPLDEPM7064AELC44-10N44引脚,PLCC封装1个3数码管SR420401K 11074位,共阴极,40mm*15mm2个4PLCC-44 底座通用44引脚1个5钟振方形12MHz,4引脚1个6电阻通用200欧姆8只7电阻通用1K欧姆14只8电阻通用10K欧姆10只9电阻通用50欧姆1只10电容104独石电容0.1uF6只11电容电解电容50V,10uF1只12按键通用4引脚4只13发光二极管通用红色3只14发光二极管通用绿色3只15三极管通用NPN9只16双排插头通用10针1个17电源接插线通用含20cm电源线1对三、 音乐播放器的Verilog实现1电子琴程序module beep1(clk,key,beep,led);/模块名称beepinput clk;/系统时钟48MHzinput6:0key;/按键输入output beep;/蜂鸣器输出端output6:0led;/LED输出reg beep_r;/寄存器reg15:0count,count_end;reg6:0key_r;reg 13:0a; /消抖寄存器always(posedge clk)begincount = count + 1b1;/计数器加1if(count = count_end)&(!(count_end = 16hffff)begincount = 16h0;/计数器清零beep_r 0)begin a=a-1; end count_end = 16hb327;while(a0)begin a=a-1; end end7b1111101:begin while(a0)begin a=a-1 ;end count_end = 16h9fa0;while(a0)begin a=a-1; end end/中音2的分频系数值7b1111011:begin while(a0)begin a=a-1 ;end count_end = 16h8e32;while(a0)begin a=a-1; end end/中音3的分频系数值7b1110111:begin while(a0)begin a=a-1 ;end count_end = 16h8637;while(a0)begin a=a-1; end end/中音4的分频系数值7b1101111:begin while(a0)begin a=a-1 ;end count_end = 16h7794;while(a0)begin a=a-1; end end/中音5的分频系数值7b1011111:begin while(a0)begin a=a-1 ;end count_end = 16h6a88;while(a0)begin a=a-1; end end/中音6的分频系数值7b0111111:begin while(a0)begin a=a-1 ;end count_end = 16h5ee8;while(a0)begin a=a-1; end end/中音7的分频系数值default: begin while(a0)begin a=a-1 ;end count_end = 16hffff;while(a0)begin a=a-1; end endendcaseendassign beep =beep_r;/输出音乐assign led =key_r;/输出按键状态Endmodule2 乐曲自动演奏程序module song(clk,beep,led);/模块名称 inputclk;/系统时钟48Mhzoutputbeep;/蜂鸣器输出端 output7:0 led;regbeep_r;/寄存器 reg7:0 state;/乐谱状态机reg15:0count,count_end;reg23:0count1;/乐谱参数:D=F/2K (D:参数,F:时钟频率,K:音高频率) /以下是12MHZ晶振状态下的各音高对应的参数 /*parameter L_5 = 16h3bca,/低音5 M_1 = 16h2cc9,/中音1 M_2 = 16h27f8,/中音2 M_3 = 16h238c,/中音3 M_4 = 16h218d,/中音4 M_5 = 16h1de5,/中音5 M_6 = 16h1aa2;/中音6 parameterTIME = 3000000;/控制每一个音的长短(250ms)*/ /乐谱参数:D=F/2K (D:参数,F:时钟频率,K:音高频率) parameter L_5 = 16d61224,/低音5 M_1 = 16d45863,/中音1 M_2 = 16d40864,/中音2 M_3 = 16d36402,/中音3 M_4 = 16d34359,/中音4 M_5 = 16d30612; /中音5 parameterTIME = 12000000;/控制每一个音的长短(250ms) assign beep = beep_r;/输出音乐 ,蜂鸣器 always(posedge clk)begincount = count + 1b1;/计数器加1 if(count = count_end)begincount = 16h0;/计数器清零 beep_r = !beep_r;/输出取反 endendalways (posedge clk)beginif(count1 TIME)/一个节拍250mS count1 = count1 + 1b1;elsebegincount1 = 24d0;if(state = 8d125) /控制歌曲循环播放时间 state = 8d0; /循环从头开始 elsestate = state + 1b1; /循环结构体 begincase(state)8d0,8d1: count_end = M_3;/中音3,持续2个节拍 8d2,8d3: count_end = M_3;/中音3,持续2个节拍 8d4,8d5:count_end = M_4;/中音4,持续2个节拍 8d6,8d7: count_end = M_5;8d8,8d9: count_end = M_5;8d10,8d11: count_end = M_4;8d12,8d13: count_end = M_3;8d14,8d15: count_end = M_2;8d16,8d17: count_end = M_1;8d18,8d19: count_end = M_1;8d20,8d21: count_end = M_2;8d22,8d23: count_end = M_3;8d24,8d25,8d26: count_end = M_3;8d27: count_end = M_2;8d28,8d29,8d30,8d31: count_end = M_2;8d32,8d33: count_end = M_3;8d34,8d35: count_end = M_3;8d36,8d37: count_end = M_4;8d38,8d39: count_end = M_5;8d40,8d41: count_end = M_5;8d42,8d43: count_end = M_4;8d44,8d45: count_end = M_3;8d46,8d47: count_end = M_2;8d48,8d49: count_end = M_1;8d50,8d51: count_end = M_1;8d52,8d53: count_end = M_2;8d54,8d55: count_end = M_3;8d56,8d57,8d58: count_end = M_2;8d59: count_end = M_1;8d60,8d61,8d62,8d63: count_end = M_1;8d64,8d65: count_end = M_2;8d66,8d67: count_end = M_2;8d68,8d69: count_end = M_3;8d70,8d71: count_end = M_1;8d72,8d73: count_end = M_2;8d74: count_end = M_3;8d75: count_end = M_4;8d76,8d77: count_end = M_3;8d78,8d79: count_end = M_1;8d80,8d81: count_end = M_2;8d82: count_end = M_3;8d83: count_end = M_4;8d84,8d85: count_end = M_3;8d86,8d87: count_end = M_2;8d88,8d89: count_end = M_1;8d90,8d91: count_end = M_2;/8d92,8d93: count_end = L_5;8d92,8d93,8d94,8d95:count_end = L_5;/8d94,8d95: count_end = M_3;8d96,8d97: count_end = M_3;8d98,8d99: count_end = M_3;8d100,8d101: count_end = M_4;8d102,8d103: count_end = M_5;8d104,8d105: count_end = M_5;8d106,8d107: count_end = M_4;8d108: count_end = M_3;8d109: count_end = M_2;8d110,8d111: count_end = M_1;8d112,8d113: count_end = M_1;8d114,8d115: count_end = M_2;8d116,8d117: count_end = M_3;8d118,8d119,8d120: count_end = M_2;8d121: count_end = M_1;8d122,8d123,8d124,8d125: count_end = M_1;default:count_end = 16hffff;endcase end endendassign led0=(count_end = M_1)?0:1; /控制LED灯的语言 assign led1=(count_end = M_2)?0:1;assign led2=(count_end = M_3)?0:1;assign led3=(count_end = M_4)?0:1;assign led4=(count_end = M_5)?0:1;assign led5=(count_end = L_5)?0:1;assign led6=1;assign led7=1;3选择模块程序module select(key,beep1,beep2,led1,led2,beep,led); input key,beep1,beep2; input 6:0led1; input 6:0led2; output beep; output 6:0led; reg key_r;always (negedge key)beginkey_r = key_r;/将琴键开关转换为乒乓开关endassign beep=(key_r)?beep2:beep1;assign led=(key_r)?led2:led1;Endmodule4顶层文件程序module dzq(key,key7,beep,led,clk);input key7;input 6:0key;input clk;output 6:0led;output beep;reg dout1;reg dout2;reg dout3;reg led;reg key_r;wire a,b,key_l;wire 6:0c;wire 6:0d;assign key_l = (dout1 | dout2 | dout3);/按键消抖输出always (posedge clk)beg

温馨提示

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

评论

0/150

提交评论