vhdl实验报告--蜂鸣器_第1页
vhdl实验报告--蜂鸣器_第2页
vhdl实验报告--蜂鸣器_第3页
vhdl实验报告--蜂鸣器_第4页
vhdl实验报告--蜂鸣器_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

VHDL 实验报告实验报告 一 实验目的一 实验目的 1 掌握蜂鸣器的使用 2 通过复杂实验 进一步加深对 VHDL 语言的掌握程度 二 实验原理二 实验原理 乐曲都是由一连串的音符组成 因此按照乐曲的乐谱依次输出这些音符所对应的频率 就可以在蜂鸣器上连续地发出各个音符的音调 而要准确地演奏出一首乐曲 仅仅让蜂鸣 器能够发声是不够的 还必须准确地控制乐曲的节奏 即每个音符的持续时间 由此可见 乐曲中每个音符的发音频率及其持续的时间是乐曲能够连续演奏的两个关键因素 乐曲的 12 平均率规定 每 2 个八度音 如简谱中的中音 1 与高音 1 之间的频率相差 1 倍 在 2 个八度音之间 又可分为 12 个半音 另外 音符 A 简谱中的低音 6 的频率为 440Hz 音符 B 到 C 之间 E 到 F 之间为半音 其余为全音 由此可以计算出简谱中从低 音 l 至高音 1 之间每个音符的频率 如表 2 1 所示 音名频率 Hz音名频率 Hz音名频率 Hz 低音 1261 6中音 1523 3高音 11045 5 低音 2293 7中音 2587 3高音 21174 7 低音 3329 6中音 3659 3高音 31318 5 低音 4349 2中音 4698 5高音 41391 1 低音 5392中音 5784高音 51568 低音 6440中音 6880高音 61760 低音 7493 9中音 7987 8高音 71975 5 表 2 1 简谱音名与频率的对应关系 产生各音符所需的频率可用一分频器实现 由于各音符对应的频率多为非整数 而分 频系数又不能为小数 故必须将计算得到的分频数四舍五入取整 若分频器时钟频率过低 则由于分频系数过小 四舍五入取整后的误差较大 若时钟频率过高 虽然误差变小 但 分频数将变大 实际的设计应综合考虑两方面的因素 在尽量减小频率误差的前提下取合 适的时钟频率 实际上 只要各个音符间的相对频率关系不变 演奏出的乐曲听起来都不 会走调 音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定 因此 要控制音符的 音长 就必须知道乐曲的速度和每个音符所对应的节拍数 本例所演奏的乐曲的最短的音 符为四分音符 如果将全音符的持续时间设为 1s 的话 那么一拍所应该持续的时间为 0 25 秒 则只需要提供一个 4HZ 的时钟频率即可产生四分音符的时长 本例设计的音乐电子琴选取 40MHZ 的系统时钟频率 在数控分频器模块 首先对时 钟频率进行 40 分频 得到 1MHZ 的输入频率 然后再次分频得到各音符的频率 由于数 控分频器输出的波形是脉宽极窄的脉冲波 为了更好的驱动蜂鸣器发声 在到达蜂鸣器之 前需要均衡占空比 从而生成各音符对应频率的对称方波输出 这个过程实际上进行了一 次二分频 频率变为原来的二分之一即 0 5MHZ 因此 分频系数的计算可以按照下面的方法进行 以中音 1 为例 对应的频率值为 523 3Hz 它的分频系数应该为 6 0 3750 375 10 716 523 3523 3 MHZ 至于其他音符 同样可由上式求出对应的分频系数 这样利用程序可以很轻松地得到 相应的乐声 音名频率 Hz分频系数音名频率 Hz分频系数 低音 1261 61911高音 11045 5478 低音 2293 71702高音 21174 7425 低音 3329 61517高音 31318 5379 低音 4349 21431高音 41391 1359 低音 53921276高音 51568319 低音 64401136高音 61760284 低音 7493 91014高音 71975 5253 中音 1523 3956中音 2587 3851 中音 3 659 3 758 中音 4 698 5 716 中音 5 784 638 中音 6 880 568 中音 7 987 8 506 表 2 2 各音名对应的分频系数 至于音长的控制 在自动演奏模块 每个乐曲的音符是按地址存放的 播放乐曲时按 4HZ 的时钟频率依次读取简谱 每个音符持续时间为 0 25 秒 如果乐谱中某个音符为三拍 音长 那又该如何控制呢 其实只要在 3 个连续地址存放该音符 这时就会发三个 0 25 秒 的音长 即持续了三拍的时间 通过这样一个简单的操作就可以控制音长了 三 实验步骤三 实验步骤 1 设置端口 1 输入端口 CLK 40MHZ 系统时钟输入端口 2 输出端口 device 乐曲的声音输出端口 输出的是对应各音符频率的方波信号 2 设置模块 1 自动演奏模块 自动演奏模块可以自动播放电子琴内置乐曲 按节拍读取内置乐谱 将键盘输入的音 符信号输出 因此 本模块是向 Tone 模块提供音符信息 首先 对 40MHz 系统时钟进行 10M 的分频 得到 4Hz 的信号 这样一秒中就可以按 照四拍进行 然后依照此频率进行地址累计 2 音频发生器模块 根据自动演奏模块的信号输出 不同的信号被翻译为不同的频率 3 蜂鸣器驱动模块 根据音频发生器发出音频的不同 蜂鸣器得到的驱动也不同 首先 对系统时钟进行 40 分频 再对 1mhz 的脉冲再次分频 得到所需要的音符频率 然后再进行 2 分频 四 实验代码四 实验代码 library ieee use ieee std logic 1164 all use ieee std logic arith all use ieee std logic unsigned all entity tone is port index in std logic vector 15 downto 0 音符输入信号 tone0 out integer range 0 to 2047 音符的分频系数 end tone architecture behavioral of tone is begin search process index 此进程完成音符到音符的分频系数译码 音符的显示 高低 音阶 begin case index is when 0000000000000001 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 0 end case end process end behavioral library ieee use ieee std logic 1164 all use ieee std logic arith all use ieee std logic unsigned all entity speaker is port clk1 in std logic 系统时钟 12mhz tone1 in integer range 0 to 2047 音符分频系数 spks out std logic 驱动扬声器的音频信号 end speaker architecture behavioral of speaker is signal preclk fullspks std logic begin p1 process clk1 此进程对系统时钟进行 16 分频 variable count integer range 0 to 16 begin if clk1 event and clk1 1 then count count 1 if count 8 then preclk 1 elsif count 16 then preclk 0 count 0 end if end if end process p1 p2 process preclk tone1 对 0 75mhz 的脉冲再次分频 得到所需要的音符频率 variable count11 integer range 0 to 2047 begin if preclk event and preclk 1 then if count11 tone1 then count11 count11 1 fullspks 1 else count11 0 fullspks 0 end if end if end process p2 p3 process fullspks 此进程对 fullspks 进行 2 分频 variable count2 std logic 0 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 p3 end behavioral library ieee use ieee std logic 1164 all use ieee std logic arith all use ieee std logic unsigned all entity laohu is port clk in std logic 系统时钟 键盘输入 自动演奏 tone key 0 buffer std logic vector 15 downto 0 音符信号输出 end laohu architecture behavioral of laohu is signal count0 integer range 0 to 31 change signal clk2 std logic begin p1 process clk 对 12mhz 系统时钟进行 3m 的分频 得到 4hz 的信号 clk2 variable count integer range 0 to 3000000 begin if clk event and clk 1 then count count 1 if count 1500000 then clk2 1 elsif count 3000000 then clk2 0 count 0 end if end if end process p1 p2 process clk2 此进程完成自动演奏部分乐曲的地址累加 begin if clk2 event and clk2 1 then if count0 29 then count0 0 else count0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 tone key 0 null end case end process p3 end behavioral library ieee use ieee std logic 1164 all use ieee std logic arith all use ieee std logic unsigned all entity beep0 is port clk in std logic device out std logic end beep0 architecture behavioral of beep0 is component laohu is port clk in std logic 系统时钟 键盘输入 自动演奏 tone key 0 out std logic vector 15 downto 0 音符信号输出 end component component tone is port index in std logic vector 15 downto 0 音符输入信号 tone0 out integer range 0 to 2047 音符的分频系数 end component component speaker is port clk1 in std logic 系统时钟 12mhz tone1 in integer range 0 to 2047 音符分频系数 spks out std logic 驱动扬声器的音频信号 end component signal mid std

温馨提示

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

评论

0/150

提交评论