基于EDA音乐播放器的设计.doc_第1页
基于EDA音乐播放器的设计.doc_第2页
基于EDA音乐播放器的设计.doc_第3页
基于EDA音乐播放器的设计.doc_第4页
基于EDA音乐播放器的设计.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 长 沙 学 院 课程设计说明书 题目 音乐播放器的设计 系 部 电子与通信工程 专业 班级 电气工程及其自动化 一班 姓名 学号 指导教师 起止日期 2010 11 29 至 2010 12 10 2 EDA 技技术术课课程程设计设计任任务书务书 系 部 电子与通信工程系 专业 电气工程及其自动化 指导教师 课题名称音乐播放器的设计 设 计 内 容 及 要 求 在 SOPC 开发平台上实现一个音频信号发生器 编写 3 段音乐 利用 开发平台的蜂鸣器来播放几段音乐 可进行自动循环播放和手动播放两个 模式的选择 如果为手动播放 则通过拨动拨码开关第 1 2 位选择 播 放音乐时 要求将该音乐的序号 分别为 A1 A2 A3 以及该音乐播放剩 余的时间 分 秒 显示在数码管上 当某首音乐开始播放时 音乐序号闪 烁显示 3 秒钟 系统提供 50MHZ 频率的时钟源 完成该系统的硬件和软件的设计 并 制作出实物装置 调试好后并能实际运用 指导教师提供制作所需的器件 最后就课程设计本身提交一篇课程设计说明书 设 计 工 作 量 1 VHDL 语言程序设计 2 波形仿真 3 在实验装置上进行硬件测试 并进行演示 4 提交一份完整的课程设计说明书 包括设计原理 程序设计 程序分 析 仿真分析 硬件测试 调试过程 参考文献 设计总结等 起止日期 或时间量 设计内容 或预期目标 备注 第 1 天课题介绍 答疑 收集材料 第 2 天设计方案论证 第 3 天 进一步讨论方案 对设计方案进行必要的 修正 方案确定后开始进行 VHDL 语言程 序设计 第 4 天设计 VHDL 语言程序 第 5 9 天 在实验装置上进行硬件测试 对 VHDL 语 言程序进行必要的修正 并进行演示 进 度 安 排 第 10 天编写设计说明书 教研室 意见 年 月 日 系 部 主 管领导意见 年 月 日 3 长沙学院课程设计鉴定表 姓名学号专 业 电气工程及其自动化班级一 班 设计题目音乐播放器的设计指导教师 指导教师意见 评定等级 教师签名 日期 答辩小组意见 评定等级 答辩小组长签名 日期 教研室意见 教研室主任签名 日期 系 部 意见 系主任签名 日期 说明 课程设计成绩分 优秀 良好 及格 不及格 四类 目录目录 4 摘要摘要 5 设计原理设计原理 5 程序 程序 6 实验现象 实验现象 14 引脚分配 引脚分配 14 仿真波形 仿真波形 15 心得体会 心得体会 16 参考文献 参考文献 16 摘要摘要 5 在 SOPC 开发平台上实现一个音频信号发生器 编写 3 段音乐 利用开发平台的蜂鸣 器来播放几段音乐 可进行自动循环播放和手动播放两个模式的选择 如果为手动播放 则通过拨动拨码开关第 1 2 位选择 播放音乐时 要求将该音乐的序号 分别为 A1 A2 A3 以及该音乐播放剩余的时间 分 秒 显示在数码管上 当某首音乐开始播放 时 音乐序号闪烁显示 3 秒钟 关键字 关键字 SOPC 音频信号 音乐 蜂鸣器 自动循环 手动播放 剩余时间 分钟 秒钟 显 示 音乐序号 A1 A2 A3 显示 设计原理设计原理 首先采用分块设计法 将设计分为分频模块 时间动态扫描显示模块 音乐播放模块 顶层模块 其中音乐播放模块又可分为音频模块 音乐代码模块 预置数模块 利用计数的方式将 50MHZ 的频率分为 12MHz 100Hz 8Hz 1Hz 音乐播放模块需要完成以下设计 预置乐曲 本次设计选取了 梁祝 的一段作预置 在作预置时 需要将乐曲音符 转换成相应的代码 通过计算逐一将音符转换成代码 通过 EDA 开发平台 quartus 进行 乐曲定制 为了提供乐曲发音所需要的发音频率 编写数控分频器程序 对单一输入高频 进 行预置数分频 生成每个音符发音的相应频率 为了给分频提供预置数 需要计算分频预置数 对每部分结构单元逐一进行编译 生成相应的元器件符号 并对独立结构单元功能进 行仿真 音调的控制 频率的高低决定了音调的高低 综合考虑各因素 本次设计中选取 12MHZ 作为 CLK 的 分频计数器的输入分频信号 由于乐曲都是由一连串的音符组成 因此按照乐曲的乐谱依 次输出这些音符相对应的频率 就可以在蜂鸣器上连续地发出各个音符的音调 表 1 简谱中的音名与频率的关系 音名频率 Hz音名频率 Hz音名频率 Hz 低音 1 261 6 中音 1 523 3 高音 1 1045 5 低音 2 293 7 中音 2 587 3 高音 2 1174 7 低音 3 329 6 中音 3 659 3 高音 3 1318 5 低音 4 349 2 中音 4 698 5 高音 4 1396 9 低音 5 392 中音 5 784 高音 5 1568 低音 6 440 中音 6 880 高音 6 1760 低音 7 493 9 中音 7 987 8 高音 7 1975 5 音长的控制 这次设计中所演奏的乐曲的最短的音符为四分音符 如果将全音符的持续时间设为 1s 的话 那么一拍所应该持续的时间为 0 25 秒 则只需要再提供一个 4Hz 的时钟频率即 可产生四分音符的时长 系统工作时就按 4Hz 的频率依次读取简谱 当系统读到某个音符 的简谱时就对应发这个音符的音调 持续时间为 0 25 秒 如果在曲谱文件中某个音符为三 拍音长 只要将该音符连续书写三遍 系统读乐曲文件的时候就会连续读到三次 也就会 发三个 0 25 秒的音长 这时我们听上去就会持续了三拍的时间 这样就可以控制音乐的 6 音长了 程序程序 音乐播放器顶层模块 library ieee use ieee std logic 1164 all entity songer is port clk50mhz c in std logic led7s buffer std logic vector 6 downto 0 led selout out std logic vector 7 downto 0 spkout out std logic end architecture one of songer is component notetabs port clk in std logic f1s f8 f12 fs out std logic end component component notetabs port clk in std logic toneindex out std logic vector 3 downto 0 end component component tonetaba port index in std logic vector 3 downto 0 tone out std logic vector 10 downto 0 end component component speakera port clk in std logic tone in std logic vector 10 downto 0 spks out std logic end component component daojishi port clk1 clk2 c in std logic led7s buffer std logic vector 6 downto 0 led selout out std logic vector 7 downto 0 end component signal tone std logic vector 10 downto 0 signal toneindex std logic vector 3 downto 0 signal ff1 ff8 ff12 ffs std logic vector begin u1 fp port map clk clk50mhz f1s ff1 f8 ff8 f12 ff12 fs ffs u2 notetabs port map clk ff8 toneindex toneindex 7 u3 tonetaba port map index toneindex tone tone u4 speakera port map clk ff12 tone tone spks spkout u5 daojishi port map clk1 ff1 clk2 ffs c c led7s led7s led selout led selout end 分频模块 library ieee use ieee std logic 1164 all use ieee std logic unsigned all entity fp is port clk in std logic f1s f8 f12 fs out std logic end architecture bhv of fp is signal a c f std logic signal a2 c2 f2 std logic begin process clk variable cnt24 std logic vector 25 downto 0 variable cnt8 std logic vector 7 downto 0 begin if clk event and clk 1 then if cnt24 01011111010111100001000000 then cnt24 cnt24 1 f1s 0 elsif cnt24 10111110101111000010000000 then cnt24 cnt24 1 f1s 1 else cnt24 00000000000000000000000000 end if if cnt8 1100100 then cnt8 cnt8 1 fs 0 elsif cnt8 11001000 then cnt8 cnt8 1 fs 1 else cnt8 00000000 end if end if 8 end process process clk a variable cnt std logic vector 2 downto 0 begin if clk event and clk 1 then if cnt 111 then cnt 011 a 1 else cnt cnt 1 a 0 end if end if if a event and a 1 then c not c if c 1 then f 1 else f 0 end if end if f12 f end process process clk a2 variable cn std logic vector 22 downto 0 begin if clk event and clk 1 then if cn 10111110101111000010000 then cn 01011111010111100001000 a2 1 else cn cn 1 a 0 end if end if if a2 event and a2 1 then c2 not c2 if c2 1 then f2 1 else f2 0 end if end if f8tone 11111111111 code 0000 hightone 01100000101 code 0001 hightone 01110010000 code 0010 hightone 10000001100 code 0011 hightone 10010101101 code 0101 hightone 10100001010 code 0110 hightone 10101011100 code 0111 hightone 10110000010 code 0001 hightone 10111001000 code 0010 hightone 11000000110 code 0011 hightone 11001010110 code 0101 hightone 11010000100 code 0110 hightone 11011000000 code 0001 highnull end case end process end 模块 tonetaba 的功能首先是为 speakera 提供决定音符发音的分频预置数 而此数在 speakera 输入口停留时间即为此音符的节拍值 模块 tonetaba 是乐曲简谱码对应的分频预 置数查表电路 其中设置了 梁祝 乐曲全部音符所对应的分频预置数 共 13 个 每一个 音符的停留时间由音乐节拍和音调发生器模块 notetabs 的 clk 输入频率决定 在此时为 4HZ 每一个计数值停留时间为 0 25 秒 恰为当全音符为 1 秒时 四四拍的 4 分音符持 续时间 这 13 个值的输出由对应于 tonetaba 的 4 位输入值 index 3 0 确定 而 index 3 0 最 多有 16 种选择 输向 tonetaba 中 index 3 0 的值 toneindex 3 0 的输出值与持续的时间 由模块 notetabs 决定 音频模块 library ieee use ieee std logic 1164 all use ieee std logic unsigned all entity speakera is port clk in std logic 10 tone in std logic vector 10 downto 0 spks out std logic end architecture one of speakera is signal preclk fullspks std logic begin divideclk process clk variable count4 std logic vector 3 downto 0 begin preclk11 then preclk 1 count4 0000 elsif clk event and clk 1 then count4 count4 1 end if end process genspks process preclk tone variable count11 std logic vector 10 downto 0 begin if preclk event and preclk 1 then if count11 16 7ff then count11 tone fullspks 1 else count11 count11 1 fullspks 0 end if end if end process delayspks process fullspks variable count2 std logic begin if fullspks event and fullspks 1 then count2 not count2 if count2 1 then spks 1 else spks 0 end if end if end process end 它是由一个初值可变的加法计数器组成 为了得到合适的发音频率 在进行预置计数 分频之前需要将本文选择的 12MHz 初始频率信号进行十六分频 采用四位加法计数方式 分频 当输入一个脉冲信号 计数器做一次加法计数 此时输入信号脉宽展宽一倍 即进 行一次二分频 十六分频后得到 0 75MHz 输入频率 由于数控分频器输出的信号是脉宽 很窄的信号 为了有利于驱动扬声器发音 需要加一个 D 触发器以均衡占空比 但这样一 来 此时频率变为原来的二分之一即 0 375MHZ 可预置计数分频器就是将 0 375MHZ 按 照各音符发音所需要的频率值进行预置数分频 这里计数器设为 11 位 tone 10 0 模 为 2047 若取音符 3 发音频率为 659Hz 需要将 0 375MHz 进行约 569 次分频才能得到此 频率 预置数即可用公式 模 分频系数 预置数 tone 10 0 算出 此时为 11 2047 569 1478 换成 11 位二进制计数为 10111000110 音乐代码模块 library ieee use ieee std logic 1164 all use ieee std logic unsigned all entity notetabs is port clk in std logic toneindex out std logic vector 3 downto 0 end architecture one of notetabs is component music port address in std logic vector 7 downto 0 clock in std logic q out std logic vector 3 downto 0 end component signal counter std logic vector 7 downto 0 begin cnt8 process clk counter begin if counter 138 then counter 00000000 elsif clk event and clk 1 then countercounter q toneindex clock clk end notetabs 中设置了一个 8 位二进制计数器 作为音符数据的地址发生器 随着 notetabs 中的计数器按照 4Hz 的时钟速率作加法计数时 每读一个数据 音符持续时间为 0 25 秒 如音符数据中的中音 3 为一拍 持续时间 1 秒 所以 音符数据 ROM 中需要重复写四次 地址 0A 随着 4Hz 时钟速率读取地址递增 音符数据 ROM 中的音符数据将通过模块 notetabs 中 toneindex 3 0 端口输向 tonetaba 模块 梁祝 音符数据 ROM 以下排列方法是为了节省空间 实际文件每一组占一行 width 4 depth 256 address radix dec data radix dec content begin 00 3 01 3 02 3 04 5 05 5 06 5 07 6 08 8 09 8 10 8 11 9 12 6 13 8 14 5 15 5 16 12 17 12 18 12 19 15 20 13 21 12 22 10 23 12 24 9 25 9 26 9 27 9 28 9 29 9 30 9 31 0 32 9 33 9 34 9 35 10 36 7 37 7 38 6 39 6 40 5 41 5 42 5 43 6 44 8 45 8 46 9 47 9 48 3 49 3 50 8 51 8 52 6 53 5 54 6 55 8 56 5 57 5 58 5 59 5 12 60 5 61 5 62 5 63 5 64 10 65 10 66 10 67 12 68 7 69 7 70 9 71 9 72 6 73 8 74 5 75 5 76 5 77 5 78 5 79 5 80 3 81 5 82 3 83 3 84 5 85 6 86 7 87 9 88 6 89 6 90 6 91 6 92 6 93 6 94 5 95 6 96 8 97 8 98 8 99 9 100 12 101 12 103 10 104 9 105 9 106 10 107 9 108 8 109 8 110 6 111 5 112 3 113 3 114 3 115 9 116 8 117 8 118 8 119 8 120 6 121 8 122 6 123 5 124 3 125 5 126 6 127 8 128 5 129 5 130 5 131 5 132 5 133 5 134 5 135 5 136 0 137 0 138 0 end 时间动态扫描模块 library ieee use ieee std logic 1164 all use ieee std logic unsigned all entity daojishi is port clk1 clk2 c in std logic led7s buffer std logic vector 6 downto 0 led selout out std logic vector 7 downto 0 end architecture one of daojishi is signal f0 f1 f2 fout1 fout2 std logic signal a0 a1 a2 a3 h1 h2 k1 k2 std logic vector 3 downto 0 signal led71s std logic vector 3 downto 0 signal q0 std logic vector 2 downto 0 begin process clk1 begin if c 1 then a0 1000 elsif clk1 event and clk1 1 then if a0 0000 then a0 1001 f0 1 else a0 a0 1 f0 0 end if end if end process process f0 begin if c 1 then a1 0011 elsif f0 event and f0 1 then if a1 0000 then a1 0101 13 f1 1 else a1 a1 1 f1 0 end if end if end process process f1 begin if c 1 then a2 0010 elsif f1 event and f1 1 then if a2 0000 then f2 1 a2 1001 else a2 a2 1 f2 0 end if end if end process process f2 begin if c 1 then a3 0000 elsif f2 event and f2 1 then if a3 0000 then a3 0101 else a3 a3 1 end if end if end process process clk2 begin if clk2 event and clk2 1 then q0led selout 10000000 led71sled selout 01000000 led71sled selout 00100000 led71sled selout 00010000 led71sled selout 00001000 led71sled selout 00000100 led71sled selout 00000010 led71sled

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论