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为例,对应的频率值为5233Hz,它的分频系数应该为:至于其他音符,同样可由上式求出对应的分频系数,这样利用程序可以很轻松地得到相应的乐声。音名频率/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 isport(index: in std_logic_vector(15 downto 0); -音符输入信号tone0: out integer range 0 to 2047 -音符的分频系数);end tone;architecture behavioral of tone isbeginsearch :process(index) -此进程完成音符到音符的分频系数译码,音符的显示,高低音阶begincase index iswhen 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 isport(clk1: in std_logic; -系统时钟12mhztone1: in integer range 0 to 2047; -音符分频系数spks: out std_logic -驱动扬声器的音频信号);end speaker;architecture behavioral of speaker issignal preclk, fullspks:std_logic;beginp1:process(clk1)-此进程对系统时钟进行16分频variable count: integer range 0 to 16;beginif clk1event and clk1=1 then count:=count+1;if count=8 thenpreclk=1; elsif count=16 thenpreclk=0;count:=0;end if; end if;end process p1;p2:process(preclk,tone1)-对0.75mhz的脉冲再次分频,得到所需要的音符频率variable count11:integer range 0 to 2047;beginif preclkevent and preclk=1 then if count11tone1 thencount11:=count11+1;fullspks=1; elsecount11:=0;fullspks=0; end if;end if;end process p2;p3:process(fullspks)-此进程对fullspks进行2分频variable count2: std_logic:=0;beginif fullspksevent and fullspks=1 thencount2:=not count2;if count2=1 thenspks=1;elsespks=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 isport(clk: in std_logic;-系统时钟;键盘输入/自动演奏tone_key_0: buffer std_logic_vector(15 downto 0)-音符信号输出);end laohu;architecture behavioral of laohu issignal count0:integer range 0 to 31;-changesignal clk2:std_logic;beginp1:process(clk) -对12mhz系统时钟进行3m的分频,得到4hz的信号clk2variable count:integer range 0 to 3000000;beginif clkevent and clk=1 thencount:=count+1;if count=1500000 thenclk2=1; elsif count=3000000 thenclk2=0;count:=0;end if; end if; end process p1;p2:process(clk2)-此进程完成自动演奏部分乐曲的地址累加beginif clk2event and clk2=1 thenif count0=29 thencount0=0;elsecount0 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 isport(clk:in std_logic;device:out std_logic);end beep0;architecture behavioral of beep0 iscomponent laohu isport(clk: in std_logic;-系统时钟;键盘输入/自动演奏tone_key_0: out std_logic_vector(15 downto 0)-音符信号输出);end component;component tone isport(index: in std_logic_vector(15 downto 0);-音符输入信号tone0: out integer range 0 to 2047-音符的分频系数);end component;component speaker isport(clk1: in std_logic;-系统时钟12mhztone1: 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

提交评论