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

下载本文档

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

文档简介

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

2、的设计原理 根据实验任务可将系统分为主控制器(mcu)、乐曲读取(song_reader)、音符播放(note_player)、AC97音频接口(codec_conditioner)和ac97_if五个子模块,系统的总体框图如下: 各个模块的功能如下: 1.mcu模块接收按键信息,通知song_reader模块是否要播放(play)及播放哪首乐曲(song),若一曲播放结束则进入播放结束END状态。 2.song_reader模块根据mcu模块的要求,逐个取出音符note,duration送给note_player模块播放,当一首乐曲播放完毕,回复mcu模块乐曲播放结束信号(song_done

3、)。 3.note_player模块接收到需播放的音符,在音符的持续时间内,以48kHz速率送出该音符的正弦波样品给AC97音频接口模块。当一个音符播放结束,向song_reader模块发送一个note_done脉冲索取新的音符。 4.codec_conditiner、ac97_if模块负责与AC97音频系统接口工作,本实验已提供了这两个模块的代码。 另外,按键处理模块完成输入同步化、防颤动和脉宽变换等功能。1、 主控制模块mcu的设计mcu模块是主控制模块,有响应按键信息、控制系统播放两大任务,工作流程如下面的流程图所示。要求系统复位后经RESET状态初始化后进入WAIT状态等待按键输入或乐

4、曲播放结束应答,若有按键输入则转入相应的按键处理状态(NEXT或PLAY),若一曲播放结束则进入结束播放END状态。mcu的控制器算法流程图如下图:以下为mcu的端口含义引脚名称 I/O 引脚说明 clk Input 100MHz时钟信号 reset Input 复位信号,高电平有效 play_button Input “播放”按键,低电平有效 next_button Input “下一曲”按键,一个时钟周期宽度的高电平脉冲 play Output 高电平表示播放 song_done Output 当播放下一曲时,输出一个时钟周期宽度的高电平复位脉冲reset_play,并复位note_pla

5、yer模块 song_done Input note_player模块的应答信号一个时钟周期宽度的高电平脉冲表示一曲播放结束 song1:0 Output 当前乐曲的序号 结合以上算法流程图和端口定义,mcu模块代码如下:module mcu(clk, reset, play_button, next, play, reset_play, song, song_done );parameter RESET=0, WAIT=1, END=2, NEXT=3, PLAY=4;input reset, play_button,song_done,clk,next;output reg 1:0 son

6、g;output reg play, reset_play;reg state;always ( posedge clk )begin if (reset) begin play<=0; song<=2'b00;reset_play<=1; state<=RESET; end else case (state) RESET: begin reset_play<=0; state<=WAIT; end WAIT: if (song_done) begin state <=END; play<=0; reset_play<=1; end

7、 else if (next) begin state <=NEXT; play<=1; reset_play<=1; song<=song+1; end else if (play_button) begin state <=PLAY; play<=1; reset_play<=0; end else begin state <=WAIT; reset_play<=0; endEND, NEXT, PLAY: begin state <=WAIT; reset_play<=0; end endcaseendendmodule2

8、、 乐曲读取模块song_reader的设计乐曲读取模块song_reader的功能有:(1)根据mcu模块的要求,选择播放乐曲;(2)相应note_player模块请求,从song_rom中逐个取出音符note,duration送给note_player模块播放;(3)判断乐曲是否播放完毕,若播放完毕,则回复mcu模块应答信号。根据设计要求,以下是song_reader模块的结构框图根据设计要求,以下是song_reader模块的端口含义引脚名称 I/O 引脚说明 clk Input 100MH时钟信号 reset Input 复位信号,高电平有效 play Input 来自mcu的控制信号

9、,高电平播放 song1:0 Input 来自mcu的控制信号,当前播放乐曲的序号 note_done Input 来自模块note_player应答信号,一个时钟周期宽度的高电平脉冲表示一个音符播放结束song_done 0utput 给mcu的应答信号,当乐曲播放结束,输出一个时钟周期宽度的高电平脉冲 note5:0 Output 音符标记 duration5:0 Output 音符的持续时间 new_note Output 给note_player的控制信号,一个时钟周期宽度的高电平脉冲表示新的音符需播放 以下是song_reader的算法流程图地址计数器为5位二进制计数器,其中note

10、_done为计数允许输入,状态q为song_rom的低5位地址,song1:0为song_rom高两位地址。当地址计数器出现进位或duration为0时,表示乐曲结束,应输出一个时钟周期宽度的高电平脉冲信号song_done。结束判断模块应调用提供的模块one_pulse,使输出为一个时钟周期宽度的高电平脉冲。结合上图以及模块要求,编写song_reader代码如下:module song_reader(clk,reset,play,song,note_done,song_done,note,duration, new_note ); input clk,reset,play,note_don

