VHDL语言电子琴设计.docx
《VHDL语言电子琴设计.docx》由会员分享,可在线阅读,更多相关《VHDL语言电子琴设计.docx(23页珍藏版)》请在冰豆网上搜索。
VHDL语言电子琴设计
西北师范大学知行学院电信系13—电本班
简易电子琴的设计
摘要本系统是采用EDA技术设计的一个简易的八音符电子琴,该系统基于计算机中时钟分频器的原理,采用自顶向下的设计方法来实现,它可以通过按键输入来控制音响。
系统由乐曲自动演奏模块、音调发生模块和数控分频模块三个部分组成。
系统实现是用硬件描述语言VHDL按模块化方式进行设计,然后进行编程、时序仿真、整合。
本系统功能比较齐全,有一定的使用价值。
关键字电子琴;EDA;VHDL;音调发生;
目录
1引言1
1.1设计的目的1
1.2设计的基本内容1
2EDA、VHDL简介1
2.1EDA技术1
2.2硬件描述语言——VHDL2
2.2.1VHDL的简介2
2.2.2VHDL语言的特点2
2.2.3VHDL的设计流程3
3简易电子琴设计过程3
3.1简易电子琴的工作原理3
3.2简易电子琴的工作流程图5
3.3简易电子琴中各模块的设计6
3.3.1乐曲自动演奏模块6
3.3.2音调发生模块7
3.3.3数控分频模块8
3.3.4顶层设计9
4系统仿真10
5结束语12
致谢13
参考文献14
附录15
1引言
我们生活在一个信息时代,各种电子产品层出不穷,作为一个计算机专业的学生,了解这些电子产品的基本组成和设计原理是十分必要的,我们学习的是计算机组成的理论知识,而课程设计正是对我们学习的理论的实践与巩固。
本设计主要介绍的是一个用超高速硬件描述语言VHDL设计的一个具有若干功能的简易电子琴,其理论基础来源于计算机组成原理的时钟分频器。
1.1设计的目的
本次设计的目的就是在掌握计算机组成原理理论的基础上,了解EDA技术,掌握VHDL硬件描述语言的设计方法和思想,通过学习的VHDL语言结合电子电路的设计知识理论联系实际,掌握所学的课程知识,例如本课程设计就是基于所学的计算机原理中的时钟分频器和定时器的基础之上的,通过本课程设计,达到巩固和综合运用计算机原理中的知识,理论联系实际,巩固所学理论知识,并且提高自己通过所学理论分析、解决计算机实际问题的能力。
1.2设计的基本内容
基于MAX+PLUS平台,运用VHDL语言对简易电子琴的各个模块进行设计,并使用EDA工具对各模块进行仿真验证。
本设计包含如下三个模块:
乐曲自动演奏模块,音调发生模块,数控分频模块,最后把各个模块整合后,通过电路的输入输出对应关系连接起来。
2EDA、VHDL简介
2.1EDA技术
EDA技术是在电子CAD技术基础上发展起来的计算机软件系统,有狭义与广义之分,本设计讨论的是狭义的EDA技术。
它是指以大规模可编程逻辑器件为设计载体,以硬件描述语言为系统逻辑描述的主要表达方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关的开发软件,自动完成软件方式设计的电子系统到硬件系统的逻辑编译、逻辑化简、逻辑分割、逻辑综合及优化、逻辑布局布线、逻辑仿真,直到对于特定目标芯片的适配编译、逻辑映射、逻辑下载等工作,最终形成集成电子系统或专用集成芯片的一门新技术。
利用EDA工具,电子设计师可以从概念、算法、协议等开始设计电子系统,大量工作可以通过计算机完成,并可以将电子产品从电路设计、性能分析到设计出IC版图或PCB版图的整个过程的计算机上自动处理完成。
现在对EDA的概念或范畴用得很宽。
包括在机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域,都有EDA的应用。
目前EDA技术已在各大公司、企事业单位和科研教学部门广泛使用。
例如在飞机制造过程中,从设计、性能测试及特性分析直到飞行模拟,都可能涉及到EDA技术。
本文所指的EDA技术,主要针对电子电路设计、PCB设计和IC设计。
2.2硬件描述语言——VHDL
2.2.1VHDL的简介
VHDL是一种用来描述数字逻辑系统的“编程语言”它的全名是Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,诞生于1982年。
1987年底,VHDL被IEEE(TheInstituteofElectricalandElectronicsEngineers)和美国国防部确认为标准硬件描述语言。
它源于美国政府于1980年开始启动的超高速集成电路计划,VHDL主要用于描述数字系统的结构、行为、功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件、一个电路模块或一个系统)分成外部(或称可是部分,即端口)和内部(或称不可视部分,既设计实体的内部功能和算法完成部分)两部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
应用VHDL进行工程设计的优点是多方面的。
VHDL的应用必将成为当前以及未来EDA解决方案的核心,更是整个电子逻辑系统设计的核心。
2.2.2VHDL语言的特点
(1)VHDL具有更强的行为描述能力,从而决定了他成为电子工程领域事实上通用的硬件描述语言。
强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。
(2)VHDL语句的行为描述能力和程序结构,决定了他具有支持大规模设计的分解和已有设计的再利用功能。
高效、高速完成符合市场需求的必须有多人甚至多个代发组共同并行工作才能实现的大规模系统设计。
VHDL中设计实体的概念、程序包的概念、设计库的概念为设计的分解和并行工作提供了有利的支持。
(3)VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期,就能查验设计系统的功能可行性,随时可对设计进行仿真模拟,使设计者对整个工程的结构和功能可行性做出判断。
(4)用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动的把VHDL描述设计转变成门级网表(根据不同的实现芯片)。
(5)VHDL对设计的描述具有相对独立性。
设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计。
正因为VHDL的硬件描述与具体的工艺技术和硬件结构无关,所以VHDL设计程序的硬件实现目标器件有广阔的悬着范围。
(6)VHDL具有类属描述语句和子程序调用等程序,对于完成的设计,在不改变源程序的条件下,只需要改变类属参数量或者函数,就能轻易地改变设计的规模和结构。
2.2.3VHDL的设计流程
用VHDL语言设计电路的流程:
在用VHDL语言来设计电路时,主要的过程是这样的:
(1)创建VHDL设计工程及使用文本编辑器输入设计源文件。
(2)使用编译工具编译源文件。
VHDL的编译器有很多,ACTIVE公司,MODELSIM公司,SYNPLICITY公司,SYNOPSYS公司,VERIBEST公司等都有自己的编译器。
(3)目标器件的选择和源程序的编译及综合。
(4)编辑测试文件及器件引脚的锁定和适配。
(5)系统的功能仿真。
对进入功能仿真,给测试向量赋值,再设置波形的观察格式。
作为一个独立的设计项目而言,仿真文件的提供足可以证明你设计的完整性。
(6)连接硬件测试系统,进行下载操作,再通过硬件系统进行测试。
(7)综合。
综合的目的是在于将设计的源文件由语言转换为实际的电路。
这一部分的最终目的是生成门电路级的网表(Netlist)。
(8)布局、布线。
这一步的目的是生成用于烧写的编程文件。
在这一步,将用到第(7)步生成的网表并根据CPLD/FPG厂商的器件容量,结构等进行布局、布线。
这就好像在设计PCB时的布局布线一样。
先将各个设计中的门根据网表的内容和器件的结构放在器件的特定部位。
然后,在根据网表中提供的各门的连接,把各个门的输入输出连接起来。
(9)后仿真。
这一步主要是为了确定你的设计在经过布局布线之后,是不是还满足
你的设计要求。
3简易电子琴设计过程
3.1简易电子琴的工作原理
音乐产生原理及硬件设计由于一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,
图3.1简易电子琴的工作原理图
3.2简易电子琴的工作流程图
图3.2简易电子琴的工作流程图
3.3简易电子琴中各模块的设计
为了更清楚的了解电子琴的工作过程,我们利用EDA工具(本课程设计Max+plus)对各个模块实施时序仿真(TimingSimulation),由自顶向下的设计方式,最后将三个模块进行整合,做出简易电子琴整个系统的时序仿真图。
3.3.1乐曲自动演奏模块
乐曲自动演奏模块的作用是产生8位发声控制输入信号。
当进行自动演奏时,由存储在此模块中的8位二进制作为发声控制输入,从而自动演奏乐曲。
这段模块的原理图如图3.3所示:
3.3乐曲自动演奏模块原理图
乐曲自动演奏模块可以由VHDL语言来实现,下面是一段主要代码:
BEGIN
IFAUTO='0'THEN
CASECOUNTIS
WHEN0=>INDEX0<="00000100";--3
WHEN1=>INDEX0<="00000100";--3
WHEN2=>INDEX0<="00000100";--3
WHEN3=>INDEX0<="00000100";--3
.
.
.
WHEN29=>INDEX0<="00000100";--3
WHEN30=>INDEX0<="00000010";--2
WHEN31=>INDEX0<="00000010";--2
ENDCASE;
ELSEINDEX0<=INDEX2;
ENDIF;
ENDPROCESS;
3.3.2音调发生模块
音调发生模块的作用是产生音阶的分频预置值。
当8位发声控制输入信号中的某一位为高电平时,则对应某一音阶的数值将输出,该数值即为该音阶的分频预置值,分频预置值控制数控分频模块进行分频,由此可得到每个音阶对应的频率。
图3.5是音调发生模块的原理图:
图3.5音调发生模块原理图
音调发生模块可以由VHDL语言来实现,下面是一段主要代码:
BEGIN
CASEINDEXIS
WHEN"00000001"=>TONE0<=773;CODE<="1001111";HIGH<='1';
WHEN"00000010"=>TONE0<=912;CODE<="0010010";HIGH<='1';
WHEN"00000100"=>TONE0<=1036;CODE<="0000110";HIGH<='1';
WHEN"00001000"=>TONE0<=1116;CODE<="1001100";HIGH<='1';
WHEN"00010000"=>TONE0<=1197;CODE<="0100100";HIGH<='0';
WHEN"00100000"=>TONE0<=1290;CODE<="0100000";HIGH<='0';
WHEN"01000000"=>TONE0<=1372;CODE<="0001111";HIGH<='0';
WHEN"10000000"=>TONE0<=1410;CODE<="0000000";HIGH<='0';
WHENOTHERS=>TONE<=2047;CODE<="0000001";HIGH<='0';
ENDCASE;
ENDPROCESS;
3.3.3数控分频模块
在对计算机组成原理的学习中,我们知道数控分频器的功能是在输入端输入不同数据时,对输入时钟产生不同的分频比,输出不同频率的时钟,以改变输出信号的频率。
本设计中数控分频模块是利用并行预置数的减法计数器对时基脉冲进行分频,得到与1、2、3、4、5、6、7七个音符相对应的频率。
数控分频模块原理图如图3.7所示:
图3.7数控分频模块原理图
其主要VHDL代码如下所示:
BEGIN
PROCESS(CLK1)
VARIABLECOUNT:
INTEGERRANGE0TO8;
BEGIN
IF(CLK'EVENTANDCLK1='1')THEN
COUTNT:
=COUNT+1;
IFCOUNT=2THEN
PRECLK<='1';
ELSECOUNT=4THEN
PRECLK<='0';COUTN:
=0;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(PRECLK,TONE1)
VARIABLECOUNT11:
INTEGERRANGE0TO2047;
BEGIN
IF(PRECLK'EVENTANDPRECLK='1')THEN
IFCOUNT11COUNT11:
=COUNT11+1;FULLSPKS<='1';
ELSE
COUNT11:
=0;FULLSPKS<='0';
ENDIF;
ENDIF;
ENDPROCESS;
3.3.4顶层设计
把以上设计的各个模块进行整合,最后我们得到了系统的整个工作原理图,如图3.10:
3.10简易电子琴的工作原理图
完成整个系统顶层设计的主要VHDL代码如下:
ARCHITECTUREARTOFDIANZIQINIS
COMPONENTAUTO
PORT(CLK:
INSTD_LOGIC;
AUTO:
INSTD_LOGIC;
INDEX2:
INSTD_LOGIC_VECTOR(7DOWNTO0);
INDEX0:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDCOMPONENT;
COMPONENTTONE
PORT(INDEX:
INSTD_LOGIC_VECTOR(7DOWNTO0);
CODE:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
HIGH:
OUTSTD_LOGIC;
TONE0:
OUTINTEGERRANGE0TO2047);
ENDCOMPONENT;
COMPONENTFENPIN
PORT(CLK1:
INSTD_LOGIC;
TONE1:
ININTEGERRANGE0TO2047;
SPKS:
OUTSTD_LOGIC);
ENDCOMPONET;
4系统仿真
乐曲自动演奏模块由VHDL语言实现后,其仿真图如图3.4所示。
图3.4乐曲自动演奏模块的仿真
音调发生模块由VHDL实现后,其仿真图如图3.6所示。
图3.6音调发生模块仿真图
数控分频模块由VHDL程序实现后,其仿真图如图3.8所示。
图3.8数控分频模块仿真图
最后进一步利用VHDL完成对整个系统的顶层设计,其仿真图如3.9所示:
图3.9简易电子琴整个系统的仿真图
5结束语
通过两个多周的紧张工作,终于完成了简易电子琴的设计,这个课程设计使我受益匪浅,他使我了解了硬件设计的整个流程,并且加深了我对计算机组成原理这门的课内容的理解,通过这个课程设计,不仅使我了解了组成原理的脊髓,而且使我对VHDL语言从陌生到初步理解,扩充的我的知识面。
这个课程设计也培养了我们的耐心和毅力,一个小小的错误就会导致结果的不正确,而对错误的检查要求我要有足够的耐心,由于这个课程设计也使我积累了一些经验,相信这些经验在我以后的学习工作中会有很大的作用。
此课程设计也使我了解了VHDL设计的方便灵活性,这是我们跨入计算机硬件行业很好的一次锻炼。
在课程设计的整个过程中,得到了肖晓丽老师的大力支持,在此感谢肖老师的精心指点。
致谢
此课程设计从构思到最后完成的这两个周内,周围的很多同学和朋友给予了我善意的帮助,还有肖晓丽老师对我的不厌其烦的指导,使我对此类课程设计的设计流程以及脊髓有了很深的了解,通过你们的帮助,我把从计算机组成原理这门课上学到的理论第一次用到了实际设计上。
在此,我深深的表示感谢,没有你们,我无法完成此课程设计。
参考文献
[1]曹昕燕,周凤臣.EDA技术实验与课程设计.北京:
清华大学出版社,2006
[2]张亦华,延明.数字电路EDA入门.北京:
北京邮电大学出版社,2003
[3]王爱英.计算机组成与结构.北京:
清华大学出版社,2007
[4]杨刚,龙海燕.现代电子技术——VHDL与数字系统设计.北京:
电子工业出版社,2004
附录
1.乐曲自动演奏模块的源程序如下所示:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYAUTOIS
PORT(CLK:
INSTD_LOGIC;--系统时钟控制信号
AUTO:
INSTD_LOGIC;
CLK2:
BUFFERSTD_LOGIC;
INDEX2:
INSTD_LOGIC)VECTOR(7DOWNTO0);
INDEX0:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDAUTO;
ARCHITECTUREBEHAVIORALOFAUTOIS
SIGNALCOUTTO:
INTEGERRANGE0TO31;
BEGIN
PULSEO:
PROCESS(CLK,AUTO)
VARIABLECOUNT:
INTEGERRANGE0T08;
BEGIN
IFAUTO='1'THEN
COUNT:
=0;CLK2<='0';
ESLE(CLK'EVENTANDCLD='1')THEN
COUTN:
=COUTN+1;
IFCOUTN=4THEN
CLK2<='1';
ELSIFCOUNT=8THEN
CLK2<='0';COUNT:
=0;
ENDIF;
ENDIF;
ENDPROCESS;
MUSIC:
PROCESS(CLK2)
BEGIN
IF(CLK2'EVENTANDCLK2='1')THEN
IF(COUNT0=31)THEN
COUNT<=0;
ELSE
COUNT<=COUNT0+1;
ENDIF;
ENDIF;
ENDPROCESS;
COM1:
PROCESS(COUNT,AUTO,INDEX2)
BEGIN
IFAUTO='0'THEN
CASECOUNTIS
WHEN0=>INDEX0<="00000100";--3
WHEN1=>INDEX0<="00000100";--3
WHEN2=>INDEX0<="00000100";--3
WHEN3=>INDEX0<="00000100";--3
WHEN4=>INDEX0<="00010000";--5
WHEN5=>INDEX0<="00010000";--5
WHEN6=>INDEX0<="00010000";--5
WHEN7=>INDEX0<="00100000";--6
WHEN8=>INDEX0<="00000100";--8
WHEN9=>INDEX0<="10000000";--8
WHEN10=>INDEX0<="10000000";--8
WHEN11=>INDEX0<="00000100";--3
WHEN12=>INDEX0<="00000010";--2
WHEN13=>INDEX0<="00000010";--2
WHEN14=>INDEX0<="00000001";--1
WHEN15=>INDEX0<="00000001";--1
WHEN16=>INDEX0<="00010000";--5
WHEN17=>INDEX0<="00010000";--5
WHEN18=>INDEX0<="00001000";--4
WHEN19=>INDEX0<="00001000";--4
WHEN20=>INDEX0<="00001000";--4
WHEN21=>INDEX0<="00000100";--3
WHEN22=>INDEX0<="00000010";--2
WHEN23=>INDEX0<="00000010";--2
WHEN24=>INDEX0<="00010000";--5
WHEN25=>INDEX0<="00010000";--5
WHEN26=>INDEX0<="00001000";--4
WHEN27=>INDEX0<="00001000";--4
WHEN28=>INDEX0<="00000100";--3
WHEN29=>INDEX0<="00000100";--3
WHEN30=>INDEX0<="00000010";--2
WHEN31=>INDEX0<="00000010";--2
ENDCASE;
ELSEINDEX0<=INDEX2;
ENDIF;
ENDPROCESS;
ENDBEHAVIORAL;
2.音调发生模块的源程序如下所示:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYTONEIS
PORT(INDEX:
INSTD_LOGIC_VECTOR(7DOWNTO0);
CODE:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
HIGH:
OUTSTD_LOGIC;
TONE0:
OUTINTEGERRANGE0TO2047);
ENDTONE;
ARCHITECTUREARTOFTONEIS
BEGIN
SEARCH:
PROCESS(INDEX)
BEGIN
CASEINDEXIS
WHEN"00000001"=>TONE0<=773;CODE<="1001111";HIGH<='1';
WHEN"00000010"=>TONE0<=912;CODE<="0010010";HIGH<='1';
WHEN"00000100"=>TONE0<=1036;CODE<="0000110";HIGH<='1';
WHEN"00001000"=>TONE0<=1116;CODE<="1001100";HIGH<='1';
WHEN"00010000"=>TONE0<=1197;CODE<="0100100";HIGH<='0';
WHEN"00100000"=>TONE0<=1290;CODE<="0100000";HIGH<