音乐播放器实验报告已验证

上传人:d****2 文档编号:177630350 上传时间:2022-12-26 格式:DOCX 页数:4 大小:55.69KB
返回 下载 相关 举报
音乐播放器实验报告已验证_第1页
第1页 / 共4页
音乐播放器实验报告已验证_第2页
第2页 / 共4页
音乐播放器实验报告已验证_第3页
第3页 / 共4页
点击查看更多>>
资源描述
音符播放模块 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 控制器还需要控制音符播放时间。在复位或未播放时,控制器处于RESET状态,PLAY为音符播放状态,当一个音 符播放结束时,控制器进入DONE状态,置位done_with_note,向song_reader模块 索取新的音符,然后进入LOAD状态,读取新的音符后进入PLAY状态播放下一个音 符。音符定时器为6位二进制计数器,beat、timer_clear分别为使能、清0信号,均 为高电平有效。定时时间为音符的长短(duration_tooad个beat周期),timer_done 为定时结束标志。(1) sine_reader sine_reader 是利用 DDS 技术产生正弦样品。DDS 的主要思想是,从相位的概念除法合成所需的波形,其结构由相位累加器, 相位-幅值转换器、D/A转换器和低通滤波器组成。Sine ROM中存放一个完整 的正弦信号样品,其映射关系为s(i)=(2人(n-l)-l)*sin(2*pi*i/2M)。其中,m为Sine ROM的地址线位数,n为rom的数据线宽度,s (i)数据形式为补码。f为取 样时钟elk的频率,k为相位增量。输出正弦信号频率fo=k*f/2Amo Sine_reader 基本原理框图如下:DDS 的优化:为了减少硬件复杂性,降低芯片面积和功耗,提高芯片速度, 对 DDS 进行了优化,利用正弦波的对称性,只需要存储四分之一的正弦信 号样品就可以提供整个波形。需要注意的是:Sine ROM存放的是四分之一的波形,因此一个完整的正弦波形存储容量需要多两 位。根据地址的高两位,我们可以把正弦信号分为四个区域,如右图所示 四分之一周期未给出地址为1024时的值,这一点取1023的值(1023时样品已经 达到最大值)。本实验中的sine_reader与实验20有3个不同点:(1)本实验的时钟clk (100MHz)与取样脉冲generate_next_sample (48kHz)为两个 不同信号;(2) 本实验取样频率为48kHz,速度较低,因此对加法器要求不高,没有必要采用,进 位选择加法器”技术;(3) 本实验的相位增量为 22 位,其中小数部分为 10 位。由于Sine ROM只给出四分之一周期的正弦样品,所以地址或数据也需要进行相应的处理,方法如下:区域Sine ROM 地址(rom_addr)Sample备注00raw addr19:10raw data15:001当 raw_addr20:0=1024 时, rom_addr取1023,其他情况取 raw addr19:10+1raw_data15:01024-raw_addr19:1010raw addr19:10raw data15:0+1数据取反11当 raw_addr20:0=1024 时, rom_addr取1023,其他情况取 raw addr19:10+1raw_data15:0+1数据取反sine_reader 代码:1 相位累加器 full_adder module full_adder(a, b, s, ci, co); parameter N=1;input N-1:0 a; input N-1:0 b;output N-1:0 s; input ci;output co; integer i; regN-1:0 s; reg N:0 c;assign co=cN; always (a or b or ci) beginc0=ci;for (i=0;i=N-1;i=i+1) beginsi= aiAbiAci; ci+1=ai&bi | ai&ci | bi&ci;end end endmodule2 地址处理模块 address_dealermodule address_dealer(raw_addr,rom_addr); input wire21:0 raw_addr; output reg9:0 rom_addr;always(*)begin case(raw_addr21:20) 2b00:rom_addr=raw_addr19:10;2b01:if(raw_addr20:10=1024) rom_addr=1023; else rom_addr=(raw_addr19:10+1);2b10:rom_addr=raw_addr19:10;2b11:if(raw_addr20:10=1024) rom_addr=1023; else rom_addr=(raw_addr19:10+1); default:rom_addr=10b0;endcaseendendmodule3 数据处理模块module data_dealer(raw_data,a,sample);input wire a;input wire 15:0 raw_data;output reg 15:0 sample;always(*)begincase(a)0:sample=raw_data15:0; 1:sample=(raw_data15:0+1); default:sample=0;endcaseendendmodule4 Sine Rom(已提供)5 D 触发器 无使能端和复位端 module D_FF (d, clk, q);parameter WIDTH = 1;input clk;input WIDTH-1:0 d;output WIDTH-1:0 q;reg WIDTH-1:0 q;always (posedge clk)q = d;endmodule有使能端无复位端module D_FFE(d,en,clk,q);parameter WIDTH = 1;input en;input clk;input WIDTH-1:0 d;output WIDTH-1:0 q;reg WIDTH-1:0 q;always (posedge clk)beginif (en) q = d;else q = q;endendmodule有使能端和复位端module D_FFRE(d,en,r,clk,q);parameter WIDTH = 1;input en;input r;input clk;input WIDTH-1:0 d;output WIDTH-1:0 q;reg WIDTH-1:0 q;always (posedge clk)if ( r )q = WIDTH1b0;else if (en) q = d; else q = q;endmodule6sine_reader 顶层模块 modulesine_reader(step_size,clk,reset,generate_next_sample,sample_out,new_sample_ready);input clk,reset,generate_next_sample;input 19:0 step_size;output 15:0 sample_out;output new_sample_ready;wire 21:0 s,raw_addr;full_adder #(22) adder_inst(.a(raw_addr),.b(2b00,step_size),.s(s),.co(),.ci(0);D_FFRE #(22) generate_next_latch(.d(s),.clk(clk),.r(reset),.en(generate_next_sample),.q(raw_addr);wire 9:0 rom_addr;address_dealer address_dealer_inst(.raw_addr(raw_addr),.rom_addr(rom_addr); wire 15:0 raw_data;sine_rom sine_rom_inst(.addr(rom_addr),.clk(clk),.dout(raw_data);wire 15:0 sample; data_dealer data_dealer_a(.raw_data(raw_data),.a(raw_addr21),.sample(sample);D_FFE #(16) sample_latch (.d(sample),.en(generate_next_sample),.clk(clk),.q(sample_out);D_FF next_sample_latch(.d(generate_next_sample),.clk(clk),.q(new_sample_ready);endmodulesine_reader 的 modelsim 仿真
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!