11、e; input 1:0 song; output song_done, new_note; output 5:0 note, duration; parameter RESET=0, NEW_NOTE=1, WAIT=2, NEXT_NOTE=4; reg 1:0 STATE; reg new_note; always ( posedge clk ) begin if (reset=1) begin new_note<=0; STATE<=RESET; end else case (STATE)RESET: if (play=1) begin new_note<=1; ST

12、ATE<=NEW_NOTE; end elsebegin new_note<=0; STATE<=RESET; end NEW_NOTE:begin new_note<=0; STATE<=WAIT; end WAIT: if (play=1) if (note_done=1) begin new_note<=0; STATE<=NEXT_NOTE; end else begin new_note<=0; STATE<=WAIT; end else begin new_note<=0; STATE<=RESET; end NEX

13、T_NOTE: begin new_note<=1; STATE<=NEW_NOTE; end endcase end wire 4:0 q; wire co; song_rom song_rom1(.clk(clk),.dout(note,duration),.addr(song,q); addr_counter addr_counter1(.clk(clk),.reset(reset),.note_done(note_done),.q(q),.co(co); end_judging end_judging1(.co(co),.duration(duration),.clk(cl

14、k),.song_done(song_done);(返回给主控制器一个应答信号,即框图中的结束判断模块)endmodule其中模块end_judging的代码如下: module end_judging(co, duration, clk, song_done); parameter N=6; input co; input N-1:0 duration; input clk; output song_done; wire N-1:0 dd; wire qq; assign song_done = qq & dd; assign dd = co | (duration=6'b0

15、0000); D_FF dff1(.d(dd), .clk(clk), .q(qq);endmodule其中模块counter的代码如下: module addr_counter(clk,q,co,reset,note_done); input clk,reset,note_done; output reg 4:0 q; output co;assign co=note_done&&(&q); always (posedge clk)beginif(reset) begin q<=0; end else begin if(note_done) q<=q+1;

16、 else q<=q; end end endmodule 3、 音符播放模块note_player的设计音符播放模块note_player是本实验的核心模块,它的主要功能有:(1)从送song_reader模块接收所需播放的音符信息note,duration;(2)根据note值找出DDS的相位增量step_size;(3)以48kHz速率从Sine ROM取出正弦样品送给AC97接口模块;(4)当一个音符播放完毕,向song_reader模块索取新的音符。根据note_player模块的任务,进一步划分功能单元,为简化设计,可将产生正弦样品的DDS模块设计一个独立子模块sine_re

17、ader。 note_player控制器负责与song_reader模块接口,读取音符信息,并根据音符信息从Frequency ROM中读取相位增量step_size送给DDS子模块sine_reader。另外,note_player控制器还需要控制音符播放时间。note_player控制器的算法流程如下。在复位或未播放时,控制器处于RESET状态,PLAY为音符播放状态,当一个音符播放结束时,控制器进入DONE状态,PLAY为音符播放状态,当一个音符播放结束时,控制器进入DONE状态,置位done_with_note,向song_reader模块索取新的音符,然后进入LOAD状态,读取新的音

18、符后进入PLAY状态播放下一个音符。note_player模块的结构框图如下: note_player控制器的算法流程图如下:音符定时器为6位二进制计数器,beat、time_clear分别为使能、清0信号,均为高电平有效。定时时间为音符的长短(duration_to_load个beat周期),timer_done为定时结束标志。根据实验要求以下是note_player模块代码:module note_player(clk, reset, play_enable, note_to_load, duration_to_load, done_with_note, load_new_note,bea

19、t, generate_next_sample, sample_out, new_sample_ready);input clk; input reset; / When high we play, when low we don't. input play_enable; / The note to play input 5:0 note_to_load; / The duration of the note to play input 5:0 duration_to_load; / Tells us when we have a new note to load input loa

20、d_new_note; / When we are done with the note this stays high. output done_with_note; /reg done_with_note; / This is our 1/48th second beat input beat; / Tells us when the codec wants a new sample input generate_next_sample; / Our sample output output 15:0 sample_out; / Tells the codec when we've

21、 got a sample output new_sample_ready;wire19:0 step_size; sine_reader sine_reader_inst(.clk(clk), .reset(reset), .step_size(10'd18, 10'd791), .step_size(step_size), .generate_next_sample(generate_next_sample), .new_sample_ready(new_sample_ready), .sample_out(sample_out) ); (note_player控制器一段式

22、描述代码)parameter RESET=0,PLAY=1,LOAD=2,DONE=3;reg 1:0 state;reg done_with_note; reg timer_clear;wire timer_done;reg5:0 note;always ( posedge clk)if (reset) begin state<=RESET; note<=6'b0; done_with_note<=0; timer_clear<=1; end else case (state) RESET,LOAD,DONE: if (play_enable) begin s

23、tate<=RESET; note<=6'b0; done_with_note<=0; timer_clear<=1; end else if(load_new_note)begin state<=PLAY; done_with_note<=0; timer_clear<=0; endelse begin state<=LOAD; note<=note_to_load; done_with_note<=0; timer_clear<=1; end PLAY: if(timer_done) begin state<=

24、DONE; note<=note_to_load;done_with_note<=1; timer_clear<=1; end else if (play_enable) beginstate<=RESET; note<=6'b0; done_with_note<=0; timer_clear<=1; end else if(load_new_note) begin state<=PLAY; done_with_note<=0; timer_clear<=0; end else begin state<=LOAD; no

25、te<=note_to_load; done_with_note<=0; timer_clear<=1; enddefault:begin state<=RESET; note<=6'b0;done_with_note<=0; timer_clear<=1; end endcase frequency_rom frequency_rom_inst(.clk(clk),.dout(step_size),.addr(note); note_timer note_timer(.cin(duration_to_load),.en(beat),.clk(

26、clk),.r(timer_clear),.cout(timer_done);endmodule其中模块note_timer音符定时器代码如下:module note_timer (cout, cin , r, clk, en);parameter n=6;regn-1:0 q;output cout;inputn-1:0 cin;input r, clk, en;assign cout=en&&(q=(cin-1);always (posedge clk)if (r) q=0; else if(en) q =q + 1;else q = q; endmodule子模块sine

27、_reader的功能就是利用DDS技术产生正弦样品。在本实验中,系统时钟clk与取样脉冲generate_next_sample为两个不同信号;实验中相位增量为22位,其中小数部分为10位。对于step_size本身为20位二进制数的问题,可通过对其进行2b00,step_size处理使其扩展至22位。sine_reader原理框图:sine_rom的地址和数据处理方法:区域(raw_addr21:20) Sine Rom地址(rom_addr) Sample 00 raw_addr19:10 raw_data15:0 01 当raw_addr20:10=1024时,rom_addr取1023

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

29、ep_size; input clk, generate_next_sample, reset; output 15:0 sample_out; output new_sample_ready; wire 21:0 raw_addr; wire 21:0 sum; wire 9:0 rom_addr; wire 15:0 sample; wire 15:0 raw_data; full_adder #(22) adder(.a(raw_addr), .b(2'b00, step_size), .s(sum), .ci(1'b0), .co(); D_FFRE #(22) dff

30、r1(.d(sum), .en(generate_next_sample), .r(reset), .clk(clk), .q(raw_addr); addr_processor addr_pro(.in_addr(raw_addr20:10), .out_addr(rom_addr); sine_rom sine_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_F

31、FRE #(16) dffr2(.d(sample), .en(generate_next_sample), .r(reset), .clk(clk), .q(sample_out); D_FF dffr3(.d(generate_next_sample), .clk(clk), .q(new_sample_ready);endmodule其中地址处理(addr_processor)模块的代码如下:module addr_processor(in_addr, out_addr); input 10:0 in_addr; output 9:0 out_addr; assign out_addr9

32、:0=(in_addr10)?(in_addr10:0=1024)?1023:(in_addr9:0+1):in_addr9:0;endmodule其中数据处理模块(data_processor)的代码如下:module data_processor (flag, in_data, out_data); parameter N=1; input flag; input N-1:0 in_data; output N-1:0 out_data; assign out_data=(flag)?(in_data+1):in_data;endmodule其中加法器(full_addr)的代码如下:mo

33、dule full_adder(a, b, s, ci, co); parameter N=1; input N-1:0 a, b; input ci; output N-1:0 s; output co; assign co, s=a+b+ci;endmodule此外在music_player模块下还要求编写beat_generator模块代码:module beat_generator(clk,ci,co);parameter N=1000;parameter CounterBits=10;output co;input ci,clk;regCounterBits:1 qout=0;ass

34、ign co=(qout=(N-1)&ci;always(posedge clk)begin if(ci)begin if(qout=(N-1)qout=0;else qout=qout+1;endendendmodule三、主要仪器设备 1.装有ISE、Modelsim SE和ChipScope Pro软件的计算机。 2.XUP Virtex-Pro开发系统一套。 3.耳机一副。四、操作方法和实验步骤 1.编写mcu、song_reader和note_player三个模块的Verilog HDL代码及其测试代码,并用Modelsim仿真。 2.将光盘中的ISE文件夹复制到硬盘中,打开

35、music_player.ise工程文件。添加已设计的mcu、song_reader和note_player三个模块。 3.对工程进行综合、约束、实现,并下载工程文件到XUP Virtex-Pro 开发实验板中。 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),则pla

温馨提示

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

评论

0/150

提交评论