




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、vhdl实验报告一. 实验目的1、掌握蜂鸣器的使用;2、通过复杂实验,进一步加深对vhdl语言的学握程度。二. 实验原理乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率, 就可以在蜂鸣器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让蜂鸣器 能够发声是不够的,还必须准确地控制兀曲的节奏,即每个音符的持续时间。由此可见,乐 曲中每个咅符的发咅频率及其持续的吋间是乐曲能够连续演奏的两个关键因素。乐曲的12平均率规定:每2个八度音(如简谱屮的屮音1与高音1)之间的频率相差1倍。 在2个八度音之间,又可分为12个半音。另外,音符a(简谱中的低音6)的频率为440h
2、z, 音符b到cz间、e到fz间为半音,其余为全音。由此可以计算岀简谱屮从低音1至高音 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低音5392中音5784高音51568低音6440屮音6880高音61760低音7493.9中音7987.8高音71975.5表2.1简谱音名与频率的对应关系产生各音符所需的频率可用一分频器实现,由于各音符对应的频率多为非整数,而分频
3、系数又不能为小数,故必须将计算得到的分频数四舍五入取整。若分频器时钟频率过低,则 由于分频系数过小,四舍五入収整后的误差较大;若时钟频率过高,虽然误差变小,但分频 数将变大。实际的设计应综合考虑两方面的因素,在尽量减小频率误差的前提下取合适的时 钟频率。实际上,只要各个咅符间的相对频率关系不变,演奏出的乐曲听起来都不会走调。音符的持续时间须根据乐曲的速度及每个咅符的节拍数来确定。因此,要控制音符的音 长,就必须知道乐曲的速度和每个音符所对应的节拍数,本例所演奏的乐曲的最短的音符为 四分音符,如果将全音符的持续时间设为is的话,那么一拍所应该持续的时间为0.25秒, 则只需要提供一个4hz的时钟
4、频率即可产生四分音符的时长。本例设计的音乐电子琴选取40mhz的系统时钟频率。在数控分频器模块,首先对时钟 频率进行40分频,得到1mhz的输入频率,然后再次分频得到各音符的频率。由于数控分 频器输出的波形是脉宽极窄的脉冲波,为了更好的驱动蜂鸣器发声,在到达蜂鸣器之前碍要 均衡占空比,从而生成各音符对应频率的对称方波输出。这个过程实际上进行了一次二分频, 频率变为原来的二分之一即0.5mhz。因此,分频系数的计算可以按照下面的方法进行。以中音1为例,对应的频率值为 523. 3hz,它的分频系数应该为:= 7160.375mhz _ 0.375 x10设置端口1)输入端口clk: 40mhz系
5、统时钟输入端口。2)输出端口device:乐曲的声音输出端口,输出的是对应各音符频率的方波信号。 设置模块 1)自动演奏模块 白动演奏模块可以白动播放电子琴内置乐曲,按节拍读取内置乐谱。将键盘输入的音符 信号输出。因此,本模块是向tone模块提供咅符信息。 首先,対40mhz系统时钟进行10m的分频,得到4hz的信号,这样一秒中就可以按523.3-523.3至于其他音符,同样可由上式求岀对应的分频系数,这样利用程序可以很轻松地得到相 应的乐声。咅名频率/hz分频系数咅名频率/hz分频系数低音1261.61911高音11045.5478低音2293.71702高音21174.7425低音3329
6、.61517高音31318.5379低音4349.21431高音41391.1359低咅53921276高咅51568319低音64401136高音61760284低音7493.91014高音71975.5253屮音1523.3956屮音2587.3851中音3659.3758中音4698.5716中咅5784638中咅6880568中音7987.8506表2.2各音名对应的分频系数至于咅长的控制,在自动演奏模块,每个乐曲的音符是按地址存放的,播放乐曲时按 4hz的时钟频率依次读収简谱,每个音符持续时间为0.25秒。如果乐谱屮某个音符为三拍 音长,那又该如何控制呢?其实只耍在3个连续地址存放该
7、音符,这时就会发三个0.25秒 的音长,即持续了三拍的时间,通过这样一个简单的操作就可以控制音长了。三、实验步骤照四拍进行。然后依照此频率进行地址累计。iaohu:u0tone_key_015.02)音频发生器模块根据自动演奏模块的信号输出,不同的信号被翻译为不同的频率。tone:u13)蜂鸣器驱动模块根据音频发生器发出音频的不同,蜂鸣器得到的驱动也不同。首先,对系统时钟进行 40分频,再对lmhz的脉冲再次分频,得到所需要的音符频率,然后再进行2分频。speaker:u2>device四、实验代码library ieee;use ieee.std_logic_h64.ah;use ie
8、ee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity tone isport(index: in stdogic_vector(15 downto 0); 一音符输入信号toneo: out integer range 0 to 2047音符的分频系数);end tone;architecture behavioral of tone isbeginsearch :process(index) 此进程完成音符到音符的分频系数译码,音符的显示,高低音begincase index iswhen n000000000000000
9、1m => toneo<=1433; when ,0000000000000010m => tone0<=1277; when ”0000000000000100” => tone0<=113& when “0000000000001000” => tone0<=1074; when “0000000000010000” => tone0<=960; when ”0000000000100000” => tone0<=853; when n0000000001000000" => tone0<
10、=759; when n0000000010000000" => tone0<=716; when ”0000000100000000” => tone0<=35& when “0000001000000000” => tone0<=319; when n0000010000000000m => tone0<=284; when n0000100000000000" => tone0<=26& when n0001000000000000" => tone0<=239; whe
11、n ”0010000000000000” => tone0<=213; when u0100000000000000° => tone0<= 190; when n1000000000000000m => tone0<=638; when others => 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_unsigne
12、d.all; entity speaker isport(clkl: in std_logic;tonel: in integer range 0 to 2047; spks: out stdjogic系统时钟12mhz-咅符分频系数驱动扬声器的音频信号end speaker; architecture behavioral of speaker is signal preclk, fullspks:std_logic; beginpkprocess(clkl)-此进程对系统时钟进行16分频 variable count: integer range 0 to 16;beginif clkle
13、vent and clkl 二t then count:=count+l; if count=8 thenpreclk<-t;elsif count=16 thenpreclk<='0*;count:=0;end if;end if;end process pl;p2:process(preclk,tonel)-对0.75nihz的脉冲再次分频,得到所需要的音符频率 variable count 11:integer range 0 to 2047;beginif preclkvent and preclk二t thenif count! l<t onel thenc
14、ountl l:=countl 1 + 1;fullspks<=*r;elsecountl l:=0;fullspks<='0'end if;end if;end process p2;p3:process(fullspks)-此进程对 fullspks 进行 2 分频variable count2: stdogic:='0:beginif fullspks'event and fullspks二t thencount2:=not count2;if count2=fr thenspks<-r;elsespks<='0'e
15、nd 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(elk: in std_logic;-m统时钟;键盘输入/自动演奏 tone_key_0: buffer std_logic_vector(15 downto 0)音符信号输出);end laohu;architecture behavioral of laohu is
16、signal counto:integer range 0 to 31 ;-changesignal clk2:std_logic;beginpl:process(clk)-对12mhz系统吋钟进行3m的分频,得到4hz的信号clk2 variable count:integer range 0 to 3000000;beginif clkfevent and clk=t thencount:=co unt+1;if count= 1500000 thenclk2v 二 t;elsif count=3000000 thenclk2<=,0,;count:=0;end if;end if;
17、end process pl;p2:process(clk2)-此进程完成自动演奏部分圧曲的地址累加 beginif clk2'event and clk2=t then讦 count0=29 thencount0<=0;elsecount0<=count0+1;end if;end if;end process p2;p3:process(count0,tone_key_0)begincase counto is-此case语句:存储自动演奏部分的乐曲when 0 => tonekey_0<=bm0000000l_00000000h; when 10 =>
18、; tone_key_0<=bu00010000_00000000h; when 11 => tone_key_0<=bm00000100_00000000h; when 12 => tone_key_0<=b"00001000_00000000" when 13 => tone_key_0<=bn00010000_00000000h; when 14 => tone_key_0<=bn00010000_00000000h; when 15 => tone_key_0<=bn00100000_00000000
19、h; when 16 => tone_key_0<=bn00010000_00000000h; when 17 => tone_key_0<=b"00001000_00000000" when 18 => tone_key_0<=b',00000100_00000000h; when 19 => tone_key_0<=bh00000001_00000000m; when 20 => tone_key_0<=bu00010000_00000000h; when 21 => tone_key_0<
20、=bn00100000_00000000h; when 22 => tone_key_0<=b"00010000_00000000h; when 23 => tone_key_0<=bn00001000_00000000n; when 24 => tone_key_0<=bn00000100_00000000h; when 25 => tone_key_0<=bn00000001 _00000000n; when 26 => tone_key_0<=bn00000100_00000000h; when 27 => to
21、ne_key_0<=b"00000000_00100000" when 28 => tone_key_0<=bh00000001 _00000000n;when 1 => tone when 2 => tone when 3 => tone when 4 => tone when 5 => tone when 6 => tone when 7 => tone when 8 => tone when 9 => tonekey_0<=bm00000010 key_0<=bm00000100 ke
22、y_0<=bm00000001 key_0<=br'00000001 key_0<=bm00000010 key_0<=bm00000100 key_0<=bm00000001 key_0<=bm00000100 key_0<=br'000010000()0()0()0(),;00000000”;00000000°00000000°00000000u;()()0()0()()(),;00000000”;00000000°00000000°231123134-5-3-4-5-5-6-5-4-3-1-5-6-5-4-3-1-3-di6-1when others => null;end case;end process p3;end behavioral;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.stdogic_unsigned.all;entity beepo isport(clk
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 如何设计轻质普通型铝合金轮椅项目可行性研究报告技术工艺+设备选型+
- 中国卷铝涂料项目商业计划书
- 2024年成都彭州市事业单位招聘真题
- 培训营协议书
- 船艇考试题库及答案
- 初中中药考试题型及答案
- 急诊骨科考试试题及答案
- 起诉离婚协议书离婚
- 2025年合同执行保障金
- 汽车指标租赁协议书
- 2025四川成都高新投资集团有限公司选聘中高层管理人员4人笔试历年参考题库附带答案详解(3卷合一)
- 新手汽车改装知识培训班课件
- 化验室救护知识培训课件
- 船舶维护保养指南
- 2025特种设备培训试题及答案
- GB/T 27689-2025小型游乐设施滑梯
- 第三章代数式七年级上学期数学重点题型(原卷版)(2024苏科新版)
- 第8课 《回忆鲁迅先生(节选)》 课件 2025-2026学年统编版语文八年级上册
- 酱酒食品安全培训记录课件
- 劳动价值观测试理解劳动的意义与价值
- 合伙开店合同终止协议书
评论
0/150
提交评论