
摘要
设计了一种基于FPGA的电子琴,该电子琴由用VHDL硬件描述语言设计的核心部件和适当的外围电路构成,可从琴键上进行演奏也可自动进行乐曲演奏。
基于FPGA(现场可编程门阵列)芯片,利用VHDL语言,介绍了一种通用乐曲演奏电路的设计,可实现多个八度音阶的乐曲演奏,与简谱的对应关系简单,编程方便,占用资源少,通用性好,可作为IP core模块引用,构成复杂的SOPC系统.
关键词:电子琴;现场可编程门阵列(FPGA);智力产权核(IP core);超高速集成电路硬件描述语言(VHDL);乐曲
Abstract
An electronic piano is designed based on FPGA,which consists of core paris that designed by using VHDL hardware description languages,as well as some periphery circuits.The musical perform ance can be donenot only by keys but also with automatic type in the electronic piano.
Based on FPGA,by VHDL language,this paper introduces a universal music circuit design,it can play high,middle and low multiple tonality,simple corresponding relation with simple musical notation,which programs easily using little resource.It can be used universally for IP core in making complicated SOPC system.
Key words:electronic piano;Field Programmable Gate Array(FPGA);Intelligence Property core(IP core) ;Very-High-Speed Integrated Circuit Hardware Description Language(VHDL);music
1.简易电子琴与音乐发生器设计的介绍……………………………………………………4
1.1 简易电子琴设计介绍………………………………………………………………4
1.2 音乐发生器设计介绍………………………………………………………………4
2. FPGA功能与使用简介……………………………………………………………………6
2.1 FPGA简介……………………………………………………………………………6
2.1.1 FPGA的产生……………………………………………………………………6
2.1.2 FPGA的基本结构………………………………………………………………7
2.1.3 MAX+PLUSII……………………………………………………………………7
2.2 硬件描述语言VHDL…………………………………………………………………10
2.2.1 VHDL语言的优点………………………………………………………………10
2.2.2 利用VHDL语言设计数字系统的特点…………………………………………11
2.2.3 VHDL语言的基本结构…………………………………………………………13
2.2.4 VHDL的设计流程………………………………………………………………15
3. 简易电子琴设计及程序………………………………………………………………16
3.1 简易电子琴设计总体框图…………………………………………………………16
3.2 模块设计……………………………………………………………………………16
3.2.1 模块QIN设计…………………………………………………………………16
3.2.2 模块FANA设计…………………………………………………………………17
4. 音乐发生器设计及程序………………………………………………………………20
4.1 使用的乐谱…………………………………………………………………………20
4.2 音乐发生器设计及程序……………………………………………………………20
4.2.1 音乐发生器总框图……………………………………………………………20
4.2.2 可变分频器设计………………………………………………………………20
4.2.3 到计时模块设计………………………………………………………………31
5. 仿真………………………………………………………………………………………34
5.1 概述…………………………………………………………………………………34
5.2 仿真验证与实现……………………………………………………………………34
5.2.1 电子琴电路的仿真……………………………………………………………35
5.2.2 音乐发生器仿真………………………………………………………………35
6. 结论………………………………………………………………………………………37
7. 致谢………………………………………………………………………………………38
8.参考文献…………………………………………………………………………………39
1.简易电子琴与音乐发生器设计的介绍
1.1简易电子琴设计介绍
电子琴因其操作简单,且能模拟各种传统乐器的音色,而深受消费者喜爱。基于可编程逻辑器件FPGA(FieldProgrammable Logical Device)芯片,利用VHDL硬件描述语言设计系统核心部件,再配以适当的外围电路,可从琴键上进行演奏也可自动进行乐曲演奏,可模拟传统乐器笛、风琴、小号、单簧、双簧等音色。
1.2音乐发生器设计介绍
音乐发生器广泛用于自动答录装置、手机铃声、集团电话及智能仪器仪表设备.实现方法有以下几种:①购买专用音乐电路片,特点是价格便宜,多用于玩具.无法更改乐曲,也无法编程;② 录音重放电路,如ISD系列录放电路.可通过麦克风人工录音,分段放音,成本稍高;③利用微处理器来实现乐曲演奏,需要占用微处理器的资源较多(要占用D/A和定时器等),大多数情况无法采用这种方法;④ 以纯硬件完成乐曲演奏,随着FPGA集成度的提高,价格下降,EDA设计工具更新换代,功能日益强大,操作方便实用,以及IP core概念日益普及与流行,使这种方案的应用领域越来越多.它的突出优点是:第一,仅占用FPGA中很少的资源,因此成本低,甚至不增加成本.这是因为某个产品选定某型号FPGA芯片,只用了其中一部分资源,还有相当一部分资源闲置没用;第二,更改乐曲非常方便;第三,可作为IP core实现设计重用。
乐曲演奏电路的实现,其工作原理是这样的:我们知道,组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需的两个基本要素,问题是如何来获取这两个要素所对应的数值以及通过纯硬件的手段来利用这些数值实现所希望乐曲的演奏效果。
我们知道,组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需的2个基本要素,首先让我们来了解音符与频率的关系。乐曲的12平均率规定:每2个八度音(如简谱中的中音1与高音1)之间的频率相差1倍。在2个八度音之间,又可分为12个半音,每2个半音的频率比为。另外,音符A(简谱中的低音6)的频率为440 Hz,音符B到C之间、E到F之间为半音,其余为全音。由此可以计算出简谱中从低音1至高音1之间每个音符的频率,如表1所示。
表1-1 音高频率对照表
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
| 低音 | 131 | 147 | 165 | 175 | 196 | 221 | 248 |
| 中音 | 262 | 294 | 330 | 350 | 393 | 441 | 496 |
| 高音 | 525 | 5 | 661 | 700 | 786 | 882 | 990 |
2.FPGA功能与使用简介
2.1 FPGA简介
FPGA是英文Field Programmable Gate Array的缩写,即现场可编程门阵列,它是在PAL、GAL、EPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
2.1.1FPGA的产生
当今社会是数字社会,数字集成电路应用非常广泛,其发展从电子管、晶体管、小规模集成SSI、MSI、LSI、VLSI(几万门以上)到超大规模集成电路ULSI和超位集成电路GSI,其规模几乎平均每一到两年翻一番。集成电路的发展大大促进了EDA的发展,先进的EDA已从传统的“自下而上”的设计方法改变为“自上而下”的设计方法。ASIC(Application Specific Integrated Circuit)的设计与制造,已不再完全由半导体厂商承担,系统设计师在实验室里就可以设计出合适的ASIC芯片,并且立即投入实际应用中,这都得益于可编程逻辑器件PLD(Programmable Logic Device)的出现。现在应用最广泛的PLD主要是现场可编程门阵列FPGA(Field Programmable Gate Array)、复杂可编程逻辑器件CPLD(Complex Programmable Logic Device)、可擦除可编程逻辑器件EPLD(Erasable Programmable Logic Device)。
FPGA器件集成度高、体积小,具有通过用户编程实现专门应用的功能,特别适合于产品的样机开发和小批量生产。现场可编程门阵列FPGA是一种新型的高密度PLD,采用CMOS—SRAM工艺制作,与门阵列PLD不同,其内部由许多的可编程逻辑模块(CLB)组成,逻辑块之间可以灵活地相互连接。现场可编程门阵列FGPA的结构一般分为三部分:可编程逻辑块、可编程I/O模块和可编程内部连线。CLB的功能很强,不仅能够实现逻辑函数,还可以配置成RAM等复杂的形式,配置数据存放在片内的SRAM或者熔丝图上。基于SRAM的FPGA器件工作前需要从芯片外部加载配置数据,配置后的数据可以存储在片外的EPROM上或者计算机上。
现场可编程门阵列FPGA允许电路设计者利用基于计算机的开发平台,经过设计输入、仿真、测试和校验,直接达到预期的结果。使用FPGA器件可以大大缩短系统的研制周期,减少资金的投入。更吸引人的是,采用FPGA器件可以将原来的电路板级产品集成为芯片级产品,从而降低了功耗,提高了可靠性,同时还可以很方便地对设计进行在线修改。因此,FPGA的出现受到了电子设计师的普遍欢迎,发展十分迅速。
2.1.2 FPGA的基本结构
FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个新概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。FPGA的基本特点主要有:
1)采用FPGA设计ASIC电路,用户不需要投片生产,就能得到合用的芯片。
2)FPGA可做其它全定制或半定制ASIC电路的中试样片。
3)FPGA内部有丰富的触发器和I/O引脚。
4)FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。
5)FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。
可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。
FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。用户可以根据不同的配置模式,采用不同的编程方式。
加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。掉电后,FPGA恢复成白片,内部逻辑关系消失,因此,FPGA能够反复使用。FPGA的编程无须专用的FPGA编程器,只须用通用的EPROM、PROM编程器即可。当需要修改FPGA功能时,只需换一片EPROM即可。这样,同一片FPGA,不同的编程数据,可以产生不同的电路功能。因此,FPGA的使用非常灵活。
FPGA有多种配置模式:并行主模式为一片FPGA加一片EPROM的方式;主从模式可以支持一片PROM编程多片FPGA;串行模式可以采用串行PROM编程FPGA;外设模式可以将FPGA作为微处理器的外设,由微处理器对其编程。
2.1.3 MAX+PLUSII
MAX+PLUSII是Altera公司提供的FPGA/CPLD开发集成环境,界面友好、使用便捷,被誉为业界最易用易学的EDA软件。在MAX+PLUSII上可以完成设计输入元件适配、时序仿真和功能仿真、编程下载整个流程,支持原理图、VHDL和Verilog语言文本文件以及波形与EDIF等格式的文件作为设计输入。它提供了一种与结构无关的设计环境,使设计者能方便地进行设计输入、快速处理和器件编程。
MAX+PLUSII支持主流的第三方EDA工具,如Synopsys、Cadence、Synplicity、Mentor、 Viewlogic、Exemplar和Model Technology等。MAX+PLUSII支持APEX20K系列之外的所有Altera FPG/CPLD大规模逻辑器件。
一.MAX+PLUSII功能简介
1.原理图输入(Graphic editor)
MAX+PLUSII软件具有图形输入能力,用户可以方便地使用图形编辑器输入电路图,图中的元器件可以调用元件库中元器件,除调用库中的元件外,还可以调用该软件中的符号功能形成的功能块。
2.硬件描述语言输入(Text Editor)
MAX+PLUSII软件中有一个集成的文本编辑器,该编辑器支持VHDL,AHDL和Verilog硬件描述语言的输入,同时还有一个语言模块使输入程序语言更加方便,该软件可以对这些程序语言进行编译并形成可以下载配置数据。
3.波形编辑器(Waveform Editor)
在进行逻辑电路的行为仿真时,需要在所设计电路的输入端加入一定的波形,波形编辑器可以生成和编辑仿真用的波形(*.SCF文件),使用该编辑器的工具条可以容易方便地生成波形和编辑波形。
还可以使用输入的波形(*.WDF文件)经过编译生成逻辑模块,相当于已知一个芯片的输入输出波形,但不知是何种芯片,使用该软件功能可以解决这个问题,设计出一个输入和输出波形相同CPLD电路。
4.管脚(底层)编辑窗口(Floorplan Editor)
该窗口用于将已设计好逻辑电路的输入输出节点赋予实际芯片的引脚,通过鼠标的拖拉,方便地定义管脚。
5.自动错误定位
在编译源文件的过程中,若源文件有错误,MAX+PLUSII软件可以自动指出错误类型和错误所在的位置。
6.逻辑综合与适配
该微软件在编译过程中,通过逻辑综合(Logic Synthesizer)和适配(Fitter)模块,可以把最简单的逻辑表达式自动的吻合在合适的器件中。
7.设计规则检查
选取Compile\\Processing\\Design Doctor菜单,将调出规则检查医生,该医生可以按照3种规则检查各个设计文件,以保证设计的可靠性。一旦选择该菜单,在编译窗口将显示出医生,用鼠标点击医生,该医生可以告诉你程序文件的健康情况。
8.多器件划分(Partitioner)
如果设计不能完全装入一个器件,编译器中的多器件划分Partitioner模块,可自动的将一个设计分成几个部分并分别装入几个器件中,并保证器件之间的连线最少。
9.编程文件的产生
编译器中的装配程序(Assembler)将编译好的程序创建一个或多个编程目标文件:EPROM配置文件(*.POF)、SRAM文件(*.SCF)、JEDEC文件(*.JED)、十六进制文件(*.HEX)、文本文件(*.TTF)和串行BIT流文件(*.SBF)等。
10.仿真
当设计文件被编译好,并在波形编辑器中将输入波形编辑完毕后,就可以进行行为仿真了,通过仿真可以检验设计的逻辑关系是否正确。
11.分析时间(Analyzer Timing)
该功能可以分析各个信号到输出端的时间延迟,可以给出延迟矩阵和最高工作频率。
12.器件编程
当设计全部完成后,就可以 将形成的目标文件下载到芯片中,实际验证设计的准确性。
二.MAX+PLUSII设计流程
MAX+PLUSII软件设计流程如图2-1所示,由以下几部分组成。
图2-1 MAX+PLUSII软件设计流程图
(1)设计输入:可以采用原理图输入、HDL语言描述、EDIF网表输入及波形输入等几种方式。
(2)编译:先根据设计要求设定编译参数和编译策略,如器件的选择、逻辑综合方式的选择等。然后根据设定的参数和策略对设计项目进行网表提取、逻辑综合和器件适配,并产生报告文件、延时信息文件及编程文件,供分析仿真和编程使用。
(3)仿真:仿真包括功能仿真、时序仿真和定时分析,可以利用软件的仿真功能来验证设计项目的逻辑功能是否正确。
(4)编程与验证:用经过仿真确认后的编程文件通过编程器(Programmer)将设计下载到实际芯片中,最后测试芯片在系统中的实际运行性能。
在设计过程中,如果出现错误,则需重新回到设计输入阶段,改正错误或调整电路后重复上述过程。
2.2 硬件描述语言VHDL
VHDL的英文全名是Very-High-Speed Integrated Circuit HardwareDescription Language,诞生于1982年。1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言 。自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本,(简称93版)。现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。有专家认为,在新的世纪中,VHDL于Verilog语言将承担起大部分的数字系统设计任务。
2.2.1 VHDL语言的优点
传统的硬件电路设计方法是采用自下而上的设计方法,即根据系统对硬件的要求,详细编制技术规格书,并画出系统控制流图;然后根据技术规格书和系统控制流图,对系统的功能进行细化,合理地划分功能模块,并画出系统的功能框图;接着就进行各功能模块的细化和电路设计;各功能模块电路设计、调试完成后,将各功能模块的硬件电路连接起来再进行系统的调试,最后完成整个系统的硬件设计。采用传统方法设计数字系统,特别是当电路系统非常庞大时,设计者必须具备较好的设计经验,而且繁杂多样的原理图的阅读和修改也给设计者带来诸多的不便。为了提高开发的效率,增加已有开发成果的可继承性以及缩短开发周期,各ASIC研制和生产厂家相继开发了具有自己特色的电路硬件描述语言(Hardware Description Language,简称HDL)。但这些硬件描述语言差异很大,各自只能在自己的特定设计环境中使用,这给设计者之间的相互交流带来了极大的困难。因此,开发一种强大的、标准化的硬件描述语言作为可相互交流的设计环境已势在必行。于是,美国于1981年提出了一种新的、标准化的HDL,称之为VHSIC(Very High Speed Integrated Circuit) Hardware Description Language,简称VHDL。这是一种用形式化方法来描述数字电路和设计数字逻辑系统的语言。设计者可以利用这种语言来描述自己的设计思想,然后利用电子设计自动化工具进行仿真,再自动综合到门级电路,最后用PLD实现其功能。
综合起来讲,VHDL语言具有如下优点:
1.覆盖面广,描述能力强,是一个多层次的硬件描述语言。在VHDL语言中,设计的原始描述可以非常简练,经过层层加强后,最终可成为直接付诸生产的电路或版图参数描述。
2.具有良好的可读性,即容易被计算机接受,也容易被读者理解。
3.使用期长,不会因工艺变化而使描述过时。因为VHDL的硬件描述与工艺无关,当工艺改变时,只需修改相应程序中的属性参数即可。
4.支持大规模设计的分解和已有设计的再利用。一个大规模的设计不可能由一个人完成,必须由多人共同承担,VHDL为设计的分解和设计的再利用提供了有力的支持。
2.2.2 利用VHDL语言设计数字系统的特点
当电路系统采用VHDL语言设计其硬件时,与传统的电路设计方法相比较,具有如下的特点:
一.采用自上而下的设计方法。
即从系统总体要求出发,自上而下地逐步将设计的内容细化,最后完成系统硬件的整体设计。在设计的过程中,对系统自上而下分成三个层次进行设计:
第一层次是行为描述。所谓行为描述,实质上就是对整个系统的数学模型的描述。一般来说,对系统进行行为描述的目的是试图在系统设计的初始阶段,通过对系统行为描述的仿真来发现设计中存在的问题。在行为描述阶段,并不真正考虑其实际的操作和算法用何种方法来实现,而是考虑系统的结构及其工作的过程是否能到达系统设计的要求。
第二层次是RTL方式描述。这一层次称为寄存器传输描述(又称数据流描述)。如前所述,用行为方式描述的系统结构的程序,其抽象程度高,是很难直接映射到具体逻辑元件结构的。要想得到硬件的具体实现,必须将行为方式描述的VHDL语言程序改写为RTL方式描述的VHDL语言程序。也就是说,系统采用RTL方式描述,才能导出系统的逻辑表达式,才能进行逻辑综合。
第三层次是逻辑综合。即利用逻辑综合工具,将RTL方式描述的程序转换成用基本逻辑元件表示的文件(门级网络表)。此时,如果需要,可将逻辑综合的结果以逻辑原理图的方式输出。此后可对综合的结果在门电路级上进行仿真,并检查其时序关系。
应用逻辑综合工具产生的门级网络表,将其转换成PLD的编程码点,即可利用PLD实现硬件电路的设计。
由自上而下的设计过程可知,从总体行为设计开始到最终的逻辑综合,每一步都要进行仿真检查,这样有利于尽早发现设计中存在的问题,从而可以大大缩短系统的设计周期。
二.系统可大量采用PLD芯片。
由于目前众多制造PLD芯片的厂家,其工具软件均支持VHDL语言的编程。所以利用VHDL语言设计数字系统时,可以根据硬件电路的设计需要,自行利用PLD设计自用的ASIC芯片,而无须受通用元器件的。
三.采用系统早期仿真。
从自上而下的设计过程中可以看到,在系统设计过程中要进行三级仿真,即行为层次仿真、RTL层次仿真和门级层次仿真。这三级仿真贯穿系统设计的全过程,从而可以在系统设计的早期发现设计中存在的问题,大大缩短系统设计的周期,节约大量的人力和物力。
四.降低了硬件电路设计难度。
在传统的设计方法中,往往要求设计者在设计电路之前写出该电路的逻辑表达式或真值表(或时序电路的状态表)。这一工作是相当困难和繁杂的,特别是当系统比较复杂时更是如此。而利用VHDL语言设计硬件电路时,就可以使设计者免除编写逻辑表达式或真值表之苦,从而大大降低了设计的难度,也缩短了设计的周期。
五.主要设计文件是用VHDL语言编写的源程序。
与传统的电路原理图相比,使用VHDL源程序有许多好处:其一是资料量小,便于保存。其二是可继承性好。当设计其他硬件电路时,可使用文件中的某些库、进程和过程等描述某些局部硬件电路的程序。其三是阅读方便。阅读程序比阅读电路原理图要更容易一些,阅读者很容易在程序中看出某一电路的工做原理和逻辑关系。而要从电路原理图中推知其工作原理则需要较多的硬件知识和经验。
2.2.3 VHDL语言的基本结构
一个完整的VHDL语言程序通常包含实体(Entity)、构造体(Architecture)、配置(Configuration)、程序包(Package)和库(Library)5个部分。前4个部分是可分别编译的源设计单元。实体用于描述所设计的系统的外接口信号;构造体用于描述系统内部的结构和行为;程序包存放各种设计模块都能共享的数据类型、常数和子程序等;配置用于从库中选取所需单元来组成系统设计的不同版本;库存放已经编译的实体、构造体、程序包和配置。库可由用户生成或由ASIC芯片制造商提供,以便于在设计中为大家所共享。
一.实体(ENTITY)
在VHDL中,实体类似于原理图中的一个部件符号,它可以代表整个系统、1块电路板、一个芯片或一个门电路,是一个初级设计单元。在实体中,我们可以定义设计单元的输入输出引脚和器件的参数,其具体的格式如下:
ENTITY 实体名 IS
[ 类属参数说明;]
[ 端口说明;]
END 实体名;
1)类属参数说明
类属参数说明为设计实体和其外部环境的静态信息提供通道,特别是用来规定端口的大小、实体中子元件的数目、实体的定时特性等等。
2)端口说明
端口说明为设计实体和其外部环境的动态通信提供通道,是对基本设计实体与外部接口的描述,即对外部引脚信号的名称、数据类型、和输入输出方向的描述。其一般格式如下:
PORT(端口名 :方向 数据类型;
∶
∶
端口名 :方向 数据类型);
端口名是赋予每个外部引脚的名称;端口方向用来定义外部引脚的信号方向是输入 还是输出;数据类型说明流过该端口的数据类型。
IEEE1076标准包中定义了以下常用的端口模式:
IN 输入,只可以读
OUT 输出,只可以写
BUFFER 输出(构造体内部可再使用)
INOUT 双向,可以读或写
3) 数据类型
VHDL语言中的数据类型有多种,但在数字电路的设计中经常用到的只有两种,即BIT和BIT_VECTOR(分别等同于STD_LOGIC和STD_LOGIC_VECTOR)。当端口被说明为BIT时,该端口的信号取值只能是二进制数“1”和“0”,即位逻辑数据类型;而当端口被说明为BIT_VECTOR时,该端口的信号是一组二进制的位值,即多位二进制数。
二.结构体(ARCHITECTURE)
结构体描述一个设计的结构或行为,把一个设计的输入和输出之间的关系建立起来。一个设计实体可以有多个结构体,每个结构体对应着实体不同的实现方案,各个结构的地位是同等的。
结构体对其基本设计单元的输入输出关系可以用三种方式进行描述,即行为描述、寄存器传输描述和结构描述。不同的描述方式,只是体现在描述语句的不同上,而结构体的结构是完全一样的。
结构体分为两部分:结构说明部分和结构语句部分,其具体的描述格式为:
ARCHITECTURE 结构体名 OF 实体名 IS
--说明语句
BEGIN
--并行语句
END 结构体名;
1)说明语句
说明语句用于对结构体内部使用的信号、常数、数据类型和函数进行定义。例如:
ARCHITECTURE behave OF mux IS
SIGNAL nel :STD_LOGIC;
∶
BEGIN
∶
END behave;
信号定义和端口说明一样,应有信号名和数据类型的说明。因它是内部连接用的信号,故不需有方向的说明。
2.2.4 VHDL的设计流程
1.设计规范的定义
这个有点像系统的设计的总体规划,就是要明确这个系统有哪些设计要求,和你要想到达的目标。
2.采用VHDL进行设计描述
这部分包括设计规划和程序的编写。设计规划主要包括设计方式的选择及是否进行模块划分。设计方式一般包括直接设计,自顶向下和自底向下设计,这个和其他软件语言差不多。最重要还是模块划分,这个和设计者的设计水平有很大关系。
完成规划设计后,就可以编写个模块的VHDL程序了,最后将各模块的VHDL程序综合起来就完成了整个设计的VHDL描述。
3.VHDL程序仿真
这个过程和其他软件语言没什么区别。
4.综合、优化和布局布线
综合指的是将设计描述转化成底层电路的表示形式,其结果是一个网表或者是一组逻辑方程;优化,这个主要是为了提高程序的执行效率及减少资源的利用;布局布线,指的是将逻辑关系转化成电路连接的方式。
5.后仿真。
这个与VHDL程序仿真不同,这个不仅是对逻辑方面的验证,还要进行时序功能验证。
6.器件编程
3.简易电子琴设计及程序
3.1简易电子琴设计总体框图
图3-1 简易电子琴设计总体框图
3.2模块设计
3.2.1模块QIN设计
模块QIN见图3-2。该模块的功能是根据按下的按键不同,送出不同的初值给FANA模块。
图3-2 模块QIN
相应的程序如下:
library ieee;
use ieee.std_logic_11.all;
entity qin is
port(k:in std_logic_vector(18 downto 3);
q:out integer range 0 to 9050);
end qin;
architecture qin_arc of qin is
begin
process(k)
begin
case k is
when“1111111111111110”=>q<=9050;
when“1111111111111101”=>q<=8065;
when“1111111111111011”=>q<=7634;
when“1111111111110111”=>q<=6803;
when“1111111111101111”=>q<=6061;
when“1111111111011111”=>q<=5714;
when“1111111110111111”=>q<=50;
when“1111111101111111”=>q<=4535;
when“1111111011111111”=>q<=4032;
when“1111110111111111”=>q<=3809;
when“1111101111111111”=>q<=3396;
when“1111011111111111”=>q<=3026;
when“1110111111111111”=>q<=2857;
when“1101111111111111”=>q<=2545;
when“1011111111111111”=>q<=2268;
when“0111111111111111”=>q<=2020;
when“1111111111111111”=>q<=0;
when others=>null;
end case;
end process;
end qin_arc;
3.2.2模块FANA设计
模块FANA见图3-3。它是倒计时模块。
图3-3 模块FANA
相应的程序如下:
library ieee;
use ieee.std_logic_11.all;
entity fana is
port(a:in integer range 0 to 10204;
clk:in std_logic;
q:out std_logic);
end fana;
architecture fana_arc of fana is
begin
process(clk)
variable b,d:std_logic;
variable c:integer range 0 to 10204;
begin
if clk’event and clk=’1’then
if b=’0’then
c:=a;
b:=’1’;
else
if c=0 then
b:=’0’;
d:=not d;
else
c:=c-1;
end if;
end if;
end if;
q<=d;
end process;
end fana_arc;
4. 音乐发生器设计及程序
4.1 使用的乐谱
友谊天长地久
图4-1 《友谊天长地久》乐谱
4.2 音乐发生器设计及程序
4.2.1 音乐发生器总框图
图4-2 音乐发生器总框图
4.2.2 模块PAIA设计
图4-3 模块PAIA
模块见图4-3,该模块控制每一个音的长短,送初值给FANA模块,从而控制音高。
相应的程序如下:
library ieee;
use ieee.std_logic_11.all;
entity paia is
port(clk:in std_logic;
q:out integer range 0 to 10204);
end paia;
architecture pai_arc of paia is
begin
process(clk)
variable cnt1:integer range 0 to 10;
variable cnt2:integer range 0 to 8;
variable n:integer range 0 to 45;
begin
if clk’event and clk=’1’then
if cnt1<10 then -此数值控制每一个音的长短
cnt1:=cnt1+1;
else
cnt1:=0;
case n is
when 0=>q<=10204; -此数值为低音5的计数初值,送给FANA模块
if cnt2<1 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=1;
end if;
when 1=>q<=7634;
if cnt2<6 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=2;
end if;
when 2=>q<=6061;
if cnt2<1 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=3;
end if;
when 3=>q<=6803;
if cnt2<3 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=4;
end if;
when 4=>q<=7634;
n:=5;
when 5=>q<=6803;
if cnt2<1 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=6;
end if;
when 6=>q<=6061;
if cnt2<1 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=7;
end if;
when 7=>q<=7634;
if cnt2<4 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=8;
end if;
when 8=>q<=6061;
if cnt2<1 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=9;
end if;
when 9=>q<=50;
if cnt2<1 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=10;
end if;
when 10=>q<=4535;
if cnt2<9 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=11;
end if;
when 11=>q<=50;
if cnt2<3 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=12;
end if;
when 12=>q<=6061;
if cnt2<2 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=13;
end if;
when 13=>q<=7634;
if cnt2<1 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=14;
end if;
when 14=>q<=6803;
if cnt2<3 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=15;
end if;
when 15=>q<=7634;
n:=16;
when 16=>q<=6803;
if cnt2<1 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=17;
end if;
when 17=>q<=6061;
if cnt2<1 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=18;
end if;
when 18=>q<=7634;
if cnt2<3 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=19;
end if;
when 19=>q<=9095;
if cnt2<2 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=20;
end if;
when 20=>q<=10204;
if cnt2<1 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=21;
end if;
when 21=>q<=7634;
if cnt2<7 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=22;
end if;
when 22=>q<=4535;
if cnt2<1 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=23;
end if;
when 23=>q<=50;
if cnt2<3 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=24;
end if;
when 24=>q<=6061;
if cnt2<2 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=25;
end if;
when 25=>q<=7634;
if cnt2<1 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=26;
end if;
when 26=>q<=6803;
if cnt2<3 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=27;
end if;
when 27=>q<=7634;
n:=28;
when 28=>q<=6803;
if cnt2<1 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=29;
end if;
when 29=>q<=4535;
if cnt2<1 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=30;
end if;
when 30=>q<=50;
if cnt2<3 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=31;
end if;
when 31=>q<=6061;
if cnt2<2 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=32;
end if;
when 32=>q<=50;
if cnt2<1 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=33;
end if;
when 33=>q<=4535;
if cnt2<7 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=34;
end if;
when 34=>q<=3809;
if cnt2<1 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=35;
end if;
when 35=>q<=50;
if cnt2<3 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=36;
end if;
when 36=>q<=6061;
if cnt2<2 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=37;
end if;
when 37=>q<=7634;
if cnt2<1 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=38;
end if;
when 38=>q<=6803;
if cnt2<3 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=39;
end if;
when 39=>q<=7634;
n:=40;
when 40=>q<=6803;
if cnt2<1 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=41;
end if;
when 41=>q<=6061;
if cnt2<1 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=42;
end if;
when 42=>q<=7634;
if cnt2<3 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=43;
end if;
when 43=>q<=9050;
if cnt2<2 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=44;
end if;
when 44=>q<=10204;
if cnt2<1 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=45;
end if;
when 45=>q<=7634;
if cnt2<7 then
cnt2:=cnt2+1;
else
cnt2:=0;
n:=0;
end if;
end case;
end if;
end if;
end process;
end pai_arc;
4.2.3 模块FANA设计
图4-4 模块FANA
模块FANA见图4-4。该模块的功能是根据PAIA送来的初值到计时,每次计到0时就使信号Q反转,由于初值不同,从而产生不同的音高。
相应的程序如下:
library ieee;
use ieee.std_logic_11.all;
entity fana is
port(a:in integer range 0 to 10204;
clk:in std_logic;
q:out std_logic);
end fana;
architecture fan_arc of fana is
begin
process(clk)
variable b,d:std_logic;
variable c:integer range 0 to 10204;
begin
if clk’event and clk=’1’ then
if b=’0’ then
c:=a;
b:=’1’;
else
if c=0 then
b:=’0’;
d:=not d;
else
c:=c-1;
end if;
end if;
end if;
q<=d;
end process;
end fan_arc;
5.仿真
5.1 概述
仿真,也称模拟(simulation),是对电路设计的一种间接的检测方法。对电路设计的逻辑行为和运行功能进行模拟测试,可以获得许多对原设计进行排错、改进的信息。对于利用VHDL设计的大型系统,能进行可靠、快速、全面的仿真测试尤为重要。
对于纯硬件的电路系统,如纯模拟或数字电路系统,就无所谓仿真了,设计者对于它们只能作直接的硬件测试系统。如果发现有问题,特别是当问题比较大或根本无法运行时,就只能全部推翻,从头开始设计。对于具有微处理器的系统,如单片机系统,可以在一定程度上进行仿真测试,如果希望得到可靠的仿真结果,通常必须利用单片机仿真器进行硬件仿真,以便了解软件程序对外围接口的操作情况。这类仿真耗时长,成本高,而且获得的仿真信息不全面。因为单片机仿真主要是对软件程序的检测和排错,对于硬件系统中的问题则难以有所作为,并且这种方法只适用于小系统的设计调试。
利用VHDL完成的系统设计的电路规模往往达到数万、数十万,乃至上百万个等效逻辑门构成的规模。显然,必须利用先进的仿真工具才能快速、有效地完成所必需的测试工作。
如前所述,基于EDA工具和FPGA的关于VHDL设计的仿真形式有多种形式,如VHDL行为仿真,或称VHDL仿真,是进行系统级仿真的有效武器,它既可以在早期对系统的设计可行性进行评估和测试,也可以在短时间内以极低的代价对多种方案进行测试比较、系统模拟和方案论证,以获得最佳系统设计方案;而时序仿真则可获得与实际目标器件电器性能最为接近的设计模拟结果。
但由于针对具体器件的逻辑分割和布局布线的适配过程耗时过大,不适合大系统进行仿真;此外,硬件仿真在VHDL设计中也有其重要地位,因为,毕竟最后的设计必须落实在硬件电路上。硬件仿真的工具除必须依赖EDA软件外,还有赖于良好的开发模型系统和规模比较大的SRAM型FPGA器件。
一项较大规模的VHDL系统设计的最后完成必须经历多层次的仿真测试,其中将包括针对系统的VHDL行为仿真、分模块的时序仿真和硬件仿真,直至最后系统级的硬件仿真。
5.2 仿真验证与实现
从广义上讲,设计验证包括功能与时序仿真和电路验证。仿真是指使用设计软件包对已实现的设计进行完整测试,模拟实际物理环境下的工作情况。前仿真是指仅对逻辑功能进行测试模拟,以了解其实现的功能是否满足原设计的要求,仿真过程没有加入时序信息,不涉及具体器件的硬件特性,如延时特性;而在布局布线后,提取有关的器件延迟、连线延时等时序参数,并在此基础上进行的仿真称为后仿真,它是接近真实器件运行的仿真。
5.2.1电子琴电路的仿真
1.QIN模块仿真
图5-1 电子琴模块仿真图
2.电子琴FANA模块仿真
图5-2 电子琴FANA模块仿真图
5.2.2 音乐发生器仿真
1.PAIA模块仿真
图5-3 PAIA模块仿真图
2.FANA模块仿真
图5-4 音乐发生器FANA模块仿真图
6.结论
本设计在MAX+PLUSII软件上进行了仿真,从实际测试结果看,实现了程序设计的目标,达到了预期效果。该设计将的核心部分集成在可编程逻辑器件FPGA芯片上,大大简化了外部电路,较以前的传统设计,既减少了所用芯片的种类和数量,缩小了体积,降低了功耗,提高了系统的整体性能,对系统在使用中的故障率大为减少。此外,这种基于可编程逻辑器件以VHDL 硬件描述语言进行设计,在电子设计的各个阶段、各个层次进行计算机模拟验证,保证设计过程的正确性,可降低设计成本,缩短设计周期,具有广阔的应用前景。
7.参考文献
[1]. 黄仁欣 EDA技术实用教程 2006 第一版 清华大学出版社
[2]. 潘松、王国栋编著 ,李广军审校 VHDL实用教程 2000 第一版 电子科技大学出版社
[3].王振红 VHDL数字电路设计与应用实践教程 2003 第一版 机械工业出版社
[4].王松武、于鑫、武思军 电子创新设计与实践 2005 第一版国防工业出版社
[5].赵鑫、蒋亮、齐兆群、李晓凯 VHDL与数字电路设计 2005 机械工业出版社
[6].谭会生、瞿遂春 EDA技术综合应用实例与分析 2004 第一版 西安电子科技大学出版社
[7].杨恒,、卢飞成 FPGA/VHDL快速工程实践入门与提高 2003 第一版 北京航空航天大学出版社
[8].胡振华 VHDL与FPGA设计 2003 第一版 中国铁道出版社
[9].王金明、徐志军 VHDL 程序设计教程 2003 第一版 人民邮电出版社
[10].潘松、黄继业 EDA技术实用教程 2005 第十二版 科学出版社
[11].刘常澍、赵雅兴 数字电路与FPG2004 第一版 人民邮电出版社
[12].Digital system design with VHDL Harlow、 England、 Prentice Hall、 2000、2002 Mark Zwolinski
[13].王金明编著、徐志军主审 VHDL程序设计教程 2004 第一版 人民邮电出版社
[14].胡振华 VHDL与FPGA设计 2003 第一版 中国铁道出版社
[15].黄任 VHDL入门.解惑.经典实例.经验总结2005第一版 北京航空航天大学出版社
