1、 MP3 播放器说明文档播放器说明文档 目录目录 一、实现过程 3 二、代码说明 5 2.1 设计代码. 5 2.1.1 顶层模块: 【songer.vhd】 . 5 2.1.2 乐谱发生模块【NoteTabs.vhd】 6 2.1.3 乐谱码查表模块【ToneTaba.vhd】 8 2.1.4 时钟分频模块【DCM_12MHZ.vhd】 9 2.1.5 数控分频模块【Speakera.vhd】 . 10 2.2.测试代码:. 11 2.2.1 测试顶层模块 【tb_songer.vhd】 11 2.2.2 测试 Speakera 模块 【tb_spk.vhd】 12 2.2.3 测试 DCM
2、_12MHZ 模块 【tb_clk12mhz.vhd】 . 13 三、操作过程 14 一、实现过程一、实现过程 1. 制作乐谱查找表:找出不同音符的发音频率,寻找最佳待分频频率,计算分频数和 分频预置数,制作乐谱查找表。如何选择基准频率很关键。若基准频率比较小,用他除以音 符频率得到的分频系数也就比较小, 这样的话进行四舍五入后误差相对而言会比较大。 若基 准频率偏大, 分频系数也就偏大, 这会增加系统的负担。 综合考虑分频系数的准确性和大小, 基准频率为 750 khz 是比较合适的。由于我们从开发板的内部时钟分频得到的 750 khz 的频 率信号是脉宽极窄的尖脉冲信号, 为了提高扬声器有
3、足够的功率发音, 我们对尖脉冲信号再 进行二分频,得到对称方波后再输出。因此,在表 1 中,就是以 375 khz 为基准频率计算了 各个音符的分频系数和分频预置数。选择 11 位二进制数表示分频系数和分频预置数(计数 初值) ,因此最大值为 2047。休止符不用进行分频,分频系数为 0,频率为 375000hz。 分频系数和分频预置数的计算方法: 分频系数=375000/音符频率 分频预置数(计数初值)=2047-分频系数 表 1 各个音符的频率及其对应的分频系数(基准频率 375KHz) 音符名 频 率 (Hz) 分频 系数 计数 初值 音符名 频 率 (Hz) 分频 系数 计数 初值 休
4、止符 375000 0 2047 中音 4 698.456 537 1510 低音 1 261.525 1435 513 中音 5 783.990 478 1569 低音 2 293.664 1277 770 中音 6 880 426 1621 低音 3 329.627 1138 909 中音 7 987.766 380 1667 低音 4 349.228 1022 1025 高音 1 1046.502 358 1689 低音 5 391.995 957 1090 高音 2 1147.659 327 1720 低音 6 440 852 1195 高音 3 1318.510 284 1763 低
5、音 7 493.883 759 1288 高音 4 1396.919 268 1799 中音 1 523.251 717 1330 高音 5 1567.981 239 1808 中音 2 587.329 638 1409 高音 6 1760 213 1834 中音 3 656.255 571 1476 高音 7 1975.537 190 1857 2. 预置曲谱:定义一个转换规则,将音乐音符转换为代码预置在程序里。我们称预置 在程序里的代码为乐谱代码。音符转换为乐谱代码的规则为:休止符转换为代码 0,低 音 1-低音 7 转换为代码 1-7,中音 1-中音 7 转换为代码 8-14,高音 1-
6、高音 7 转 换为 15-21。现在一般乐曲中,最小的节拍为 1/4 拍。若定义 1 拍的持续时间为 1 秒,那 么 1/4 拍的持续时间就为 1/4 秒,即 0.25 秒。其他的节拍数为 1/4 拍的整数倍,因此他们 的持续时间就为 0.25 秒的整数倍。将乐曲中每个音符以及持续的节拍数写进程序,定义一 个 4hz 的时钟频率, 每当时钟上升沿来临时就输出 1/4 拍音符, 若是其他 1/4 拍整数倍的音 符就连续输出整数倍的次数。这样,音符就源源不断的输出了。 3.3. 对预置的曲谱码在乐谱查表码里进行查找,找出相应音符对应频率的分频系数和分 频预置数。 4. 根据查找到的分频预置数对待分频频率(750khz)进行分频并把输出连接到集成运 放电路 Vin实现音量调节。音量调节的原理图如图 1 所示。按图 1 所示电路图连接电路,Vout 接扬声器。通过调节滑动变阻器 R2 就调节音量。 图 1 音量控制电路 二、二、代码说明代码说明 2.1 设计代码设计代码 2.1.1顶层模块:顶层模块: 【songer.vhd】 library IEEE; use IEEE.STD_LO