当前位置:文档之家› 数字系统设计音乐播放器

数字系统设计音乐播放器

一、实验目的和要求(必填) 二、实验内容和原理(必填)三、主要仪器设备(必填) 四、操作方法和实验步骤 五、实验数据记录和处理六、实验结果与分析(必填)七、 讨论、心得一、实验目的和要求:实验目的:(1)掌握音符产生的方法,了解DDS 技术的应用。

(2)了解AC97音频接口电路的应用。

(3)掌握系统“自顶而下”的设计方法。

实验任务:设计一个音乐播放器。

(1)可以播放四首乐曲,设置play 、next 、reset 三个按键。

按play 键播放当前乐曲,按next 键播放下一首乐曲。

(2)LED0指示播放情况(播放时点亮)、LED2和LED3指示当前乐曲序号。

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

模块根据mcu模块的要求,逐个取出音符{note,duration}送给note_player模块播放,当一首乐曲播放完毕,回复mcu模块乐曲播放结束信号(song_done)。

模块接收到需播放的音符,在音符的持续时间内,以48kHz速率送出该音符的正弦波样品给AC97音频接口模块。

当一个音符播放结束,向song_reader模块发送一个note_done脉冲索取新的音符。

、ac97_if模块负责与AC97音频系统接口工作,本实验已提供了这两个模块的代码。

另外,按键处理模块完成输入同步化、防颤动和脉宽变换等功能。

1、主控制模块mcu的设计mcu模块是主控制模块,有响应按键信息、控制系统播放两大任务,工作流程如下面的流程图所示。

要求系统复位后经RESET状态初始化后进入WAIT状态等待按键输入或乐曲播放结束应答,若有按键输入则转入相应的按键处理状态(NEXT或PLAY),若一曲播放结束则进入结束播放END状态。

mcu的控制器算法流程图如下图:以下为mcu的端口含义结合以上算法流程图和端口定义,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] song;output reg play, reset_play;reg state;always @( posedge clk )beginif (reset)begin play<=0; song<=2'b00;reset_play<=1; state<=RESET; endelsecase (state)RESET:begin reset_play<=0; state<=WAIT; endWAIT:if (song_done)begin state <=END; play<=0; reset_play<=1; endelse 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; endelsebegin state <=WAIT; reset_play<=0; endEND, NEXT, PLAY:begin state <=WAIT; reset_play<=0; endendcaseendendmodule2、乐曲读取模块song_reader的设计乐曲读取模块song_reader的功能有:(1)根据mcu模块的要求,选择播放乐曲;(2)相应note_player模块请求,从song_rom中逐个取出音符{note,duration}送给note_player模块播放;(3)判断乐曲是否播放完毕,若播放完毕,则回复mcu模块应答信号。

根据设计要求,以下是song_reader模块的结构框图根据设计要求,以下是song_reader模块的端口含义以下是song_reader的算法流程图地址计数器为5位二进制计数器,其中note_done 为计数允许输入,状态q为song_rom的低5位地址,song[1:0]为song_rom高两位地址。

当地址计数器出现进位或duration为0时,表示乐曲结束,应输出一个时钟周期宽度的高电平脉冲信号song_done。

结束判断模块应调用提供的模块one_pulse,使输出为一个时钟周期宽度的高电平脉冲。

结合上图以及模块要求,编写song_reader代码如下:modulesong_reader(clk,reset,play,song,note_done,song_done,note,duration,new_note );input clk,reset,play,note_done;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 )beginif (reset==1) begin new_note<=0; STATE<=RESET; end elsecase (STATE)RESET:if (play==1)begin new_note<=1; STATE<=NEW_NOTE; endelsebegin new_note<=0; STATE<=RESET; endNEW_NOTE:begin new_note<=0; STATE<=WAIT; endWAIT:if (play==1)if (note_done==1)begin new_note<=0; STATE<=NEXT_NOTE; endelsebegin new_note<=0; STATE<=WAIT; endelse begin new_note<=0; STATE<=RESET; endNEXT_NOTE:begin new_note<=1; STATE<=NEW_NOTE; endendcaseendwire [4:0] q;wire co;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));(返回给主控制器一个应答信号,即框图中的结束判断模块)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'b00000);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; endelsebegin if(note_done) q<=q+1;elseq<=q;endendendmodule3、音符播放模块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_reader。

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状态,读取新的音符后进入PLAY状态播放下一个音符。

note_player模块的结构框图如下:note_player控制器的算法流程图如下:音符定时器为6位二进制计数器,beat、time_clear分别为使能、清0信号,均为高电平有效。

相关主题