




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、成绩 中国农业大学 课程论文 (2011-2012学年夏季学期)论文题目: 基于VerilogHDL的音乐 播放器设计 课程名称: PLD课程设计 任课教师: 薛一鸣 班级: 电子091 学号: 0908140818 姓名: 宋艳 基于Verilog HDL的音乐播放器设计1 设计目的22 设计任务23 系统设计33.1 乐曲演奏部分33.1.1音调的控制33.1.2音长的控制43.2 键盘扫描部分83.3 数码管动态显示部分123.4 LCD显示部分144 心得体会17摘要:本实验主要在理论分析和具体的软件实现上,完成一个简易的音乐播放器,可以完成上一曲,下一曲,循环播放,暂停和液晶显示,同
2、时还增加了手动按键编曲播放功能。在理论分析的基础上,用Verilog HDL语言编写源代码,再配合具体电路连接,实现对蜂鸣器振动的控制,以及对各项显示功能的切换控制等。关键字:Verilog频率显示 音乐播放1 设计目的1)学习Verilog HDL的设计技巧,掌握乐曲演奏电路的工作原理;2)学习音符与频率关系,了解怎样控制音调的高低变化和音长,从而完成乐曲的自动循环演奏;3)学习音频功放模块接口特点;4)培养自主学习、正确分析和解决问题的能力。2 设计任务1、使用Verilog HDL设计乐曲演奏电路,系统实现是用硬件描述语言Verilog HDL按分频控制的方式进行设计,然后进行编程电路功
3、能验证,奏出美妙的乐曲。2、通过控制输出到扬声器的激励信号频率的高低和持续的时间,从 而使扬声器发出连续的乐曲声,且当乐曲演奏完成时,保证能自动从头开始演奏。3、简易乐曲播放器可以实现的功能:1)播放器内预存4首乐曲;2)顺序播放:按内部给定的顺序依次播放3首乐曲,每首歌曲可以循环播放;3)用三位数码管显示输出相应的高中低音符,并用一个数码管显示当前播放乐曲的顺序号,实现动态显示;4)设置开始键和暂停键,乐曲播放过程中按暂停键则暂停播放,再按开始键则继续播放;5)设置Next和Previous键,按Next键可以听下一首,按Previous键可以听上一首;6)实现手动发音,就是按键发出特定的音
4、符;7)用LCD显示正在播放的歌曲名称,并显示下一首歌曲名称;8)在音乐播放的同时,会有led流水灯的闪烁,以及LED矩阵的闪烁。3 系统设计3.1 乐曲演奏部分乐曲演奏的原理是这样的:组成乐曲的每个音符的频率值(音调)及其持续的时间(音长)是乐曲能连续演奏所需的两个基本数据,因此只要控制输出到扬声器的激励信号频率的高低和持续的时间,就可以使扬声器发出连续的乐曲声。3.1.1音调的控制频率的高低决定了音调的高低。音乐的十二平均率规定:每两个8度音(如简谱中的中音1与高音1)之间的频率相差一倍。在两个8度音之间,又可分为12个半音,每两个半音的频率比为122。 另外,音名A(简谱中的低
5、音6)的频率为440Hz,音名B到C之间、E到F之间为半音,其余为全音。由此可以计算出简谱中从低音1至高音1之间每个音名对应的频率,如表3.11所示:表3.11 简谱中的音名与频率的关系音名频率/Hz音名频率/Hz音名频率/Hz低音1261.63中音1523.25高音11045.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.00中音6880.00高音61760.00低音7493.88中音7987.76
6、高音71975.52所有不同频率的信号都是从同一个基准频率分频得到的。由于音阶频率多为非整数,而分频系数又不能为小数,故必须将计算得到的分频数四舍五入取整。若基准频率过低,则由于分频比太小,四舍五入取整后的误差较大;若基准频率过高,虽然误差变小,但分频数将变大。实际的设计综合考虑这两方面的因素,在尽量减小频率误差的前提下取合适的基准频率。本例中选取1MHz为基准频率。实际上,只要各个音名间的相对频率关系不变,演奏出的乐曲听起来都不会“走调”。各音阶频率及相应的分频比如表2所示。为了减小输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,因此在到达扬声器之前,有一个二分频的分频器。表2中的分
7、频比就是从1MHz频率基础上计算得出的。由于最大的分频系数为3822,故采用12位二进制计数器分频可满足需要。在表2中,除给出了分频比以外,还给出了对应于各个音阶频率时计数器不同的预置数。对于不同的分频系数,只要加载不同的预置数即可。采用加载预置数实现分频的方法比采用反馈复零法节省资源,实现起来也容易一些,如表3.12所示:表3.12 各音阶频率对应的分频比及预置数音名分频比预置数音名分频比预置数低音13822273中音512762819低音23405690中音611362959低音330341061中音710123083低音428631232高音19563139低音525511544高音28
8、513244低音622731822高音37583337低音720252070高音47163379中音119112184高音56383457中音217032392高音65683527中音315172578高音75063589中音414322663休止符04095此外,对于乐曲中的休止符,只要将分频系数设为0,即初始值为4095,即可,此时扬声器将不会发声。3.1.2音长的控制音符的持续时间必须根据乐曲的速度及每个音符的节拍数来确定。本例演奏的梁祝片段,最短的音符为4分音符,如果将全音符的持续时间设为1s的话,则只需要再提供一个4Hz的时钟频率即可产生4分音符的时长。控制音调通过设置计数器的预置数
9、来实现,预置不同的数值可以使计数器产生不同频率的信号,从而产生不同的音调。控制音长是通过控制计数器预置数的停留时间来实现的,预置数停留的时间越长,则该音符演奏的时间越长。每个音符的演奏时间都是0.25s的整数倍,对于节拍较长的音符,如2分音符,在记谱时将该音名连续记录两次即可。主要程序代码:assign carry=(divider=4095);always (posedge clk)if(cnt1<124999) cnt1=cnt1+19'b0000_0000_0000_0000_001;else begin cnt1=0; clk_4hz =! clk_4hz; endalw
10、ays (posedge clk)if(cnt2<4999) cnt2=cnt2+13'b1;else begin cnt2=0; clk_100hz =! clk_100hz; endalways (posedge clk)begin if(carry) divider<=origin; else divider<=divider+12'b00_0000_0000_01;endalways (posedge carry)begin speaker<=speaker;end always (posedge clk_4hz)begincase(high,m
11、ed,low) /fen pin bi/low'b000000000001:origin<=273; /1'b000000000010:origin<=690; /2'b000000000011:origin<=1061; /3'b000000000100:origin<=1232; /4'b000000000101:origin<=1544; /5'b000000000110:origin<=1822; /6'b000000000111:origin<=2070; /7/med'b000
12、000010000:origin<=2184; /1'b000000100000:origin<=2392; /2'b000000110000:origin<=2578; /3'b000001000000:origin<=2663; /4'b000001010000:origin<=2819; /5'b000001100000:origin<=2959; /6'b000001110000:origin<=3083; /7/high'b000100000000:origin<=3139; /1
13、'b000100000000:origin<=3244; /2'b000100000000:origin<=3337; /3'b000100000000:origin<=3379; /4'b000100000000:origin<=3457; /5'b000100000000:origin<=3527; /6'b000100000000:origin<=3589; /7/xiu zhi fu'b000000000000:origin<=4095; /xiu zhi fuendcaseendalwa
14、ys (posedge clk_4hz) begin if(counter2=63) counter2<=0; else counter2<=counter2+1;case(counter2) 0: high,med,low<='b000000000011; 1: high,med,low<='b000000000011; 2: high,med,low<='b000000000011;3: high,med,low<='b000000000011;4: high,med,low<='b000000000101;
15、 5: high,med,low<='b000000000101; 6: high,med,low<='b000000000101;7: high,med,low<='b000000000110; 8: high,med,low<='b000000010000; 9: high,med,low<='b000000010000; 10: high,med,low<='b000000010000;11: high,med,low<='b000000100000; 12: high,med,low<
16、;='b000000000110; 13: high,med,low<='b000000010000; 14: high,med,low<='b000000000101; 15: high,med,low<='b000000000101;16: high,med,low<='b000001010000; 17: high,med,low<='b000001010000; 18: high,med,low<='b000001010000;19: high,med,low<='b0001000
17、00000; 20: high,med,low<='b000001100000; 21: high,med,low<='b000001010000; 22: high,med,low<='b000000110000; 23: high,med,low<='b000001010000; 24: high,med,low<='b000000100000; 25: high,med,low<='b000000100000; 26: high,med,low<='b000000100000;27: hig
18、h,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<=
19、9;b000000100000; 35: high,med,low<='b000000110000; 36: high,med,low<='b000000000111; 37: high,med,low<='b000000000111; 38: high,med,low<='b000000000110; 39: high,med,low<='b000000000110; 40: high,med,low<='b000000000101; 41: high,med,low<='b0000000001
20、01; 42: high,med,low<='b000000000101; 43: high,med,low<='b000000000110; 44: high,med,low<='b000000010000; 45: high,med,low<='b000000010000; 46: high,med,low<='b000000100000; 47: high,med,low<='b000000100000; 48: high,med,low<='b000000000011; 49: high,
21、med,low<='b000000000011; 50: high,med,low<='b000000010000; 51: high,med,low<='b000000010000; 52: high,med,low<='b000000000110; 53: high,med,low<='b000000000101; 54: high,med,low<='b000000000110; 55: high,med,low<='b000000010000; 56: high,med,low<=&
22、#39;b000000000101; 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<='b00000000
23、0101;endcaseend3.2 键盘扫描部分本设计通过键盘来控制歌曲的播放,音乐播放器所需各种功能按键非常多,一般的独立式键盘输入不能满足要求,本设计采用4×4矩阵键盘,较好满足了设计要求。此模块负责对输入设备4×4键盘采用行列式法进行扫描,并定义每个按键的功能,作为其他模块的控制信号。各按键的功能如下:012345671上一首下一首暂停开始手动弹奏音乐播放其中(下一首、上一首、暂停、开始)只有在音乐播放功能时使用,音乐播放只在手动弹奏时使用。主要程序代码:always (posedge clk_100hz)begincase(state)0:beginx=4'
24、;b0000;if(y!=4'b1111) state=0;elsebeginstate=1;end end1:beginx=4'b0000;if(y=4'b1111)beginstate=1;note<='b0000_0000_0000;endelsebeginstate=2;endend2:beginx=4'b0111;state=3; end3:begincase(y)4'b1111:state=4;4'b1110:begindout='b00111111;dledmatrix='b11000000;dled=
25、'b1100000011000000;state=0;/0 end4'b1101:begindout='b01100110;dledmatrix='b10011001;dled='b1001100110011001;state=0;/4note<='b0000_0100_0000; end 4'b1011:begindout='b10000110;dledmatrix='b01111001;dled='b0111100101111001;state=0;/8 note<='b0001000000
26、00; end4'b0111:begindout='b00110110;dledmatrix='b11001001;dled='b1100100111001001;state=0;/12if(k!=0)beginp=k;k=0;end endendcase end4:beginx=4'b1011;state=5; end5:begincase(y)4'b1111:state=6;4'b1110:begindout='b00000110;dledmatrix='b11111001;dled<='b1111100
27、111111001;state=0;/1note<='b000000010000; end4'b1101:begindout='b01101101;dledmatrix='b10010010;dled='b1001001010010010;state=0;/5note<='b000001010000; end4'b1011:begindout='b01101111;dledmatrix='b10010000;dled='b1001000010010000;state=0; /9 end4'b01
28、11:begindout='b01011110;dledmatrix='b10100001;dled='b1010000110100001;state=0;/13if(k=0)k=p; endendcase end6:begin x=4'b1101;state=7; end7:begincase(y)4'b1111:state=8;4'b1110:begindout='b01011011;dledmatrix='b10100100;dled='b1010010010100100;state=0;/2note<=
29、9;b000000100000; end4'b1101:begindout='b01111101;dledmatrix='b10000010;dled='b1000001010000010;state=0;/6note<='b000001100000; end4'b1011:begindout='b01110111;dledmatrix='b10001000;dled='b1000100010001000;state=0;/10if(k<=4)&&(k>=2)k=k-1;elsek=4;
30、end 4'b0111:begindout='b01111001;dledmatrix='b10000110;dled='b1000011010000110;state=0;/14 shoudongq=k;k=0; end endcase end8:beginx=4'b1110;state=9; end9:begincase(y)4'b1111:state=0;4'b1110:begindout='b01001111;dledmatrix='b10110000;state=0;/3note<='b000000
31、110000; end4'b1101:begindout='b00000111;dledmatrix='b11111000;state=0;/7note<='b0000_0111_0000; end4'b1011:begindout='b01111100;dledmatrix='b10000011;dled='b1000001110000011;state=0;/11if(k>=4)k=1;elsek=k+1; end4'b0111:begindout='b01110001;dledmatrix=
32、9;b10001110;dled='b1000111010001110;state=0;/15 zidongif(k!=0)k=q;elsek=1; end endcase end endcase end3.3 数码管动态显示部分音名显示电路用来显示乐曲演奏时对应的音符。可以用3个数码管,分别显示高、中、低音的音名,实现演奏的动态显示,十分直观。在本例中,high3:0、med3:0、low3:0等信号分别用于显示高音、中音、低音音符。为了使演奏能循环进行,需另外设置一个时长计数器,当乐曲演奏完成时,保证能自动从头开始演奏。同时用一个数码管显示所播放音乐的序号,在本例中用K信号来显示播
33、放序号。主要程序代码如下:always (posedge clk)beginif(k!=0)begincase(cnt)1:begin dig<='b0010_0000;data<=k;cnt=2;end2:begin dig<='b0001_0000;data<=high;cnt=3;end3:begin dig<='b0000_1000;data<=med;cnt=4;end4:begin dig<='b0000_0100;data<=low;cnt=1;enddefault:begin dig<=
34、9;b0000_0000;data<=1;cnt=1;endendcaseendelsebegindata=1;dig='b1000_0000;endendalways (data)beginif(k!=0)begincase(data)1:begin duan<='b00000110;ledmatrix<='b11111001;led<='b1111100111111001;end2:begin duan<='b01011011;ledmatrix<='b10100100;led<='b1010
35、010010100100;end3:begin duan<='b01001111;ledmatrix<='b10110000;led<='b1011000010110000;end4:begin duan<='b01100110;ledmatrix<='b10011001;led<='b1001100110011001;end5:begin duan<='b01101101;ledmatrix<='b10010010;led<='b1001001010010010;en
36、d6:begin duan<='b01111101;ledmatrix<='b10000010;led<='b1000001010000010;end7:begin duan<='b00000111;ledmatrix<='b11111000;led<='b1111100011111000;enddefault:begin duan<='b00000000;ledmatrix<='b00000000;led<='b1000110010001100;endendcasee
37、ndelsebeginduan<=dout;ledmatrix<=dledmatrix;led<=dled;endend3.4 LCD显示部分FYD12864是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集。利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示。由该模块构成的液晶显示方案与同类型的图形点阵液
38、晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。 其各引脚功能如下:管脚号管脚名称电平管脚功能描述1VSS0V电源地2VCC3.0+5V电源正3V0-对比度(亮度)调整4RS(CS)H/LRS=“H”,表示DB7DB0为显示数据RS=“L”,表示DB7DB0为显示指令数据5R/W(SID)H/LR/W=“H”,E=“H”,数据被读到DB7DB0R/W=“L”,E=“HL”, DB7DB0的数据被写到IR或DR6E(SCLK)H/L使能信号7DB0H/L三态数据线8DB1H/L三态数据线9DB2H/L三态数据线10DB3H/L三态数
39、据线11DB4H/L三态数据线12DB5H/L三态数据线13DB6H/L三态数据线14DB7H/L三态数据线15PSBH/LH:8位或4位并口方式,L:串口方式16NC-空脚17/RESETH/L复位端,低电平有效(见注释2)18VOUT-LCD驱动电压输出端19AVDD背光源正端(+5V)(见注释3)20KVSS背光源负端(见注释3)其控制接口信号说明:1)RS,R/W的配合选择决定控制界面的4种模式: RSR/W功能说明LLMPU写指令到指令暂存器(IR)LH读出忙标志(BF)及地址记数器(AC)的状态HLMPU写入数据到数据暂存器(DR)HHMPU从数据暂存器(DR)中读出数据
40、2)E信号E状态执行动作结果高>低I/O缓冲>DR配合/W进行写数据或指令高DR>I/O缓冲配合R进行读数据或指令低/低>高无动作 控制指令说明:指 指 令 码功 能令RSR/WD7D6D5D4D3D2D1D0 清除显示 0000000001将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H"地址归位000000001X设定DDRAM的地址计数器(AC)到"00H",并且将游标移到开头原点位置;这个指令不改变DDRAM 的内容显示状态开/关0000001
41、DCBD=1: 整体显示 ONC=1: 游标ON B=1:游标位置反白允许进入点设定00000001I/DS指定在数据的读取与写入时,设定游标的移动方向及指定显示的移位游标或显示移位控制000001S/CR/LXX设定游标的移动与显示的移位控制位;这个指令不改变DDRAM 的内容 功能 设定00001DLXREXXDL=0/1:4/8位数据RE=1: 扩充指令操作RE=0: 基本指令操作 设定CGRAM 地址0001AC5AC4AC3AC2AC1AC0设定CGRAM 地址 设定DDRAM 地址0010AC5AC4AC3AC2AC1AC0设定DDRAM 地址(显示位址)第一行:80H87H第二行
42、:90H97H读取忙标志和地址01BFAC6AC5AC4AC3AC2AC1AC0读取忙标志(BF)可以确认内部动作是否完成,同时可以读出地址计数器(AC)的值写数据到RAM10数据将数据D7D0写入到内部的RAM (DDRAM/CGRAM/IRAM/GRAM)读出RAM的值11数据从内部RAM读取数据D7D0(DDRAM/CGRAM/IRAM/GRAM)主要程序代码:always (posedge clkr) begine<=0;cnt3<=0;cnt4<=0;cnt5<=0;cnt6<=0;cnt7<=0;begin current1=next1; cas
43、e(current1) set0: begin rs<=0; dat<=8'h31; next1<=set1; end set1: begin rs<=0; dat<=8'h0C; next1<=set2; end set2: begin rs<=0; dat<=8'h6; next1<=set3; end set3: begin rs<=0; dat<=8'h1; next1<=dat0; end dat0: begin rs<=1; dat<=8'hd5; next1
44、<=dat1; end /zheng zai bo fang : dat1: begin rs<=1; dat<=8'hfd; next1<=dat2; end dat2: begin rs<=1; dat<=8'hd4; next1<=dat3; end dat3: begin rs<=1; dat<=8'hda;next1<=dat4; end dat4: begin rs<=1; dat<=8'hb2; next1<=dat5; end dat5: begin rs<=1;
45、 dat<=8'ha5; next1<=dat6; end dat6: begin rs<=1; dat<=8'hb7;next1<=dat7; end dat7: begin rs<=1; dat<=8'hc5;next1<=dat8; end dat8: begin rs<=1; dat<=8'h3a; next1<=set4; end set4: begin rs<=0; dat<=8'h93; next1<=dat14; end /hua xin dat14: b
46、egin rs<=1; dat<=8'hbb; next1<=dat15; end dat15: begin rs<=1; dat<=8'had; next1<=dat16; end dat16: begin rs<=1; dat<=8'hd0; next1<=dat17; end dat17: begin rs<=1; dat<=8'hc4; next1<=set5; end set5: begin rs<=0; dat<=8'h88; next1<=dat30;
47、 end /xia yi shou dat30: begin rs<=1; dat<=8'hcf; next1<=dat31; end dat31: begin rs<=1; dat<=8'hc2; next1<=dat32; end dat32: begin rs<=1; dat<=8'hd2; next1<=dat33; end dat33: begin rs<=1; dat<=8'hbb; next1<=dat34; end dat34: begin rs<=1; dat<=8'hca; next1<=dat35; end dat35: begin rs<=1; dat<=8
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖南工学院《固废利用与资源化》2023-2024学年第二学期期末试卷
- 毕节职业技术学院《通信原理II》2023-2024学年第二学期期末试卷
- 烟台黄金职业学院《多层框架结构设计》2023-2024学年第二学期期末试卷
- 南京工业大学《体育-羽毛球(三)》2023-2024学年第二学期期末试卷
- 邯郸幼儿师范高等专科学校《生态危机下的濒危动物》2023-2024学年第二学期期末试卷
- 香港科技大学(广州)《建筑施工技术》2023-2024学年第二学期期末试卷
- 长江大学《国际商法(双语教学)》2023-2024学年第二学期期末试卷
- 2024年工业烤箱硅碳棒项目资金筹措计划书代可行性研究报告
- 2024年文物遗址保护服务项目资金筹措计划书代可行性研究报告
- 新疆地理知识课件下载
- 《挠挠小怪兽》小班韵律课件
- 国旗下讲话-5月19日助残日国旗下讲话稿:同享一片蓝天
- 童话故事三年级下册350字作文
- 表1网格化治理工作村(居)民基本信息统计表
- 涂装工艺流程、PFMEA2018
- 2023届淄博市建筑施工安全生产专家库
- 车站信号自动控制教案-四线制道岔控制启动电路
- 委托书挂靠样本
- 国际民事诉讼与国际商事仲裁
- 土地整治项目工程质量评定标准
- 【3套打包】上海市上宝中学小升初第一次模拟考试数学试题
评论
0/150
提交评论