基于VerilogHDL的乐曲演奏电路设计.docx

上传人:b****6 文档编号:4325659 上传时间:2022-11-29 格式:DOCX 页数:16 大小:104.24KB
下载 相关 举报
基于VerilogHDL的乐曲演奏电路设计.docx_第1页
第1页 / 共16页
基于VerilogHDL的乐曲演奏电路设计.docx_第2页
第2页 / 共16页
基于VerilogHDL的乐曲演奏电路设计.docx_第3页
第3页 / 共16页
基于VerilogHDL的乐曲演奏电路设计.docx_第4页
第4页 / 共16页
基于VerilogHDL的乐曲演奏电路设计.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

基于VerilogHDL的乐曲演奏电路设计.docx

《基于VerilogHDL的乐曲演奏电路设计.docx》由会员分享,可在线阅读,更多相关《基于VerilogHDL的乐曲演奏电路设计.docx(16页珍藏版)》请在冰豆网上搜索。

基于VerilogHDL的乐曲演奏电路设计.docx

基于VerilogHDL的乐曲演奏电路设计

1引言

随着EDA技术的进展,基于可编程的数字电子系统设计的完整方案越来越受到人们的重视。

与利用微处理器(CPU或MCU)来实现乐曲演奏相比,以纯硬件完成乐曲演奏电路的逻辑要复杂得多,如果不借助于功能强大的EDA工具和硬件描述语言,仅凭传统的数字逻辑技术,即使最简单的演奏电路也难以实现。

如何使用EDA工具设计电子系统是人们普遍关心的问题。

本课程设计主要是采用FPGA器件驱动小扬声器构成一个乐曲演奏电路,FPGA器件选择Altera的EPF10K10,在MAX+plusⅡ的EDA软件平台上,实现了乐曲演奏电路的设计。

1.1课程设计的目的

本课程设计主要是基于VerilogHDL设计乐曲演奏电路,系统实现是用硬件描述语言VerilogHDL按分频控制的方式进行设计,然后进行编程、时序仿真、电路功能验证,奏出美妙的乐曲。

该设计的目的在于加深对EDA技术的理解,掌握乐曲演奏电路的工作原理,了解怎样控制音调的高低变化和音长,从而完成乐曲的自动循环演奏。

1.2课程设计的要求

本课程设计中由于每一个音调对应不同的频率,从而输出对应频率的声音。

因此本设计要求通过控制输出到扬声器的激励信号频率的高低和持续的时间,从而使扬声器发出连续的乐曲声,且当乐曲演奏完成时,保证能自动从头开始演奏。

1.3设计平台

MAX+plusⅡ是美国Altera公司的一种EDA软件,用于开发CPLD和FPGA进行数字系统的设计。

 

2应用工具介绍

作为当今最流行的计算机软件系统,EDA技术是以计算机为工作平台,融合了应用电子技术、计算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动设计。

EDA可提供文本输入以及图形编辑的方法将设计者的意图用程序或者图形方式表达出来,而我们经常用到的VHDL语言便是用于编写源程序所需的最常见的硬件描述语言(HDL)之一。

2.1EDA技术介绍

EDA是电子设计自动化(ElectronicDesignAutomation)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来。

EDA技术是在电子CAD技术基础上发展起来的计算机软件系统,是指以计算机为工作平台,融合了应用电子技术、计算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动设计[1]。

EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。

典型的EDA工具中必须包含两个特殊的软件包,即综合器和适配器。

综合器的功能就是将设计者在EDA平台上完成的针对某个系统项目的HDL、原理图或状态图形描述,针对给定的硬件系统组件,进行编译、优化、转换和综合,最终获得我们欲实现功能的描述文件。

综合器在工作前,必须给定所要实现的硬件结构参数,它的功能就是将软件描述与给定的硬件结构用一定的方式联系起来。

也就是说,综合器是软件描述与硬件实现的一座桥梁。

综合过程就是将电路的高级语言描述转换低级的、可与目标器件FPGA/CPLD相映射的网表文件。

