基于sopc的sd卡wav音频播放器设计文档内容摘要:

块是重点设计模块,它直接关系到最后音乐输出的效果(放快了还是放慢了,音乐有无明显失真) 设计思想: 当 cpu播放某一首歌曲前, 会先得到歌曲的采样频率(采样频率存储在 wav文件中) 然后 cpu根据不同的采样频率向 FIFO输出不同的 mode[2..0]并使 rst(输出使能控制)无效(正常输出)。 在 FIFO内部有一个深度为 1024,宽度为 8位的寄存器数组 , dataout[7..0]按采样频率循环输出第 0到第 1023寄存器中数据。 这 1024个寄存器被均分为两块,上下各 512。 在输出第 0个数据和第 512个数据时让 wren为高电平,其余时刻均为低电平。 当 cpu从 SD卡中读取到新数据后,要等到 wren 为高电平后,才通过数据线 data[7..0]及 wrclk(上升沿写入数据) 向FIFO写入 512 个数据。 写入数据时, FIFO内部自动根据当前播放的是哪一个块(上面的 512还是下面的 512) 把数据写入另一个块中,就实现了数据不会丢失 (在一个块没有播放完时,这个块不会被新数据覆盖 )。 cpu 在 150M时钟频率下,足够在 FIFO播放的同时准备好下一个 512字节的数据。 附 FIFO verilog 代码: module fifo(clk,rst,mode,wrclk,datain,wren,dataout)。 parameter f8K=3125。 parameter f16K=1563。 parameter f24K=1042。 parameter f32K=783。 parameter f44K=567。 input clk。 input rst。 input wrclk。 input [2:0] mode。 input [7:0] datain。 output [7:0] dataout。 reg [7:0] dataout。 reg rdclk。 reg [7:0] data [0:1023]。 reg [10:0] rdptr =0。 reg [10:0] wrptr=0。 reg [11:0] t=0。 reg flag。 output wren。 always@(posedge clk or negedge rst)//产生输出时钟 begin if(~rst) else begin case (mode) 339。 d0:begin t=t+139。 b1。 if(t==f8K) begin rdclk=~rdclk。 t=0。 end end 339。 d1:begin t=t+139。 b1。 if(t==f16K) begin rdclk=~rdclk。 t=0。 end end 339。 d2: begin t=t+139。 b1。 if(t==f24K) begin rdclk=~rdclk。 t=0。 end end 339。 d3:begin t=。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。