数字系统设计音乐播放器_第1页
数字系统设计音乐播放器_第2页
数字系统设计音乐播放器_第3页
数字系统设计音乐播放器_第4页
数字系统设计音乐播放器_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、、实验目的和要求(必填)二、实验内容和原理(必填)三、主要仪器设备(必填)四、操作方法和实验步骤五、实验数据记录和处理六、实验结果与分析(必填)七、讨论、心得、实验目的和要求:实验目的:(1)掌握音符产生的方法,了解DD诚术的应用。(2)了解AC97音频接口电路的应用。(3)掌握系统“自顶而下”的设计方法。实验任务:设计一个音乐播放器。(1)可以播放四首乐曲,设置play、next、reset三个按键。按play键播放当前乐曲,按next键播放下一首乐曲。小当前乐曲序号(2)LED0指示播放情况(播放时点亮)、LED2和LED3指二、实验内容和原理(1)音乐播放器的设计原理根据实验任务可将系统

2、分为主控制器(mg、乐曲读取(song_reader )、音next button按键处理模块song donenote <loneplay_button|elk主控制器play乐Illi读取;PILLED SongLED 2reset nx Inotc. duration音符播放sample-ncxisamplccodcc_ conditionervalidsamplcnew nameac97 if符播放(note_player)、AC9宿频接口(codec_conditioner)和ac97_if五个子模块,系统的总体框图如下:各个模块的功能如下:1 .mcu模块接收按键信息,通知s

3、ong_reader模块是否要播放(play)及播放哪首乐曲(song),若一曲播放结束则进入播放结束ENDt态。2 .song_reader模块根据mcU块的要求,逐个取出音符note,duration送给note_player模块播放,当一首乐曲播放完毕,回复mcU莫块乐曲播放结束信号(song_done)。3 .note_player模块接收到需播放的音符,在音符的持续时间内,以48kHz速率送出该音符的正弦波样品给AC9宿频接口模块。当一个音符播放结束,向song_reader模块发送一个note_done脉冲索取新的音符。4 .codec_conditiner、ac97_if模块负责

4、与AC9宿频系统接口工作,本实验已提供了这两个模块的代码。另外,按键处理模块完成输入同步化、防颤动和脉宽变换等功能。1、主控制模块mcu的设计mcu模块是主控制模块,有响应按键信息、控制系统播放两大任务,工作流程如下面的流程图所示。要求系统复位后经RESET犬态初始化后进入WAIT状态等待按键输入或乐曲播放结束应答,若有按键输入则转入相应的按键处理状态(NEXTgPLAY,若一曲播放结束则进入结束播放END犬态。mcu的控制器算法流程图如下图:以下为mcu的端口含义引脚名称I/O引脚说明clkInput100MHz寸钟信号resetInput复位信号,高电平有效play_buttonInput

5、“播放”按键,低电平有效next_buttonInput“下一曲”按键,一个时钟周期宽度的局电平脉冲playOutput高电平表示播放song_doneOutput当播放下,曲时,输出,个时钟周期宽度的高电平复位脉冲reset_play,并复位note_player模块song_doneInputnote_player模块的应答彳个时钟周期宽度的高电平脉冲表示一曲播放结束song1:0Output当前乐曲的序号结合以上算法流程图和端口定义,mcU莫块代码如下:modulemcu(clk,reset,play_button,next,play,reset_play,song,song_done)

6、;parameterRESET=0,WAIT=1,END=2,NEXT=3,PLAY=4;inputreset,play_button,song_done,clk,next;outputreg1:0song;outputregplay,reset_play;regstate;always(posedgeclk)beginif(reset)beginplay<=0;song<=2'b00;reset_play<=1;state<=RESET;endelsecase(state)RESET:WAIT:if(song_done)beginstate<=END;p

7、lay<=0;reset_play<=1;endelseif(next)beginstate<=NEXT;play<=1;reset_play<=1;song<=song+1;endelseif(play_button)beginstate<=PLAY;play<=1;reset_play<=0;endelsebeginstate<=WAIT;reset_play<=0;endEND,NEXT,PLAY:beginstate<=WAIT;reset_play<=0;endendcaseendendmodule2、 乐

8、曲读取模块song_reader的设计乐曲读取模块song_reader的功能有:(1)根据mcU奠块的要求,选择播放乐曲;(2)相应note_player模块请求,从song_rom中逐个取出音符note,duration送给note_player模块播放;(3)判断乐曲是否播放完毕,若播放完毕,则回复mcug块应答信号。根据设计要求,以下是song_reader模块的结构框图地址计数器addrelkresetnole dones ong_r匕自加r控制器song_ron结束判断playdoutnotej duraticin)new_note根据设计要求,以下是song_reader模块的端

9、口含义引脚名称I/O引脚说明clkInput100MH时钟信号resetInput复位信号,高电平有效playInput来自mcu的控制信号,局电平播放song1:0Input来自mcu的控制信号,当前播放乐曲的序号note_doneInput来自模块note_player应答佶号,一个时钟周期宽度的高电平脉冲表个音符播放结束song_done0utput给mcu的应答信号,当乐曲播放结束,输出一个时钟周期宽度的高电平脉冲note5:0Output音符标记duration5:0Output音符的持续时间new_noteOutput给note_player的控制信号,一个时钟周期宽度的高电平脉冲

10、表示新的音符需播放以下是song_reader的算法流程图地址计数器为5位二进制计数器,其中note_done为计数允许输入,状态q为song_rom的低5位地址,song1:0为song_rom高两位地址。当地址计数器出现进位或duration为0时,表示乐曲结束,应输出一个时钟周期宽度的高电平脉冲信号song_done。结束判断模块应调用提供的模块one_pulse,使输出为一个时钟周期宽度的高电平脉冲。结合上图以及模块要求,编写song_reader代码如下:modulesong_reader(clk,reset,play,song,note_done,song_done,note,du

11、ration,new_note);inputclk,reset,play,note_done;input1:0song;outputsong_done,new_note;output5:0note,duration;parameterRESET=0,NEW_NOTE=1,WAIT=2,NEXT_NOTE=4;reg1:0STATE;regnew_note;always(posedgeclk)beginif(reset=1)beginnew_note<=0;STATE<=RESET;endelsecase(STATE)RESET:if(play=1)beginnew_note<

12、=1;STATE<=NEW_NOTE;endelsebeginnew_note<=0;STATE<=RESET;endNEW_NOTE:beginnew_note<=0;STATE<=WAIT;endWAIT:if(play=1)if(note_done=1)beginnew_note<=0;STATE<=NEXT_NOTE;endelsebeginnew_note<=0;STATE<=WAIT;endelsebeginnew_note<=0;STATE<=RESET;endNEXT_NOTE:beginnew_note<

13、=1;STATE<=NEW_NOTE;endendcaseendwire4:0q;wireco;song_romsong_rom1(.clk(clk),.dout(note,duration),.addr(song,q);addr_counteraddr_counter1(.clk(clk),.reset(reset),.note_done(note_done),.q(q),.co(co);end_judgingend_judging1(.co(co),.duration(duration),.clk(clk),.song_done(song_done);(返回给主控制器一个应答信号,即

14、框图中的结束判断模块)endmodule其中模块end_judging的代码如下:moduleend_judging(co,duration,clk,song_done);parameterN=6;inputco;inputN-1:0duration;inputclk;outputsong_done;wireN-1:0dd;wireqq;assignsong_done=qq&dd;assigndd=co|(duration=6'b00000);D_FFdff1(.d(dd),.clk(clk),.q(qq);endmodule其中模块counter的代码如下:moduleadd

15、r_counter(clk,q,co,reset,note_done);inputclk,reset,note_done;outputreg4:0q;outputco;assignco=note_done&&(&q);always(posedgeclk)beginif(reset)beginq<=0;endelsebeginif(note_done)q<=q+1;elseq<=q;endendendmodule3、 音符播放模块note_player的设计音符播放模块note_player是本实验的核心模块,它的主要功能有:( 1)从送song_rea

16、der模块接收所需播放的音符信息note,duration;( 2)根据note值找出DDS勺相位增量step_size;( 3)以48kHz速率从SineROM出正弦本¥品送给AC9根口模块;( 4)当一个音符播放完毕,向song_reader模块索取新的音符。根据note_player模块的任务,进一步划分功能单元,为简化设计,可将产生正弦样品的DDSI块设计一个独立子模块sine_reader。note_player控制器负责与song_reader模块接口,读取音符信息,并根据音符信息从FrequencyROM3读取相位增量step_size送给DDSF模块sine_read

17、er。另外,note_player控制器还需要控制音符播放时间。note_player控制器的算法流程如下。在复位或未播放时,控制器处于RESE状态,PLA伪音符播放状态,当一个音符播放结束时,控制器进入DONE态,PLA汹音符播放状态,当一个音符播放结束时,控制器进入DONE:态,置位done_with_note,向song_reader模块索取新的音符,然后进入LOA瞅态,读取新白音符后进入PLAY犬态播放下一个音符。note_player模块的结构框图如下:note_player控制器的算法流程图如下:音符定时器为6位二进制计数器,beat、time_clear分别为使能、清0信号,均为

18、高电平有效。定时时间为音符的长短(duration_to_load个beat周期),timer_done为定时结束标志。根据实验要求以下是note_player模块代码:modulenote_player(clk,reset,play_enable,note_to_load,duration_to_load,done_with_note,load_new_note,beat,generate_next_sample,sample_out,new_sample_ready);inputclk;inputreset;/Whenhighweplay,whenlowwedon't.inputp

19、lay_enable;/Thenotetoplayinput5:0note_to_load;/Thedurationofthenotetoplayinput5:0duration_to_load;/Tellsuswhenwehaveanewnotetoloadinputload_new_note;/Whenwearedonewiththenotethisstayshigh.outputdone_with_note;/regdone_with_note;/Thisisour1/48thsecondbeatinputbeat;/Tellsuswhenthecodecwantsanewsamplei

20、nputgenerate_next_sample;/Oursampleoutputoutput15:0sample_out;/Tellsthecodecwhenwe'vegotasampleoutputnew_sample_ready;wire19:0step_size;sine_readersine_reader_inst(.clk(clk),.reset(reset),.step_size(10'd18,10'd791),.step_size(step_size),.generate_next_sample(generate_next_sample),.new_sa

21、mple_ready(new_sample_ready),.sample_out(sample_out);(note_player控制器一段式描述代码)parameterRESET=0,PLAY=1,LOAD=2,DONE=3;reg1:0state;regdone_with_note;regtimer_clear;wiretimer_done;reg5:0note;always(posedgeclk)if(reset)beginstate<=RESET;note<=6'b0;done_with_note<=0;timer_clear<=1;endelsecas

22、e(state)RESET,LOAD,DONE:if(play_enable)beginstate<=RESET;note<=6'b0;done_with_note<=0;timer_clear<=1;endelseif(load_new_note)beginstate<=PLAY;done_with_note<=0;timer_clear<=0;endelsebeginstate<=LOAD;note<=note_to_load;done_with_note<=0;timer_clear<=1;endPLAY:if(t

23、imer_done)beginstate<=DONE;note<=note_to_load;done_with_note<=1;timer_clear<=1;endelseif(play_enable)beginstate<=RESET;note<=6'b0;done_with_note<=0;timer_clear<=1;endelseif(load_new_note)beginstate<=PLAY;done_with_note<=0;timer_clear<=0;endelsebeginstate<=LOAD

24、;note<=note_to_load;done_with_note<=0;timer_clear<=1;enddefault:beginstate<=RESET;note<=6'b0;done_with_note<=0;timer_clear<=1;endendcasefrequency_romfrequency_rom_inst(.clk(clk),.dout(step_size),.addr(note);note_timernote_timer(.cin(duration_to_load),.en(beat),.clk(clk),.r(t

25、imer_clear),.cout(timer_done);endmodule其中模块note_timer音符定时器代码如下:modulenote_timer(cout,cin,r,clk,en);parametern=6;regn-1:0q;outputcout;inputn-1:0cin;inputr,clk,en;assigncout=en&&(q=(cin-1);always(posedgeclk)if(r)q=0;elseif(en)q=q+1;elseq=q;endmodule子模块sine_reader的功能就是利用DDSK术产生正弦样品。在本实验中,系统时钟cl

26、k与取样脉冲generate_next_sample为两个不同信号;实验中相位增量为22位,其中小数部分为10位。对于step_size本身为20位二进制数的问题,可通过对其进行2b00,step_size处理使其扩展至22位。raw_3ddr 21j 0rawaddr2lsine_reader原理框图:sine_rom的地址和数据处理方法:区域(raw_addr21:20)SineRom地址(rom_addr)Sample00raw_addr19:10raw_data15:001当raw_addr20:10=1024时,rom_addr取1023;其余取raw_addr19:10+1raw_

27、data15:010raw_addr19:10raw_data15:0+111当raw_addr20:10=1024时,rom_addr取1023;其余取raw_addr19:10+1raw_data15:0+1由以上sine_reader原理框图以及sine_rom的地址和数据处理方法可得sine_reader模块代码。modulesine_reader(step_size,clk,generate_next_sample,reset,sample_out,new_sample_ready);input19:0step_size;inputclk,generate_next_sample,r

28、eset;output15:0sample_out;outputnew_sample_ready;wire21:0raw_addr;wire21:0sum;wire9:0rom_addr;wire15:0sample;wire15:0raw_data;full_adder#(22)adder(.a(raw_addr),.b(2'b00,step_size),.s(sum),.ci(1'b0),.co();D_FFRE#(22)dffr1(.d(sum),.en(generate_next_sample),.r(reset),.clk(clk),.q(raw_addr);addr

29、_processoraddr_pro(.in_addr(raw_addr20:10),.out_addr(rom_addr);sine_romsine_rom1(.clk(clk),.dout(raw_data),.addr(rom_addr);data_processor#(16)data_pro(.flag(raw_addr21),.in_data(raw_data),.out_data(sample);D_FFRE#(16)dffr2(.d(sample),.en(generate_next_sample),.r(reset),.clk(clk),.q(sample_out);D_FFd

30、ffr3(.d(generate_next_sample),.clk(clk),.q(new_sample_ready);endmodule其中地址处理(addr_processor)模块的代码如下:moduleaddr_processor(in_addr,out_addr);input10:0in_addr;output9:0out_addr;assignout_addr9:0=(in_addr10)?(in_addr10:0=1024)?1023:(in_addr9:0+1):in_addr9:0;endmodule其中数据处理模块(data_processor)的代码如下:moduled

31、ata_processor(flag,in_data,out_data);parameterN=1;inputflag;inputN-1:0in_data;outputN-1:0out_data;assignout_data=(flag)?(in_data+1):in_data;endmodule其中加法器(full_addr)的代码如下:modulefull_adder(a,b,s,ci,co);parameterN=1;inputN-1:0a,b;inputci;outputN-1:0s;outputco;assignco,s=a+b+ci;endmodule此外在music_player

32、模块下还要求编写beat_generator模块代码:modulebeat_generator(clk,ci,co);parameterN=1000;parameterCounterBits=10;outputco;inputci,clk;regCounterBits:1qout=0;assignco=(qout=(N-1)&ci;always(posedgeclk)beginif(ci)beginif(qout=(N-1)qout=0;elseqout=qout+1;endendendmodule三、主要仪器设备1 .装有ISE、ModelsimSE和ChipScopePro软件的计

33、算机。2 .XUPVirtex-nPro开发系统一套。3 .耳机一副。四、操作方法和实验步骤1 .编写mcu、song_reade丽note_player三个模块的VerilogHDL代码及其测试代码,并用Modelsim仿真。2 .将光盘中的ISE文件夹复制到硬盘中,打开music_player.ise工程文件。添加已设计的mcu、song_reader和note_player三个模块。3 .对工程进行综合、约束、实现,并下载工程文件到XUPVirtex-nPro开发实验板中。4 .将耳机接入实验开发音频输出插座,操作play、reset、next三个按键,试听耳机中乐曲并观察实验板上指示灯变化情况,验证设计结果是否正确。五、实验数据记录和处理1 .mcu仿真波形从图中可以看出,play_button按下后(play_button=0),待到下一个clk上升沿到来时,play=1,reset_player=0,乐曲开始播放;一首乐曲播放完后(song_done=1),在下一时钟周期reset_player=1,play=0,乐曲复位;按下一首(next_button=1),贝Uplay=1,reset_player=1,song加1(由0变成了1),即开始播放下一首乐曲。

温馨提示

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

最新文档

评论

0/150

提交评论