VHDL乐曲演奏实验报告
乐器演奏电路设计-vhdl

重庆交通大学计算机与信息学院设计性实验报告班级:通信工程专业 07 级 2 班姓名(学号):实验项目名称:乐器演奏电路设计实验项目性质:设计性实验所属课程: VHDL 实验室(中心):指导教师:徐雯娟实验完成时间: 2009 年 12 月 13 日一、实验目的1,了解普通扬声器的工作原理;2,了解QuartusII4.1中提供了宏功能元件库mega_lpm。
3,使用LPM_ROM参数化存储模块。
二、实验内容及要求要求能够演奏出《友谊地久天长》的曲调或可另选一段较完整的曲调。
(扩展要求:能够从数码管上显示出当前曲调的简谱和频率)三、实验原理1,音符的频率:可以由上图中的U3获得,这是一个数控分频器。
由其clk 端输入一具有较高频率(这里是12MHz)的信号,通过U3分频后由SPKOUT输出,U3对clk 输入信号的分频比由11位预置数Tone[10..0]决定。
SPKOUT的输出频率将决定每一音符的音调,这样,分频计数器的预置值Tone[10..0]与SPKOUT 的输出频率,就有了对应关系。
2,音符的持续时间:须根据乐曲的速度及每个音符的节拍数来确定,图中模块U2的功能首先是为U3提供决定所发音符的分频预置数,而此数在U3输入口停留的时间即为此音符的节拍值。
模块U2是乐曲简谱码对应的分频预置数查表电路,其中设置了乐曲全部音符所对应的分频预置数(一共8个),每一音符的停留时间由音乐节拍和音调发生器模块U1的clk的输入频率决定(如为4Hz),这8个值的输出由对应于U2的3位输入值Index[2..0]确定。
3,乐谱的存储:在U1中设置了一个7位二进制计数器(计数最大值为65),作为音符数据ROM 的地址发生器。
这个计数器的计数频率若选为4Hz,即每一计数值的停留时间为0.25秒,恰为当全音符设为1秒时,四四拍的4分音符持续时间。
随着U1中的计数器按4Hz的时钟速率作加法计数时,即随地址值递增时,音符数据ROM 中的音符数据将从ROM中通过ToneIndex[2..0]端口输向U2模块,乐曲就开始连续自然地演奏起来了。
EDA课程设计---乐曲硬件演奏电路的VHDL设计

EDA课程设计题目:乐曲硬件演奏电路的VHDL设计一、 设计题目:乐曲硬件演奏电路的VHDL 设计二、 设计目标:1)能够播放“梁祝”乐曲。
2)能够通过LED 显示音阶。
3)具有“播放/停止”功能,并在此基础上实现“按键演奏”的电子琴功能。
三、 设计原理:1. 音乐基础知识一段简单乐谱由音调和节拍组成,音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。
音符的节拍我们可以举例来说明。
在一张乐谱中,我们经常会看到这样的表达式,如1=C 44、1=G 43……等等。
以43为例加以说明,它表示乐谱中以四分音符为节拍,每一小结有三拍。
比如:图1其中1 、2 为一拍,3、4、5为一拍,6为一拍共三拍。
1 、2的时长为四分音符的一半,即为八分音符长,3、4的时长为八分音符的一半,即为十六分音符长,5的时长为四分音符的一半,即为八分音符长,6的时长为四分音符长。
那么一拍到底该唱多长呢?一般说来,如果乐曲没有特殊说明,一拍的时长大约为400—500ms 。
我们以一拍的时长为400ms为例,则当以四分音符为节拍时,四分音符的时长就为400ms,八分音符的时长就为200ms,十六分音符的时长就为100ms。
2.原理图框图:图2.框图3.原理图说明音乐播放原理说明音符的频率由数控分频器模块Speakera产生。
ToneTaba模块从NoteTabs模块中输入的音符数据,将对应的分频预置数据传送给Speakera模块,并将音符数据送到LED模块显示音阶。
NoteTabs模块中包含有一个音符数据ROM,里面存有歌曲“梁祝”的全部音调,在此模块中设置了一个8位二进制计数器,作为音符数据ROM的地址发生器。
这个计数器的计数频率为4Hz,即每一个数值的停留时间为0.25秒。
例如:“梁祝”乐曲的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒钟时间,所对应的“3”音符分频预置数为1036,在Speakera的输入端停留了1秒。
基于VHDL的乐曲演奏设计与实现

硬件述语 言 , 括系统 行为级 、 包 寄存 器传输 级 和逻
辑 门级多个设计层次。它具有 强大 的行 为描述 能力 ,
可 以用 简 洁 明确 的源代码 来 描述 复 杂 的逻 辑 控制 。 设计者可 以利 用 V D H L程序 , 用 “ 采 自顶 而下 ” 的方
图 1 设 计 流 程 图
事 检 测 与 自动 化 装 置研 究 。
音 阶产生 部分 由分 频器和选 择器组 成 。分频 器
产 生音 阶信 号 , 由于音 阶信 号频 率 只有 几百 赫 兹 至 上 千赫兹 , 而系 统 的主 频选 用 1 H , 么 分频 器 2M z那
21 0 1午第 2期
工 业 仪 表 与 自动化 装 置
4器件进行验证 , 果表 明该设 计能很好 地 实现 乐 曲的 自动演奏 、 结 暂停及 恢复功 能。
关 键 词 : 曲 演 奏 ; H L M x lsI 乐 V D ; aPu 1
中图分 类号 :P 0 T 32
文献标志码 : A
文章编号 :0 0— 6 2 2 1 )2— 0 2— 3 10 0 8 ( 0 1 0 0 3 0
择模块 控制音 阶发 生部 分 , 连续 地 演奏 出一段 乐 能 曲; 数器采 用可预置 计数器 , 计 主要实 现 的是连 续演 奏和暂 停功能 。
2 1 音阶模块 .
收 稿 日期 :0 0— 9—2 21 0 5
基 金项 目 : 省 级 自然科 学 重 点 项 目资 助 ( J0 8 1 1 安徽 K20 A 0 ) 作者 简 介 : 崔袜 ( 95) 女 , 南 个 旧 人 , 验 师 , 16 , 云 实 本科 , 要 从 主
t e s se .smu ain.a d d wno d d t EX1 h y tm i lto n o la e o FL OK e is EPF1 s re OLC8 — 4 d vc s t e f . e 0KI 4 e ie o v r y Th i r s t h w h tt i e in c n b o d f ra t mai sc p a e ul s o ta h sd sg a e g o o u o tc mu i ly,p u e a d r s m e fncin. s a s n e u u to
VHDL电子琴实验报告

VHDL电子琴实验报告
实验目的:
本实验的目的是设计一个VHDL电子琴,通过FPGA实现,实现按键发出不同的音调,并通过扬声器输出对应的音频信号,达到模拟真实电子琴的效果。
实验原理:
VHDL(Very High Speed Integrated Circuit Hardware Description Language)是一种硬件描述语言,用于描述数字电路的行为和结构。
在本实验中,我们将使用VHDL语言描述电子琴的按键和音调的对应关系,通过FPGA实现电子琴的功能。
电子琴实验主要包含两个部分:输入部分和输出部分。
输入部分是按键,按下不同的按键会发出不同的音调。
输出部分是扬声器,通过扬声器输出对应的音频信号。
实验步骤:
1.确定电子琴的按键数量和对应的音调。
2.使用VHDL语言描述电子琴的按键和音调的对应关系。
3.将VHDL代码综合成逻辑电路网表。
4.将逻辑电路网表烧录到FPGA中。
5.连接扬声器到FPGA输出引脚。
6.按下不同的按键,测试扬声器输出的音频信号是否正确。
实验结果:
经过实验测试,我们成功实现了一个简单的VHDL电子琴。
按下不同的按键,扬声器输出对应的音调。
通过调整VHDL代码中的音频频率,可以改变电子琴的音调高低。
实验总结:
通过本实验,我们深入理解了VHDL语言的应用和FPGA的原理。
电子琴作为一个实际应用案例,充分展示了数字电路设计的魅力。
在今后的学习和工作中,我们将能更加熟练地应用VHDL语言和FPGA技术,设计更加复杂的数字电路系统。
VHdl乐曲演奏实验

EDA课程设计实验报告专业:班级:姓名:LSC学号:指导教员:一、试验名称:乐曲自动演奏器二、试验目的:1. 使用FPGA 控制蜂鸣器演奏乐曲梁祝中的一段;2. 初步学会利用结构建模方法设计程序。
三、试验内容:1. 利用时钟分频进行音调和音长的设定;2. 利用整个程序,播放梁祝乐曲;3. 让LED 灯随着音乐的节拍显示,分高、中、低三种频率显示。
四、试验要求:1. 将时钟频率分别分成6MHz 和4Hz 两种;2. 利用功能框图建立整个程序,清晰的播放出梁祝乐曲。
五、试验背景及基本原理:5.1乐曲演奏基本原理:乐曲演奏的原理是这样的:组成乐曲的每个音符的频率值(音调)及其持续的时间(音长)是乐曲能连续演奏所需的两个基本数据,因此只要控制输出到扬声器的激励信号频率的高低和持续的时间,就可以使扬声器发出连续的乐曲声。
5.2音调的控制频率的高低决定了音调的高低。
音乐的十二平均率规定:每两个8度音(如简谱中的中音1与高音1)之间的频率相差一倍。
在两个8度音之间,又可分为12个半音,每两个半音的频率比为12√2。
另外,音名A(简谱中的低音6)的频率为440Hz,音名B到C之间、E到F之间为半音,其余为全音[4]。
由此可以计算出简谱中从低音1至高音1之间每个音名对应的频率,如表所示:5.3音名与频率的关系所有不同频率的信号都是从同一个基准频率分频得到的。
由于音阶频率多为非整数,而分频系数又不能为小数,故必须将计算得到的分频数四舍五入取整。
若基准频率过低,则由于分频比太小,四舍五入取整后的误差较大;若基准频率过高,虽然误差变小,但分频数将变大。
实际的设计综合考虑这两方面的因素,在尽量减小频率误差的前提下取合适的基准频率。
本试验中选取6MHz为基准频率。
若无6MHz的基准频率,则可以先分频得到6MHz,或换一个新的基准频率。
实际上,只要各个音名间的相对频率关系不变,演奏出的乐曲听起来都不会"走调"。
VHDL实验报告

实验者:黄成勇学号:3110008723班级:电子(4)班日期:2012年12月30日实验一:应用Quart us II 完成基本组合电路设计(1) 实验目的:熟悉QuartusⅡ的VHDL文本设计流程全过程,学习简单组合电路的设计、多层次电路设计、仿真和硬件测试。
(2) 实验容1:首先利用QuartusⅡ完成2选1多路选择器的文本编辑输入(mux21a.vhd)和仿真测试等步骤,给出仿真波形。
最后在实验系统上进行硬件测试,验证本项设计的功能。
2选1多路选择器:LIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.ALL ;ENTITY mux21a ISPORT ( a, b, s: IN BIT;y : OUT BIT );END ENTITY mux21a;ARCHITECTURE one OF mux21a ISBEGINPROCESS (a,b,s)BEGINIF s = '0' THEN y <= a ; ELSE y <= b ;END IF;END PROCESS;END ARCHITECTURE one ;双2选1多路选择器2选1多路选择器功能时序波形(3) 实验容2:将此多路选择器看成是一个元件mux21a,利用元件例化语句。
例化程序:LIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.ALL ;ENTITY mux31a ISPORT ( a1, a2,a3, s0,s1: IN STD_LOGIC;outy : OUT STD_LOGIC );END ENTITY mux31a;ARCHITECTURE bhv OF mux31a ISCOMPONENT(a,b: IN STD_LOGIC;s: IN STD_LOGIC);END COMPONENT;BEGINu1 : MUX21A PORT MAP(a=>a2,b=>a3,s=>s0,y=>tmp);u2 : MUX21A PORT MAP(a=>a1,b=>tmp,s=>s1,y=>outy);END ARCHITECTURE BHV ;(4) 实验容3:引脚锁定以及硬件下载测试。
简易乐曲播放器-数字电路与逻辑设计报告

数字电路与逻辑设计实验报告简易乐曲播放器一、设计课题的任务要求基本任务:设计制作一个简易乐曲播放器。
1. 播放器内预存3 首乐曲;2. 播放模式:顺序播放、随机播放,并用数码管或LED 显示当前播放模式;顺序播放:按内部给定的顺序依次播放3 首乐曲;随机播放:随机产生一个顺序播放3 首乐曲;3. 用数码管显示当前播放乐曲的顺序号;4. 设置开始/暂停键,乐曲播放过程中按该键则暂停播放,再按则继续播放;5. 设置Next 和Previous 键,按Next 键可以听下一首,按Previous 键回到本首开始;提高要求:1.用户可以自行设定播放顺序,设置完成后,播放器按该顺序依次播放乐曲;2.自拟其它功能。
二、系统设计(设计思路、总体框图、分块设计)设计思路:由于一般乐曲最短音符为四分音符,则总体设计思路为每次播放一个四分音符,持续时间1/4秒(分频),并依次循环播放每个四分音符,每个四分音符对应音调利用1M分频器分频产生,播放功能则利用蜂鸣器播放当前音调对应频率值即可。
主题设计完成后,加入各控制功能,显示功能。
总体框图:结构框图:方框图:ASM图:暂停暂停MDS图:分块设计:1.分频模块(1)音调:在声乐中,每个音调对应一个频率,而本次实验即应用1M的时钟分频为各个音调所对应的频率,由于每次输出仅有一个频率,则可以在某个四分音符播放时选择分频为哪个音调对应的频率。
由于宏单元使用不够,改为先将1M时钟4分频,再利用4分频后的时钟分为各个音调对应的频率以减小计数器最大计数值。
(2)音长:由于一般乐曲中最短音长为四分音符,并设定全音符音长为1s,四分音符音长为4s,利用每次播放一个四分音符的思路依次播放每个音符(全音符播放4次,半分音符2次)直至有其他控制。
即需对1MHz分频为4Hz。
2.控制模块(1)模式控制A.顺序模式:依次播放每个四分音符,播完3首歌曲后循环B.随机模式:利用异或产生随机数并在播完歌曲后(或按下一首)利用所产生的随机数播放另两首歌曲中的一首C.用户自定义模式:a.顺序播放:依次按1、2、3的顺序播放歌曲并循环b.倒序播放:依次按3、2、1的顺序播放歌曲并循环(2)按键控制A.暂停:在任意播放时刻按下即暂停播放,并记下断点处,蜂鸣器消声,所有彩灯数码管熄灭,一切功能键失效,释放时即从断点处恢复B.下一首:在任意播放时刻按下即按当前模式播放下一首歌曲C.本首重放:在任意播放时刻按下即从播放当前播放乐曲的第一个四分音符处开始播放D.上一首:在任意播放时刻按下即按当前模式播放上一首歌曲3.显示模块(1)彩灯播放某个四个分音符时,根据当前播放音调按七个简谱显示在七个彩灯上(2)数码管第一个数码管显示播放模式:顺序显示0,随机显示8,用户自定义正序显示1,用户自定义倒序显示2第二个数码管显示当前播放曲目序号需要控制两个数码管显示时的时钟分配问题(利用视觉暂留控制1M时钟二分频依次点亮两个数码管)(3)蜂鸣器依次播放所需播放的四分音符三、仿真波形及波形分析本实验仿真着实不易。
VHDL实验报告

年月日VHDL实验报告学院专业学号姓名实验1 译码器设计一、实验原理1、译码器是数字系统中常用的组合逻辑电路,常用于地址译码。
74LS138是最常用的一种小规模集成电路,它有3个二进制输入端和8个译码输出端。
表1.1是它的真值表。
表1.1 3-8 译码器真值表2、普通的LED数码管由7段和一个点组成,使用它进行显示,需要译码驱动。
本实验实现一个七段LED显示译码电路。
为了实验方便,在译码之前加入一个4位二进制加法计数器,当低频率的脉冲信号输入计数器后,由7段译码器将计数值译为对应的十进制码,并由数码管显示出来。
图1.1为此电路的原理图。
图1.1 7段LED译码显示电路二、实验内容1、设计一个4-16译码器。
2、设计轮流显示表1.2所示字符的程序。
表1.2 字母显示真值表3、通过仿真,观察设计的正确性。
4、下载、验证设计的正确性。
三、源程序1、4-16译码器。
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY decode ISPORT( d0, d1, d2,d3, s1 ,s2 ,s3:IN STD_LOGIC;Y : OUT STD_LOGIC_VECTOR ( 15 DOWNTO 0 ) );END decode;ARCHITECTURE rtl OF decode ISSIGNAL indata : STD_LOGIC_VECTOR ( 3 DOWNTO 0 );BEGINIndata <= d3 & d2 & d1 & d0 ;PROCESS ( indata, s1, s2, s3 )BEGINIF (s1 ='1' AND s2='0' AND s3 = '0' ) THENCASE indata ISWHEN "0000" => Y <= "1111111111111110" ;WHEN "0001" => Y <= "1111111111111101" ;WHEN "0010" => Y <= "1111111111111011" ; WHEN "0011" => Y <= "1111111111110111" ;WHEN "0100" => Y <= "1111111111101111" ;WHEN "0101" => Y <= "1111111111011111" ;WHEN "0110" => Y <= "1111111110111111" ;WHEN "0111" => Y <= "1111111101111111" ;WHEN "1000" => Y <= "1111111011111111" ;WHEN "1001" => Y <= "1111110111111111" ;WHEN "1010" => Y <= "1111101111111111" ; WHEN "1011" => Y <= "1111011111111111" ;WHEN "1100" => Y <= "1110111111111111" ;WHEN "1101" => Y <= "1101111111111111" ;WHEN "1110" => Y <= "1011111111111111" ;WHEN "1111" => Y <= "0111111111111111" ;WHEN OTHERS=> NULL;END CASE;ELSEY <= "1111111111111111" ;END IF;END PROCESS;END rtl;2、轮流显示表1.2所示字符的程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设计性实验报告班级:姓名(学号):实验项目名称:乐曲演奏实验实验项目性质:设计性实验所属课程: EDA基础实验室(中心):指导教师:实验完成时间: 2009 年 12 月 13 日教师评阅意见:签名:年月日实验成绩:一、实验目的1、熟悉QuartusII 软件的使用。
2、熟悉EDA实验开发系统的基本使用。
3、学习VHDL基本单元电路的设计应用。
进一步掌握EDA的多层次设计方法。
4、学习音乐发生器的设计。
二、实验内容及要求1、实验内容利用可编程逻辑器件FPGA,设计乐曲硬件电路,可自动演奏乐曲。
2、实验要求要求能够演奏出《友谊天长地久》的曲调或可另选一段较完整的曲调(扩展要求:能够从数码管上显示出当前曲调的简谱和频率),我们组演奏出的是实验要求上的《友谊天长地久》曲调。
三、实验原理1、乐曲硬件电路产生音乐是和音乐频率和音乐的持续时间有关;音符的持续时间需根据乐曲的速度和每个音符的节拍数来确定。
其简谱中音符和频率的关系如下:2、该演奏电路演奏的乐曲是《友谊天长地久》片段,其最小的节拍为1拍,将1拍的时长定位0.25S ,则只需要再提供一个4hz 的时钟频率即可产生1拍的时长,演奏的时间控制通过ROM 查表的方式来完成。
对于占用时间较长的节拍,(一定是节拍的整数倍),如全音符为4拍,2/4音符为2拍,1/4音符为1拍。
3、乐曲硬件演奏电路系统主要有数控分频器和乐曲存储模块两个部分组成,其余还有音乐节拍发生器等等。
数控分频器对FPGA 的基准频率进行分频,得到与各个音节对应的频率输出。
乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中存放一个乐曲曲谱真值表(实验中用的ROM 存储),由一个计数器来控制此真值表的输出,而由计数器的技术时钟信号作为乐曲节拍控制信号。
4、要求演奏时能循环进行,必须需另外设置一个时长计数器,当乐曲演奏完成时,保证能自动从头开始演奏。
该计数器控制真值表按顺序输出简谱。
四、实验仪器、材料计算机一台、GW48 EDA/SOPC 实验箱一台QuartusII 软件、实验箱连接线一根五、方案设计这个实验中采用层次化的设计思路,因此我们把此乐曲硬件演奏电路分为3个主要模块,即音乐发生器NoteTabs 模块,音符译码电路Tonetaba 模块,数控分频Speakera 模块。
分好层次之后,编写每个模块的程序,分别生成项目符号,最后把生成的个项目符号用原理图的方式连接起来,然后编译、下载即可。
由图例表示如下:输入 输出(乐曲)此实验设计中,我主要负责音乐发生器NoteTabs 模块(ROM 的定制过程)和最后的连接原理图部分。
六、实验过程及原始记录1、音乐节拍发生器NoteTabs 模块这个模块用FPGA 的片内ROM 存放乐曲的简谱真值表,由一个二进制计数器为乐曲数据存储ROM 的地址发生器随着NoteTabs 中计数器按时钟频率做加法计数时,乐曲数据存储器ROM 中的音符数据,将从ROM 中的输出口输向音符译码电路Tonetaba ,所存储的乐曲就开始连续自然地演奏起来。
NoteTabs Speakera TonetabaROM的定制过程,利用MegawizardPlug-In Manager定制音符数据存储器music1 其过程如下:在QuartusII主窗口Tools菜单中选择MegawizardPlug-In Manager命令,选择Create a new custom megafunction项。
单击next按钮后,选择好后cyclone和VHDL语言后,产生对话框如下:如上所示就完成了,LPM_ROM的定制流程,完成了music1模块的定制工作,其产生的music1的VHDL语言程序如下:LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY altera_mf;USE altera_mf.altera_mf_components.all;ENTITY music1 ISPORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0);clock : IN STD_LOGIC ;q : OUT STD_LOGIC_VECTOR (3 DOWNTO 0));END music1;ARCHITECTURE SYN OF music1 ISSIGNAL sub_wire0 : STD_LOGIC_VECTOR (3 DOWNTO 0);COMPONENT altsyncramGENERIC (intended_device_family : STRING;width_a : NATURAL;widthad_a : NATURAL;numwords_a : NATURAL;operation_mode : STRING;outdata_reg_a : STRING;address_aclr_a : STRING;outdata_aclr_a : STRING;width_byteena_a : NATURAL;init_file : STRING;lpm_hint : STRING;lpm_type : STRING);PORT (clock0 : IN STD_LOGIC ;address_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0);q_a : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) );END COMPONENT;BEGINq<= sub_wire0(3 DOWNTO 0);altsyncram_component : altsyncramGENERIC MAP (intended_device_family => "Cyclone",width_a => 4,widthad_a => 8,numwords_a => 256,operation_mode => "ROM",outdata_reg_a => "CLOCK0",address_aclr_a => "NONE",outdata_aclr_a => "NONE",width_byteena_a => 1,init_file => "data.mif",lpm_hint => "ENABLE_RUNTIME_MOD=NO",lpm_type => "altsyncram")PORT MAP (clock0 => clock,address_a => address,q_a => sub_wire0);END SYN;在定制ROM的过程中,由于需要存入122个音符数据,选择ROM的数据位宽为8,地址为为8(共计256个字),ROM的类型选择为Auto。
根据友谊天长地久的音乐简谱,以及简谱中的低、中、高和额节拍与发生频率的关系等等,化成个音符数字有122个,存入ROM中。
在数据文件编辑窗中,在mif格式表格中填入友谊天长地久的122个音符数据,并以十进制填入,最后保存数据文件名为data.mif,存入原路径中。
2、音乐节拍发生器NoteTabs的VHDL设计其源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY NoteTabs ISPORT(clk4hz:IN STD_LOGIC;Index2:IN STD_LOGIC_VECTOR(3 DOWNTO 0);Tone:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END NoteTabs;ARCHITECTURE one OF NoteTabs ISCOMPONENT MUSIC1PORT (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);SIGNAL INDEX1:STD_LOGIC_VECTOR(3 DOWNTO 0);BeginCNT8:PROCESS(clk4hz,Counter)BEGINIF Counter=122 THEN Counter<="00000000";ELSIF(clk4hz'EVENT AND clk4hz='1') THEN Counter<=Counter+1;END IF;END PROCESS CNT8;u1:music1 PORT MAP(address=>Counter,clock=>clk4hz,q=>Index1);Tone<=Index1;END one;◆在源程序中Tone是音乐节拍发生器输出地音符数据;clk4hz是计数时钟输入端,该信号作为音符的快慢信号,频率越高,时钟的输出节拍速度就越快,演奏的速度也越快。
◆将以上设计的音乐节拍发生器设置成可调用的原件,以被高层使用,其生成项目符号为:3、音符译码电路Tonetaba模块,其程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY ToneTaba ISPORT(Index:IN STD_LOGIC_VECTOR(3 DOWNTO 0);CODE:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);HIGH:OUT STD_LOGIC;Tone:OUT STD_LOGIC_VECTOR(12 DOWNTO 0));END;ARCHITECTURE one OF ToneTaba ISBEGINPROCESS(Index)BEGINCASE Index ISWHEN"0000"=>Tone<="1111111111111";CODE<="0000";HIGH<='0';WHEN"0101"=>Tone<="0110000010001";CODE<="0101";HIGH<='0';WHEN"0110"=>Tone<="0111000111110";CODE<="0110";HIGH<='0';WHEN"1000"=>Tone<="1000100010001";CODE<="0001";HIGH<='1';WHEN"1001"=>Tone<="1001010110010";CODE<="0010";HIGH<='1';WHEN"1010"=>Tone<="1010000100101";CODE<="0011";HIGH<='1';WHEN"1100"=>Tone<="1011000001000";CODE<="0101";HIGH<='1';WHEN"1101"=>Tone<="1011100011110";CODE<="0110";HIGH<='1';WHEN"1111"=>Tone<="1100010001000";CODE<="0001";HIGH<='1';WHEN OTHERS=>Tone<="1111111111111";CODE<="0000";HIGH<='0';END CASE;END PROCESS;END;◆在源程序中,Index[3..0]是音乐节拍发生器输出地音符数据;Tone[12..0]是为数控分频模块提供音符频率的初始值,此处有一个音符译码输出CODE[3..0]和音高指示信号HIGH可以通过数码管和LED来显示乐曲演奏时对应得音符和高低音。