在今天,EDA技术已经成为电子设计的普遍工具,无论设计芯片还是设计系统,没有EDA工具的支持,都是难以完成的。

EDA工具已经成为设计师必不可少的武器,起着越来越重要的作用。

从目前的EDA技术来看,其发展趋势是政府重视、使用普及、应用广泛、工具多样、软件功能强大。

EDA技术发展迅猛,完全可以用日新月异来描述。

EDA技术的应用广泛,现在已涉及到各行各业。

EDA水平不断提高,设计工具趋于完美的地步。

2.2VerilogHDL语言介绍

VerilogHDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。

被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。

数字系统能够按层次描述,并可在相同描述中显式地进行时序建模[2]。

作为一种通用化的硬件描述语言,VerilogHDL语言具有下述描述能力:

设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。

所有这些都使用同一种建模语言。

此外,VerilogHDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行[3]。

VerilogHDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。

因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。

语言从C编程语言中继承了多种操作符和结构。

VerilogHDL提供了扩展的建模能力,其中许多扩展最初很难理解。

但是,VerilogHDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。

当然,完整的硬件描述语句足以对从最复杂的芯片到完整的电子系统进行描述。

VerilogHDL语言已经成为一种标准的硬件描述语言。

它具有以下特点:

(1)作为一种多用途的硬件描述语言,它具有很好的易学性和易用性。

(2)VerilogHDL语言允许在同一个模块中进行不同抽象层次的描述。

(3)大多数逻辑综合工具都支持VerilogHDL,使得它成为设计人员的一个很好的选择。

(4)所有的制造厂商都提供了VerilogHDL的工艺库,用以支持仿真。

(5)VerilogHDL的程序语言接口拥有强大的功能,允许用户用C语言对内部数据结构进行描述[3]。

正是以上优点,使得VerilogHDL语言广泛流行。

3设计原理

乐曲演奏的原理是这样的:

组成乐曲的每个音符的频率值(音调)及其持续的时间(音长)是乐曲能连续演奏所需的两个基本数据,因此只要控制输出到扬声器的激励信号频率的高低和持续的时间,就可以使扬声器发出连续的乐曲声[4]。

3.1音调的控制

频率的高低决定了音调的高低。

音乐的十二平均率规定:

每两个8度音(如简谱中的中音1与高音1)之间的频率相差一倍。

在两个8度音之间,又可分为12个半音,每两个半音的频率比为12√2。

 另外,音名A(简谱中的低音6)的频率为440Hz,音名B到C之间、E到F之间为半音,其余为全音[4]。

由此可以计算出简谱中从低音1至高音1之间每个音名对应的频率,如表3.11所示:

表3.11简谱中的音名与频率的关系

音名

频率/Hz

音名

频率/Hz

音名

频率/Hz

低音1

261.6

中音1

523.3

高音1

1046.5

低音2

293.7

中音2

587.3

高音2

1174.7

低音3

329.6

中音3

659.3

高音3

1318.5

低音4

349.2

中音4

698.5

高音4

1396.9

低音5

392

中音5

784

高音5

1568

低音6

440

中音6

880

高音6

1760

低音7

493.9

中音7

987.8

高音7

1975.5

所有不同频率的信号都是从同一个基准频率分频得到的。

由于音阶频率多为非整数,而分频系数又不能为小数,故必须将计算得到的分频数四舍五入取整。

若基准频率过低,则由于分频比太小,四舍五入取整后的误差较大;若基准频率过高,虽然误差变小,但分频数将变大。

实际的设计综合考虑这两方面的因素,在尽量减小频率误差的前提下取合适的基准频率[4]。

本例中选取6MHz为基准频率。

若无6MHz的基准频率,则可以先分频得到6MHz,或换一个新的基准频率。

实际上,只要各个音名间的相对频率关系不变,演奏出的乐曲听起来都不会"走调"。

本例需要演奏的是梁祝乐曲,该乐曲各音阶频率及相应的分频比如表2所示。

