实验报告
课程名称: 数字系统设计实验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 开发系统一套test rver
四、设计过程
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)相位累加器sample textfull_adder :
sbh
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
ca(raw_addr[21:20])
2'b00:rom_addr<=raw_addr[19:10];
2'b01:
if(raw_addr[20:10]==1024) rom_addr<=1023;
el 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;
el rom_addr<=(~raw_addr[19:10]+1);
default:rom_addr<=10'b0;
endca
寻找我的钱包
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
ca (ctrl)
1:sample<=raw_data[15:0];
0:sample<=(~raw_data[15:0]+1);
default:sample<=16'b0;
endca
end
endmodule
进行数据处理
(iv)D触发器
无使能及重置端
module dff(d,clk,q);
英译汉翻译软件input clk;
input d;
output reg q;