音乐播放器实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告

课程名称:数字系统设计实验1 指导老师:成绩:__________________ 实验名称:音乐播放实验实验类型:设计型同组学生姓名:_ 无

一、实验目的和要求(必填)二、实验内容和原理(必填)

三、主要仪器设备(必填)四、操作方法和实验步骤

五、实验数据记录和处理六、实验结果与分析(必填)

七、讨论、心得

一、实验目的和要求

1、掌握音符产生的方法,了解DDS技术的应用。

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

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

二、实验内容和原理

i实验内容:设计一个音乐播放器

ii实验原理:系统划分为主控制器(mcu)、乐曲读取(song_reader)、音符播放器(note_player)、AC97音频接口(codec_conditioner)和ac97_if五个子模块。

系统图如下:

mcu接收按键信息,通知song_reader是否要播放(play)以及播放播放哪一首歌曲(song)。

song_reader模块根据mcu要求逐个取出音符{note,duration}送给note_player,乐曲播放完毕回复(song_done)给mcu。

note_player接收音符后以48kHz速率送出该音符的正弦波样品给AV97音频接口模块。当一个音符播放结束,向song_reader回复note_done。

codec_conditioner、ac97_if负责与AC97接口工作。

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

三、主要仪器设备

带modelsim和ISE 的PC机,XUP Virtex-II Pro 开发系统一套

四、设计过程

1.音符播放器(note_player)的设计

主要任务有:

●从song_reader模块接收所需播放的音符信息{note,duration};

●根据note值找出DDS的相位增量;

●以48khz的速率从sine rom取出正弦样品送给AC97接口模块;

●当一个音符播放完毕,向song_rom模块索取新的音符。

Note_palyer的结构框图如下:

各个端口含义如下:

(1)DDS设计

DDS的主要思想是,从相位的概念除法合成所需的波形,其结构由相位累加器,相位-幅值转换器、D/A 转换器和低通滤波器组成。Sine ROM中存放一个完整的正弦信号样品,其映射关系为s(i)=(2^(n-1)-1)*sin(2*pi*i/2^n)。其中,m为Sine ROM的地址线位数,n为rom的数据线宽度,s(i)数据形式为补码。f为取样时钟clk的频率,k为相位增量。输出正弦信号频率fo=k*f/2^m。基本原理框图如下:

DDS的优化:为了减少硬件复杂性,降低芯片面积和功耗,提高芯片速度,对DDS进行了优化,利用正弦波的对称性,只需要存储四分之一的正弦信号样品就可以提供整个波形。需要注意的是:

⏹Sine ROM存放的是四分之一的波形,因此一个完整的正弦

波形存储容量需要多两位。

⏹四分之一周期未给出地址为1024时的值,这一点取1023

的值(1023时样品已经达到最大值)。

为了得到准确的正弦频率,本实验的相位增量为22位,其中小

数部分为10位。

根据地址的高两位,我们可以把正弦信号分为四个区域,如右

图所示

在每个区域的地址和数据的处理方法见下表

Sine_reader代码

(i)相位累加器full_adder :

module full_adder(in1,in2,adderout,co);

parameter N=1;

input[N-1:0] in1,in2;

output[N-1:0] adderout;

output reg co;

wire [N-1:0] in1,in2;

reg [N-1:0] adderout;

always @ (in1 or in2)begin

{co,adderout}=in1+in2;

end

endmodule

(ii)地址处理模块address_dealer:module address_dealer(raw_addr,rom_addr); input wire [21:0] raw_addr;

output reg [9:0] rom_addr;

always@(*)

begin

case(raw_addr[21:20])

2'b00:rom_addr<=raw_addr[19:10];

2'b01:

if(raw_addr[20:10]==1024) rom_addr<=1023; else rom_addr<=(~raw_addr[19:10]+1);

2'b10:rom_addr<=raw_addr[19:10];

2'b11:

if(raw_addr[20:10]==1024) rom_addr<=1023; else rom_addr<=(~raw_addr[19:10]+1); default:rom_addr<=10'b0;

endcase

end

endmodule

进行地址处理,输入Sine ROM中

(iii)数据处理模块data_dealer:

module data_dealer(ctrl,raw_data,sample); input wire ctrl;

input wire [15:0] raw_data;

output reg [15:0] sample;

always @ (*)

begin

case (ctrl)

1:sample<=raw_data[15:0];

0:sample<=(~raw_data[15:0]+1);

default:sample<=16'b0;

endcase

end

endmodule

相关文档
最新文档