为了减小输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,因此在到达扬声器之前,有一个二分频的分频器。

表2中的分频比就是从6MHz频率二分频得到的3MHz频率基础上计算得出的。

由于最大的分频系数为9102,故采用14位二进制计数器分频可满足需要。

在表2中,除给出了分频比以外,还给出了对应于各个音阶频率时计数器不同的预置数。

对于不同的分频系数,只要加载不同的预置数即可。

采用加载预置数实现分频的方法比采用反馈复零法节省资源,实现起来也容易一些,如表3.12所示:

表3.12各音阶频率对应的分频比及预置数

音名

分频比

预置数

音名

分频比

预置数

低音3

9102

7281

中音2

5111

11272

低音5

7653

8730

中音3

4552

11831

低音6

6818

9565

中音5

3827

12556

低音7

6073

10310

中音6

3409

12974

中音1

5736

10647

高音1

2867

13516

此外,对于乐曲中的休止符,只要将分频系数设为0,即初始值为2141=16383即可,此时扬声器将不会发声。

3.2音长的控制

音符的持续时间必须根据乐曲的速度及每个音符的节拍数来确定。

本例演奏的梁祝片段,最短的音符为4分音符,如果将全音符的持续时间设为1s的话,则只需要再提供一个4Hz的时钟频率即可产生4分音符的时长[4]。

如图3.2所示是乐曲演奏电路的原理框图,其中,乐谱产生电路用来控制音乐的音调和音长。

控制音调通过设置计数器的预置数来实现,预置不同的数值可以使计数器产生不同频率的信号,从而产生不同的音调。

控制音长是通过控制计数器预置数的停留时间来实现的,预置数停留的时间越长,则该音符演奏的时间越长。

每个音符的演奏时间都是0.25s的整数倍,对于节拍较长的音符,如2分音符,在记谱时将该音名连续记录两次即可。

图3.2乐曲演奏电路原理图

音名显示电路用来显示乐曲演奏时对应的音符。

可以用3个数码管,分别显示高、中、低音的音名,实现演奏的动态显示,十分直观。

在本例中,high[3:

0]、med[3:

0]、low[3:

0]等信号分别用于显示高音、中音、低音音符。

为了使演奏能循环进行,需另外设置一个时长计数器,当乐曲演奏完成时,保证能自动从头开始演奏。

 

4设计步骤

本设计是采用FPGA器件驱动小扬声器构成一个乐曲演奏电路,图1是一个典型的FPGA/CPLD设计流程:

图1VerilogHDL设计流程

4.1系统分析

本设计要求在MAX+plusⅡ的EDA软件平台上,运用VerilogHDL语言进行编程,实现“梁祝”乐曲片段电路的设计。

程序流程图如图4.1所示:

图4.1程序流程图

反馈预置计数器对基准频率6MHz进行分频,产生分频后的输出时钟信号。

再经过2分频器,成为方波信号,以驱动扬声器发声。

音名显示电路显示乐曲演奏时对应的音符。

乐谱产生电路用来根据高音、中音和低音的值决定分频计数器的预置数的值。

其中2分频器,产生驱动扬声器的方波信号,音名显示,根据时长计数器的值决定高音、中音和低音的值,乐谱产生电路,根据高音、中音和低音的值决定分频计数器的预置数origin的值。

4.2程序设计

根据程序流程图编写程序,部分源程序如下所示:

modulesong(clk_6MHz,clk_4Hz,speaker,high,med,low);//模块名为song(端口列表)

inputclk_6MHz,clk_4Hz;//定义两个输入端口

outputspeaker;//定义一个输出端口

output[3:

0]high,med,low;

reg[3:

0]high,med,low;//定义了3个4位寄存器

reg[13:

0]divider,origin;//定义了2个14位寄存器

reg[9:

0]counter;//定义了1个10位寄存器

regspeaker;

wirecarry;

assigncarry=(divider==16383);//连续赋值语句

always@(posedgeclk_6MHz)

beginif(carry)divider<=origin;

elsedivider<=divider+1;

end

always@(posedgecarry)

beginspeaker<=~speaker;end//二分频产生方波信号

4.3系统仿真

系统仿真是在实际系统上进行实验研究比较困难时适用的必不可少的工具,它是指通过系统模型实验去研究一个已经存在或正在设计的系统的过程,通俗地讲,就是进行模型实验。

因而,系统仿真的结果决定整个课程设计任务完成的到位程度。

程序输入完成后进行编译,编译完成后,可以对所进行的设计进行仿真,本课程设计的仿真平台是MAX+plusⅡ,通过对VerilogHDL源程序进行编译检错,然后创建波形文件(后缀名为.scf),加入输入输出变量,选择适用的芯片(EP1K30QC208-2)以及设定仿真结束时间,设置好输入初值进行仿真,得到仿真波形图如图4.31所示:

图4.31系统仿真图

仿真图中,输出high,med,low分别显示高音,中音,低音音符,连起来可看出正是我们所要求的“梁祝”片段曲谱;而counter信号在4Hz时钟信号的每一个上升沿计数加1;origin信号表示分频计数器的预置数,与表3.12对比,检查无误。

通过观察发现,所得到功能仿真波形与题目的要求一致,则可以进行器件编程下载。

模块的源程序符号编辑图如图4.32所示:

图4.32模块符号编辑图

4.4结果分析

完成乐曲演奏电路设计后,实现了“梁祝”乐曲片段的自动循环演奏,实际仿真和要求的结果一致,达到所需要设计的目的。

 

结束语

课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。

随着科学技术发展的日新月异,EDA技术已经成为当今计算机应用中空前活跃的领域,在生活中可以说是无处不在。

因此作为二十一世纪的大学生来说掌握EDA技术是十分重要的。

第一次接触课程设计,从开始的一窍不通,到后来慢慢了解,经历了很长的时间。

回顾起此次EDA课程设计,我感慨良多,的确,从审题到编程,从理论到实践,在这三个星期的日子里,我受益匪浅。

不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能解决实际中的问题,从而提高自己的实际动手能力和独立思考的能力。

这毕竟是第一次做课程设计,难免会遇到各种各样的问题,同时在设计的过程中我也发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。

但通过这次课程设计之后,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。

 

致谢

在课程设计的过程中,由于对知识的不理解,因此也遇到了很多的困难,虽然设计存在一些不足之处,但通过同学和老师的帮助,问题得到了一步一步的解决,也让我在课程设计的过程中学到了很多很多知识,让我了解到计算机编程是一个很精深的过程,只有不断的调试,不断的实践,不断的付出努力才可以得到预期的结果。

此课程设计得到了很多同学和老师的支持,在此深表感谢!

 

参考文献

[1]潘松,黄继业.EDA技术使用教程.北京:

科学出版社,2002

[2]王伟.VerilogHDL程序设计与应用.北京:

人民邮电出版社,2005

[3]刘秋云,王佳.VerilogHDL设计实践与指导.北京:

机械工业出版社,2005

[4]王金民.数字系统设计与VerilogHDL(第二版).北京:

电子工业出版社,2005

[5]李国洪,沈明山,胡辉.可编程器件EDA技术与实践[M].北京:

机械工业出版社,2004年,7月.

[6]付家才.EDA工程实践技术[M].北京:

工业出版社,2005年,1月.

附录:

乐曲演奏电路设计源程序清单

//程序名称:

song.v

//程序功能:

采用分频控制的方法,完成乐曲的循环演奏

//程序作者:

吴卓

//最后修改日期:

2009-9-25

//信号定义与说明:

//clk_4Hz:

用于控制音长(节拍)的时钟频率;

//clk_6MHz:

用于产生各种音阶频率的基准频率;

//speaker:

用于激励扬声器的输出信号,本例中为方波信号;

//high,med,low:

分别用于显示高音、中音和低音音符,各驱动一个数码管来显示

modulesong(clk_6MHz,clk_4Hz,speaker,high,med,low);//模块名为song(端口列表)

inputclk_6MHz,clk_4Hz;//定义两个输入端口

outputspeaker;//定义一个输出端口

output[3:

0]high,med,low;

reg[3:

0]high,med,low;//定义了3个4位寄存器

reg[13:

0]divider,origin;//定义了2个14位寄存器

reg[9:

0]counter;//定义了1个10位寄存器

regspeaker;

wirecarry;

assigncarry=(divider==16383);//连续赋值语句

always@(posedgeclk_6MHz)

beginif(carry)divider<=origin;

elsedivider<=divider+1;

end

always@(posedgecarry)

beginspeaker<=~speaker;end//二分频产生方波信号

always@(posedgeclk_4Hz)

begin

case({high,med,low})//分频比预置

'b000000000011:

origin<=7281;//低音3

'b000000000101:

origin<=8730;//低音5

'b000000000110:

origin<=9565;//低音6

'b000000000111:

origin<=10310;//低音7

'b000000010000:

origin<=10647;//中音1

'b000000100000:

origin<=11272;//中音2

'b000000110000:

origin<=11831;//中音3

'b000001010000:

origin<=12556;//中音5

'b000001100000:

origin<=12974;//中音6

'b000100000000:

origin<=13516;//高音1

'b000000000000:

origin<=16383;//休止符

endcase

end

always@(posedgeclk_4Hz)

begin

if(counter==151)counter<=0;//计时,以实现循环演奏

elsecounter<=counter+1;

case(counter)//记谱

0:

{high,med,low}<='b000000000011;//低音“3”

1:

{high,med,low}<='b000000000011;//持续4个时钟节拍

2:

{high,med,low}<='b000000000011;

3:

{high,med,low}<='b000000000011;

4:

{high,med,low}<='b000000000101;//低音“5”

5:

{high,med,low}<='b000000000101;//发3个时钟节拍

6:

{high,med,low}<='b000000000101;

7:

{high,med,low}<='b000000000110;//低音“6”

8:

{high,med,low}<='b000000010000;//中音“1”

9:

{high,med,low}<='b000000010000;//发3个时钟节拍

10:

{high,med,low}<='b000000010000;

11:

{high,med,low}<='b000000100000;//中音“2”

12:

{high,med,low}<='b000000000110;//低音“6”

13:

{high,med,low}<='b000000010000;//中音“1”

14:

{high,med,low}<='b000000000101;//低音“5”

15:

{high,med,low}<='b000000000101;

16:

{high,med,low}<='b000001010000;//中音“5”

17:

{high,med,low}<='b000001010000;//发3个时钟节拍

18:

{high,med,low}<='b000001010000;

19:

{high,med,low}<='b000100000000;//高音“1”

20:

{high,med,low}<='b000001100000;//中音“6”

21:

{high,med,low}<='b000001010000;//中音“5”

22:

{high,med,low}<='b000000110000;//中音“3”

23:

{high,med,low}<='b000001010000;//中音“5”

24:

{high,med,low}<='b000000100000;//中音“2”

25:

{high,med,low}<='b000000100000;//持续11个时钟节拍

26:

{high,med,low}<='b000000100000;

27:

{high,med,low}<='b000000100000;

28:

{high,med,low}<='b000000100000;

29:

{high,med,low}<='b000000100000;

30:

{high,med,low}<='b000000100000;

31:

{high,med,low}<='b000000100000;

32:

{high,med,low}<='b000000100000;

33:

{high,med,low}<='b000000100000;

34:

{high,med,low}<='b000000100000;

35:

{high,med,low}<='b000000110000;//中音“3”

36:

{high,med,low}<='b000000000111;//低音“7”

37:

{high,med,low}<='b000000000111;

38:

{high,med,low}<='b000000000110;//低音“6”

39:

{high,med,low}<='b000000000110;

40:

{high,med,low}<='b000000000101;//低音“5”

41:

{h

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 科学

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

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