音乐播放器实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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