18. SD卡音乐播放 |
您所在的位置:网站首页 › 电脑如何源码输出音频文件格式 › 18. SD卡音乐播放 |
18.2.3. 程序设计¶
硬件资源介绍完毕,我们开始实验工程的程序设计。在本小节,我们采用先整体概括,再局部说明的方式对实验工程的各个模块进行讲解。 18.2.3.1. 整体说明¶根据实验目标可知,实现音乐播放首先需要有SD卡控制模块将SD内存储的音乐读取出来,同时还需要一个控制音频数据播放的模块,当然音乐要想播放出来WM8978控制模块也必不可少。因为SD卡的控制时钟sys_clk与WM8978的控制时钟audio_bclk的频率是不一样的,所以这里我们需要调用一个fifo 来实现跨时钟域的数据传输。完整的模块框图如图 68‑6所示。 图 68‑6 SD卡音乐播放工程整体框图 由图 68‑6所示:其中的sd_ctrl模快与wm8978_ctrl模块在前面章节都有讲解,clk_gen与fifo_data为调用的IP核,sd_play_ctrl模块为SD卡音乐播放控制模块。下面对工程各模块的功能描述做个说明,如表格 68‑2所示。 表格 68‑2 audio_sd_play工程模块简介 模块名称 功能描述 clk_gen 时钟生成模块 fifo_data fifo数据缓存模块 sd_ctrl SD卡控制模块 WM8978_ctrl WM8978音频控制模块 sd_play_ctrl SD卡音乐播放控制模块 audio_sd_play 音乐播放顶层模块 下面对各模块做详细介绍。 18.2.3.2. 时钟生成模块¶该模块通过调用PLL IP核来实现,总共输出3个时钟,频率分别为12MHz时钟、50MHz时钟、50MHz(相位偏移90°)。其中12MHz时钟作为wm8978的主时钟,50MHz作为系统时钟,50MHz(相位偏移90°)作为SD卡输入工作时钟。 调用IP核的方法在IP核章节已经做了详细介绍,我们只需按照调用步骤生成这四个时钟即可,在此就不再过多介绍。 18.2.3.3. FIFO数据缓存模块¶该模块同样通过调用FIFO IP核来实现,由于SD卡的工作时钟与WM8978的工作时钟频率不一致,所以调用时我们需要选择不同时钟进行读写,同时输出fifo内剩余数据量信号以及fifo清空信号。这里我们把fifo的数据位宽设置为16bit,深度设置为1024。具体的调用步骤可参考IP核章节fifo的调用方法。 18.2.3.4. SD卡控制模块¶我们通过该模块进行对SD卡内的的音乐数据进行读取,该模块在《SD卡数据读写控制》章节已经有了详细的讲解,模块框图如下所示: 图 68‑7 SD卡控制模块框图 因为我们只需要从里面读出音乐,所以我们只需控制其读端口信号即可。该模块我们直接调用即可,不明白的读者可先回到《SD卡数据读写控制》章节进行学习。 18.2.3.5. WM8978音频控制模块¶模块框图 图 68‑8 WM8978音频控制模块框图 该模块与《WM8978录音与回放》章节模块几乎是一样的,不同的是寄存器的配置,其余模块是相同的。我们只需更改寄存器配置模块的代码即可,下面给出寄存器的配置模块参考代码,如代码清单 68‑1所示。 代码清单 68‑1 SD卡音乐播放WM8978寄存器配置模块参考代码(i2c_reg_cfg.v) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92module i2c_reg_cfg ( input wire i2c_clk , //系统时钟,由i2c模块传入 input wire sys_rst_n , //系统复位,低有效 input wire cfg_end , //单个寄存器配置完成 output reg cfg_start , //单个寄存器配置触发信号 output wire [15:0] cfg_data , //寄存器地址7bit+数据9bit output reg cfg_done //寄存器配置完成 ); //// //\* Parameter and Internal Signal \// //// //parameter define parameter REG_NUM = 6'd15 ; //总共需要配置的寄存器个数 parameter CNT_WAIT_MAX = 10'd1000 ; //上电等待1ms后开始配置寄存器 parameter LOUT1VOL = 6'd30 ; //耳机左声道音量设置(0~63) parameter ROUT1VOL = 6'd30 ; //耳机右声道音量设置(0~63) parameter SPK_LOUT2VOL = 6'd50 ; //扬声器左声道音量设置(0~63) parameter SPK_ROUT2VOL = 6'd50 ; //扬声器右声道音量设置(0~63) //wire define wire [15:0] cfg_data_reg[REG_NUM-1:0]; //寄存器配置数据暂存 //reg define reg [9:0] cnt_wait ; //寄存器配置上电等待计数器 reg [5:0] reg_num ; //配置寄存器个数 //// //\* Main Code \// //// //cnt_wait:寄存器配置等待计数器 always@(posedge i2c_clk or negedge sys_rst_n) if(sys_rst_n == 1'b0) cnt_wait |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |