用VHDL实现乐曲播放与音乐键盘功能.docx
- 文档编号:6523395
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:13
- 大小:120.07KB
用VHDL实现乐曲播放与音乐键盘功能.docx
《用VHDL实现乐曲播放与音乐键盘功能.docx》由会员分享,可在线阅读,更多相关《用VHDL实现乐曲播放与音乐键盘功能.docx(13页珍藏版)》请在冰豆网上搜索。
用VHDL实现乐曲播放与音乐键盘功能
用VHDL实现乐曲播放与音乐键盘功能
附有VHDL程序
摘要
本设计目的是用VHDL实现乐曲播放与音乐键盘两用的系统。
该系统有两种工作模式:
一个是作为音乐按键使用;一个是播放乐曲。
作为音乐键盘,首先系统要能播放每个音符的声音,我们知道声音的高低由声音的频率来决定,实现每个音符不同的发音频率值,主要是通过一个可预置数的分频器,将时钟信号进行分频,分频后得到不同的发音频率。
音乐播放是该系统的附加功能。
作为音乐键盘,系统已经实现每个音符不同的发音频率值,要使系统能够实现演奏音乐的功能还需要确定每个音符的发声持续时间,通过将时钟信号适当分频,即每个节拍的持续时间,还需要按顺序存储乐曲的每个音符,每个节拍向蜂鸣器输出一个音符的声音。
正文
2.1.系统设计
设计要求:
本设计目的是用VHDL实现乐曲播放与音乐键盘两用的系统。
该系统有两种工作模式:
一个是作为音乐键盘使用;一个是播放乐曲。
设计方案:
本设计由三个模块构成:
(1)模块NOTETABS
模块NOTETABS有两种工作模式。
其中设置了全部音符对应的分频预置数,当系统作为音乐键盘时当有键盘按下时,模块TONETABA向当Tone输出一个与键盘对应的分频预置数;当系统作为音乐播放使用时模块,该模块是置了一个8位二进制计数器,这个计数器的计数频率为4HZ,即每一个计数值的停留时间为0.25秒,恰为当全音符设为1秒时,四四拍的4分音符持续时间,每个音符的停留时间由音乐节拍和音调发生器模块NOTETABS的clk的出入频率决定。
这个分频预置数的输出由对应于TONETABA中的Index[3..0]确定。
输向TONETABA中Index[3..0]的值ToneIndex[3..0]的输出值与持续时间由模块NOTETABS决定。
(2)模块TONETABA
模块TONETABA是乐曲简谱码对应的分频预置数查表电路,模块TONETABA接收模块NOTETABS发出的所要发生的音符的信息,然后查表,找出该音符所对应的分频预置数,并通过Tone端口向模块SREAKERA输出该预置数。
(3)模块SREAKERA
乐曲音符的频率可以由SREAKERA模块来获得,这是一个数控分频器,由其clk端输入一个具有较高频率的信号,通过SREAKERA分频后由SPKOUT输出,由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以聚恒其占空比,但这时的频率将是原来的1/2。
SPKOUT的输出频率将决定每个音符的音调。
系统总原理图如下:
程序流程图:
(见软件部分)
系统模式图;
本系统采用GW48EDA系统-模式三的电路,该模式的具体电路图如下:
按键、数码管、LED的具体安排如下:
本系统需要用到9个按键,期中一个按键用来对工作状态进行切换,另外八个按键作为音乐键盘的八个按键;用一个数码管来显示音符;一个LED灯用来和数码管一起显示高八度音。
由于模式三硬件上只有8个按键,因为只作为示意,减少一个音乐键盘按键,空出的一个按键用来作为对工作状态进行切换的按键。
功能
数码管5
音符显示
LED5
高八度音显示
按键1
音乐键盘音符1输入
按键2
音乐键盘音符2输入
按键3
音乐键盘音符3输入
按键4
音乐键盘音符4输入
按键5
音乐键盘音符5输入
按键6
音乐键盘音符6输入
按键7
音乐键盘音符7输入
按键8
作为系统状态切换的输入按键——由于该按键也是琴键式按键,所以作为状态切换功能的按键,还需要软件的处理,详见模块NOTETABS程序解释
2.2.单元电路设计
1、模块NOTETABS:
功能:
该模块有两种工作模式,通过transform这个端口的输入信号来区分不同的工作模式,由于本次系统采用模式三的电路,电路上只有琴键式按键,只能采用琴键式按键作为系统状态切换的输入按键,所以作为状态切换功能的按键,还需要软件的处理——即用变量Condition的值‘0’、‘1’来记录当前系统工作状态,当该端口有一次有效信号时,该Condition的值取反,模块的工作方式转变一次。
当系统作为音乐键盘时只有当有键盘按下时,模块TONETABA向当Tone输出一个与键盘对应的分频预置数;另一个工作模式,模块TONETABA将把预先存储的乐曲“童年”的音符依次向Index[3..0]端口输出。
程序主体部分与解释:
ARCHITECTUREoneOFNoteTabsIS
SIGNALCounter:
INTEGERRANGE0TO94;——自动计数,根据Counter的值输出对应的歌曲音符
SIGNALCondition:
STD_LOGIC;——用来记录当前工作状态,以便变换工作模式
BEGIN
CNT8:
PROCESS(clk)————该进程在transform信号的控制下修改信号Condition的值,Condition的值用来区分模块的工作模式
BEGIN
IFCounter=94THENCounter<=0;
ELSIF(clk'EVENTANDclk='1')THENCounter<=Counter+1;
ENDIF;
ENDPROCESS;
condition_transform:
PROCESS(transform)
BEGIN
用变量Condition的值‘0’、‘1’来记录当前系统工作状态。
当该端口有一次有效信号时,该Condition的值取反,模块的工作方式转变一次。
IFtransform'eventANDtransform='1'
THENIFCondition='0'
THENCondition<='1';
ELSECondition<='0';
ENDIF;
ENDIF;
ENDPROCESS;
Search:
PROCESS(Counter)
BEGIN
IFCondition='1'
THENIFkey1='1'THENToneIndex<=0;———工作模式一,作为音乐键盘使用,对每个键盘按键输出一个音符信息
ELSIFkey2='1'THEN
……
ENDIF;
ELSE
CASECounterIS———工作模式二,作为音乐播放,按顺序存储了童年的所有音符,每个节拍输出一个音符
WHEN00=>ToneIndex<=0;
……
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
ENDPROCESS;
END;
2、模块TONETABA
功能:
模块TONETABA是乐曲简谱码对应的分频预置数查表电路,模块TONETABA接收模块NOTETABS发出的所要发生的音符的信息,然后查表,找出该音符所对应的分频预置数,并通过Tone端口向模块SREAKERA输出该预置数。
程序主体与解释:
ARCHITECTUREoneOFToneTabaIS
BEGIN
search:
PROCESS(Index)
BEGIN
CASEIndexIS
WHEN0=>Tone<=2047;CODE<=0;HIGH<='0';——记录每个音符对应的预置数
……
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
END;
3、模块SPEAKERAR
功能:
这是一个数控分频器,由其clk端输入一个具有较高频率的信号,通过SREAKERA分频后由SPKOUT输出,由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以聚恒其占空比,但这时的频率将是原来的1/2。
SPKOUT的输出频率将决定每个音符的音调。
程序主体与解释:
BEGIN
IFPreCLK'EVENTANDPreCLK='1'THEN——该部分的主要功能是一个可预置数的的分频器
IFCount11=16#7FF#THEN
Count11:
=Tone;——将模块TONETABA送来的预置数给信号Count11
FullSpkS<='1';
ELSECount11:
=Count11+1;
FullSpkS<='0';ENDIF;
ENDIF;
ENDPROCESS;
2.3.软件设计
软件设计平台:
QuartusII
系统的总流程图:
2.4.系统测试
系统的性能指标;
1、当系统运行时,可以通过按键8输入信号,改变系统的工作模式——音乐键盘和音乐播放;如果系统当前为音乐键盘工作状态,按下按键8系统切换到音乐播放状态;反之,如果系统当前为音乐播放状态,按下按键8系统切换到音乐键盘工作状态;
2、当系统处于音乐播放状态时,系统能够演奏出歌曲《童年》,并数码管5上能够显示出当前播放的音符,如当前播放的音符是高八度音,数码管5上显示音符并且LED5亮。
音乐会循环播放。
3、当系统处于音乐键盘状态时,通过按下1、按键2、按键3、按键4、按5键、按键6、按键7蜂鸣器能够分别演奏出音符1、音符2、音符3、音符4、音符5、音符6、音符7的音调。
并且数码管5上能够显示出当前播放的音符,如当前播放的音符是高八度音,数码管5上显示音符并且LED5亮。
、
仪器设备名称、型号:
GW48EDA系统—模式三
测试方法:
1、GW48EDA系统选择模式三;
2、将本设计的sof文件下载到实验箱上;
3、依照上面的性能指标,对各个按键和功能进行测试;
3.结论
将本设计的sof文件下载到实验箱上,本设计能够完成设计要求的各项性能指标。
4.经验体会
通过这次对乐曲演奏与音乐键盘两用系统的设计制作,在此次设计过程中,我深刻感觉到想要写出好的程序,需要我们有扎实的基础,这样遇到一些基本算法的时候可能就会游刃有余了。
在编程是我们要有丰富的想象力。
不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。
丰富的想象力是建立在丰富的知识的基础上,所以我们要通过多的途径来帮助自己建立较丰富的知识结构。
在编程时我们会碰到了很多的困难,这就需要我们多与别人交流。
三人行必有我师,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。
在编程的过程中我们也看到了有良好的编程风格是十分重要的,至少在时间效率上就体现了这一点。
养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致,这些都是提高我们编程的注意点。
还有在变成中最能体现简单的原则。
所以我们要思考讨论简单的程序,这样简单的方法更容易被人理解,更容易实现,也更容易维护。
遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。
附录——程序
模块NOTETABS:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYNoteTabsIS
PORT(clk:
INSTD_LOGIC;
ToneIndex:
OUTINTEGERRANGE0TO15);
END;
ARCHITECTUREoneOFNoteTabsIS
SIGNALCounter:
INTEGERRANGE0TO94;
BEGIN
CNT8:
PROCESS(clk)
BEGIN
IFCounter=15THENCounter<=0;
ELSIF(clk'EVENTANDclk='1')THENCounter<=Counter+1;
ENDIF;
ENDPROCESS;
Search:
PROCESS(Counter)
BEGIN
CASECounterIS
WHEN00=>ToneIndex<=1;
WHEN01=>ToneIndex<=1;WHEN02=>ToneIndex<=5;WHEN03=>ToneIndex<=5;WHEN04=>ToneIndex<=6;WHEN05=>ToneIndex<=6;
WHEN06=>ToneIndex<=5;WHEN07=>ToneIndex<=5;WHEN08=>ToneIndex<=4;WHEN09=>ToneIndex<=4;WHEN10=>ToneIndex<=3;
WHEN11=>ToneIndex<=3;WHEN12=>ToneIndex<=2;WHEN13=>ToneIndex<=2;WHEN14=>ToneIndex<=1;WHEN15=>ToneIndex<=1;
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
END;
模块TONETABA:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYToneTabaIS
PORT(Index:
ININTEGERRANGE0TO15;
CODE:
OUTINTEGERRANGE0TO15;
HIGH:
OUTSTD_LOGIC;
Tone:
OUTINTEGERRANGE0TO16#7FF#);
END;
ARCHITECTUREoneOFToneTabaIS
BEGIN
search:
PROCESS(Index)
BEGIN
CASEIndexIS
WHEN0=>Tone<=2047;CODE<=0;HIGH<='0';
WHEN1=>Tone<=773;CODE<=1;HIGH<='0';
WHEN2=>Tone<=912;CODE<=2;HIGH<='0';
WHEN3=>Tone<=1036;CODE<=3;HIGH<='0';
WHEN4=>Tone<=1100;CODE<=4;HIGH<='0';
WHEN5=>Tone<=1197;CODE<=5;HIGH<='0';
WHEN6=>Tone<=1290;CODE<=6;HIGH<='0';
WHEN7=>Tone<=1372;CODE<=7;HIGH<='0';
WHEN8=>Tone<=1410;CODE<=1;HIGH<='1';
WHEN9=>Tone<=1480;CODE<=2;HIGH<='1';
WHEN10=>Tone<=1542;CODE<=3;HIGH<='1';
WHEN12=>Tone<=1622;CODE<=5;HIGH<='1';
WHEN13=>Tone<=1668;CODE<=6;HIGH<='1';
WHEN15=>Tone<=1728;CODE<=1;HIGH<='1';
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
END;
模块SREAKERA:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYSpeakeraIS
PORT(clk:
INSTD_LOGIC;
Tone:
ININTEGERRANGE0TO16#7FF#;
SpkS:
OUTSTD_LOGIC);
END;
ARCHITECTUREoneOFSpeakeraIS
SIGNALPreCLK:
STD_LOGIC;
SIGNALFullSpkS:
STD_LOGIC;
BEGIN
DivideCLK:
PROCESS(clk)
VARIABLECount4:
INTEGERRANGE0TO15;
BEGIN
PreCLK<='0';
IFCount4>11THENPreCLK<='1';Count4:
=0;
ELSIFclk'EVENTANDclk='1'THENCount4:
=Count4+1;
ENDIF;
ENDPROCESS;
GenSpkS:
PROCESS(PreCLK,Tone)
VARIABLECount11:
INTEGERRANGE0TO16#7FF#;
BEGIN
IFPreCLK'EVENTANDPreCLK='1'THEN
IFCount11=16#7FF#THEN
Count11:
=Tone;
FullSpkS<='1';
ELSECount11:
=Count11+1;
FullSpkS<='0';ENDIF;
ENDIF;
ENDPROCESS;
DelaySpkS:
PROCESS(FullSpkS)
VARIABLECount2:
STD_LOGIC;
BEGIN
IFFullSpkS'EVENTANDFullSpkS='1'THEN
Count2:
=NOTCount2;
IFCount2='1'THENSpkS<='1';
ELSESpkS<='0';ENDIF;
ENDIF;
ENDPROCESS;
END;
参考文献:
[1]赵建领.51系列单片机开发宝典[M].北京:
电子工业出版社,2007.
[2]边春元等.C51单片机典型模块设计及应用[M].北京:
机械工业出版社,2008.
[3]彭为等.单片机典型系统设计实例精讲[M].北京:
电子工业出版社,2006.
[4]徐爱钧等.KeilC51V7.0单片机高级语言编程与μVision2应用实践[M].北京:
电子工业出版社,2008.
[5]李朝青.单片机&DSP外围数字IC技术手册(第2版)[M].北京:
北京航空航天大学出版社,2005.
[6]中国电子网..
[7]51单片机学习网.http:
//www.51bs51.com.
[8]电子电路图网..
[9]周志敏等.集成稳压电源电路图集[M].北京:
中国电力出版社,2008.
[10]楼然苗等.单片机课程设计指导[M].北京:
北京航空航天大学出版社,2007
[11]高吉祥.全国大学生电子设计竞赛培训系列教程——数字系统与自动控制系统设计[M].北京:
电子工业出版社,2007.
[12]全国大学生电子设计竞赛委员会.全国大学生电子设计竞赛获奖作品选编(2005)[M].北京:
北京理工大学出版社,2007
[13]黄智伟等.全国大学生电子设计竞赛系统设计[M].北京.北京航空航天大学出版社,2008.
[14]闻新等.MCS-51/52单片机原理与应用[M].北京.科学出版社,2008.
系统电路原理总图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VHDL 实现 乐曲 播放 音乐 键盘 功能