ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:37.42KB ,
资源ID:5063796      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5063796.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(vhdl实验报告蜂鸣器.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

vhdl实验报告蜂鸣器.docx

1、vhdl实验报告蜂鸣器VHDL实验报告 一、实验目的1、 掌握蜂鸣器的使用;2、 通过复杂实验,进一步加深对VHDL语言的掌握程度。二、实验原理乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在蜂鸣器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让蜂鸣器能够发声是不够的,还必须准确地控制乐曲的节奏,即每个音符的持续时间。由此可见,乐曲中每个音符的发音频率及其持续的时间是乐曲能够连续演奏的两个关键因素。乐曲的12平均率规定:每2个八度音(如简谱中的中音1与高音1)之间的频率相差1倍。在2个八度音之间,又可分为12个半音。另外,音符A(简谱中的低音6)

2、的频率为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 简谱音名与频率的对应关系产生各音符所需的频率可用一分频器实现,由于各音符对应的频率多

3、为非整数,而分频系数又不能为小数,故必须将计算得到的分频数四舍五入取整。若分频器时钟频率过低,则由于分频系数过小,四舍五入取整后的误差较大;若时钟频率过高,虽然误差变小,但分频数将变大。实际的设计应综合考虑两方面的因素,在尽量减小频率误差的前提下取合适的时钟频率。实际上,只要各个音符间的相对频率关系不变,演奏出的乐曲听起来都不会走调。音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定。因此,要控制音符的音长,就必须知道乐曲的速度和每个音符所对应的节拍数,本例所演奏的乐曲的最短的音符为四分音符,如果将全音符的持续时间设为1s的话,那么一拍所应该持续的时间为0.25秒,则只需要提供一个4HZ的

4、时钟频率即可产生四分音符的时长。本例设计的音乐电子琴选取40MHZ的系统时钟频率。在数控分频器模块,首先对时钟频率进行40分频,得到1MHZ的输入频率,然后再次分频得到各音符的频率。由于数控分频器输出的波形是脉宽极窄的脉冲波,为了更好的驱动蜂鸣器发声,在到达蜂鸣器之前需要均衡占空比,从而生成各音符对应频率的对称方波输出。这个过程实际上进行了一次二分频,频率变为原来的二分之一即0.5MHZ。因此,分频系数的计算可以按照下面的方法进行。以中音1为例,对应的频率值为5233Hz,它的分频系数应该为:至于其他音符,同样可由上式求出对应的分频系数,这样利用程序可以很轻松地得到相应的乐声。音名频率/Hz分

5、频系数音名频率/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 各音名对应的分频系数至于音长的控制,在自动演奏模块,每个乐曲的音符

6、是按地址存放的,播放乐曲时按4HZ的时钟频率依次读取简谱,每个音符持续时间为0.25秒。如果乐谱中某个音符为三拍音长,那又该如何控制呢?其实只要在3个连续地址存放该音符,这时就会发三个0.25秒的音长,即持续了三拍的时间,通过这样一个简单的操作就可以控制音长了。三、实验步骤1、设置端口1)输入端口CLK:40MHZ系统时钟输入端口。2)输出端口device:乐曲的声音输出端口,输出的是对应各音符频率的方波信号。2、设置模块1)自动演奏模块自动演奏模块可以自动播放电子琴内置乐曲,按节拍读取内置乐谱。将键盘输入的音符信号输出。因此,本模块是向Tone模块提供音符信息。首先,对40MHz系统时钟进行

7、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( ind

8、ex: in std_logic_vector(15 downto 0); -音符输入信号 tone0: out integer range 0 to 2047 -音符的分频系数 );end tone;architecture behavioral of tone isbegin search :process(index) -此进程完成音符到音符的分频系数译码,音符的显示,高低音阶 begin case index is when 0000000000000001 = tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 to

9、ne0 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

10、-驱动扬声器的音频信号 );end speaker;architecture behavioral of speaker issignal preclk, fullspks:std_logic;begin p1:process(clk1)-此进程对系统时钟进行16分频 variable count: integer range 0 to 16; begin if clk1event and clk1=1 then count:=count+1; if count=8 then preclk=1; elsif count=16 then preclk=0; count:=0; end if; e

11、nd if; end process p1; p2:process(preclk,tone1)-对0.75mhz的脉冲再次分频,得到所需要的音符频率 variable count11:integer range 0 to 2047; begin if preclkevent and preclk=1 then if count11tone1 then count11:=count11+1; fullspks=1; else count11:=0; fullspks=0; end if; end if; end process p2; p3:process(fullspks)-此进程对fulls

12、pks进行2分频 variable count2: std_logic:=0; begin if fullspksevent 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 laoh

13、u is port( 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;begin p1:process(clk) -对12mhz系统时钟进行3m的分频,得到4hz的信号clk2 variable count:integer range 0 to

14、 3000000; begin if clkevent 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 clk2event and clk2=1 then if count0=29 then count0=0; else count0 tone_key_0 tone_key_0 ton

15、e_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;

16、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 iscomponent laohu is port( clk: in std_logic;-系统时钟;键

17、盘输入/自动演奏 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;

18、 -音符分频系数 spks: out std_logic-驱动扬声器的音频信号 );end component;signal mid:std_logic_vector(15 downto 0);signal tones:integer;begin u0:laohu port map(clk,mid); u1:tone port map(mid,tones); u2:speaker port map(clk,tones,device);end behavioral;五、实验结果及其分析频率折算中,由于频率计数3不能是小数,采用了四舍五入的方法,所以得到的频率并不是十分精确的,但是不会影响结果。乐曲按照每秒钟四拍进行,循环地从事先编好的代码中翻译出频率来,所以能听到完整的乐曲。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1