




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目 录摘 要IAbstractII1. 前言11.1研究背景11.2关于EDA技术11.3关于VHDL21.4 EDA工具41.5可编程逻辑控件FPGA41.6有关于本次设计52. 设计实现62.1系统原理62.1.1音符频率的获得62.1.2音调的控制72.1.3 音长的控制72.1.4乐曲节奏的控制82.1.5乐谱发生器82.1.6乐曲演奏电路原理82.2音乐硬件演奏电路的设计实现82.2.1各个模块的功能简介92.2.2 music模块92.3地址发生器模块122.3.1地址发生器的VHDL设计122.3.2波形仿真132.4分频预置数模块132.4.1分频预置数模块的VHDL设计132.4.2 波形仿真142.5十六进制模块152.5.1十六进制模块的VHDL设计152.5.2 波形仿真162.6 数控分频模块162.6.1 数控分频模块的VHDL设计162.6.2 波形仿真182.7分频模块182.8顶层文件20结束语23致谢24参考文献25 摘 要为了实现乐曲的自动演奏,本次设计采用Altera 公司的FPGA硬件电路,并且在QuartusII 9.0上,以硬件描述语言的系统层次的设计方法,设计数控分频器电路,利用数控分频原理设计音乐硬件演奏电路,并制定LPM-ROM存储音乐数据,完成乐曲自动演奏电路的设计, 并进行仿真。关键词:FPGA;VHDL;Quartus II;乐曲自动播放器IAbstract In order to achieve the automatic music playing , this design uses Altera FPGA hardware circuit on the QuartusII 9.0. With the hardware description language design method of the system level, it designs the digital frequency divider circuit. With the numerical control dividing principle, it designs the music hardware circuit , and to develop LPM-ROM storage music data to complete the automatic playing music circuit design and simulation. Key words: FPGA; VHDL; Quartus ; automatic music playerII 1. 前言1.1研究背景 随着电子技术的飞速发展,微电子技术的进步主要表现在大规模集成电路加工技术即半导体工艺技术的发展上,使得本征半导体的工艺水平的线宽已经达到了60nm,并在不断地缩小,面在硅片单位面积上,集成了更多的晶体管。集成电路设计正在不断地向超大规模,极低功耗和超高速的方向发展,电子产品的功能越来越强大,体积越来越小,功耗越来越低。顺应电子技术的发展趋势,可编程逻辑器件和EDA 技术使设计方法发生了质的变化。把以前“电路设计+硬件搭试+调试焊接”转化为“功能设计+软件模拟+仿真下载”。利用EDA 开发平台,采用可编程逻辑器件CPLDFPGA 使硬件的功能可通过编程来实现,这种新的基于芯片的设计方法能够使设计者有更多机会充分发挥创造性思维,实现多种复杂数字逻辑系统的功能,将原来由电路板设计完成的工作放到芯片的设计中进行,减少了连线和体积,提高了集成度,降低了干扰,大大减轻了电路设计和PCB设计的工作量和难度,增强了设计的灵活性,有效地提高了工作效率,增加了系统的可靠性和稳定性,提高了技术指标。这些技术使得各种电子产品迅速的进入了我们的生活,我们处在一个被电子产品深度包围的时代,在一个普通老百姓的家里,衣食住行,每一个产品的诞生都离不开EDA技术,从彩色电视机,到智能冰箱,到全自动洗衣机,电饭煲,到微波炉,电磁炉,电子琴,再到个人随身用的手机,MP3音乐播放器都需要EDA技术提供支持。1.2关于EDA技术随着科学技术的进步,电子器件和电子系统设计方法日新月异,电子设计自动化(Electronics Design Automation,EDA)技术正是适应了现代电子产品设计的要求,吸收了多学科最新成果而形成的一门新技术。现如今掌握EDA技术是电子信息类专业的学生、工程技术人员所必备的基本能力和技能。传统电子电路的设计,首先要对系统进行分析,然后按功能对系统进行划分,接下来就要选择特定芯片,焊接成PCB电路板,最后对成品PCB电路板进行调试。这样的设计没有灵活性可言,搭成的系统需要的芯片种类多且数目大,而且对于电路图的设计和电路板的设计都需要很大的工作量,工作难度也很高。然而,随着可编程器件和EDA技术的发展,传统设计的劣势被克服,采用可编程逻辑器件基于芯片的设计方法,期间的内部逻辑和引脚可以由设计者自行决定,大大提高了设计的灵活性,提高了工作效率;同时,将系统集成在一个芯片上的设计,使系统具有体积小、功耗低、可靠性高等特点。EDA技术的发展大致经历了三个阶段:20世纪70年代的CAD(计算机辅助设计)阶段、20世纪80年代的CAE(计算机辅助工程)阶段、20世纪90年代后的EDA(电子设计自动化)阶段。以下主要介绍第三个阶段。EDA技术即电子设计自动化技术,它是以可编程逻辑器件(PLD)为载体,以硬件描述语言(HDL)为主要的描述方式,以EDA软件为主要的开发软件的电子设计过程。它主要采用“自顶向下”的设计方法,设计流程主要包括:设计输入、综合、仿真、适配、下载。EDA技术主要有以下特征:(1)高层综合的理论和方法取得进展,从而将EDA设计层次由RT级提高到了系统级,并推出了相应的系统级综合优化工具,大大缩短了复杂ASIC的设计周期。(2)采用硬件描述语言来描述10万门以上的设计,并形成了VHDL和Verilog-HDL两种标准硬件描述语言。(3)采用平面规划技术对逻辑综合和物理版图设计联合管理,做到在逻辑设计综合早期阶段就考虑到物理设计信息的影响。(4)可测性综合设计。(5)为带有嵌入式IP核的ASIC设计提供软、硬件协同设计工具。(6)建立并行设计工具框架结构的集成化设计环境,以适应当今ASIC规模大而复杂、数字与模拟电路并存、硬件与软件设计并存、产品上市速度快等特点。 总而言之,EDA技术的出现,给电子信息产业带来了革命性的变革。161.3关于VHDLVHDL是非常高速集成电路硬件描述语言,是可以描述硬件电路的功能、信号连接关系及定时关系的语言它能比电路原理图更有效地表示硬件电路的特性。使用VHDL语言,可以就系统的总体要求出发,自上至下地将设计内容细化,最后完成系统硬件的整体设计。VHDL语言的主要特点是:功能强大,灵活性高:VHDL语言是一种功能强大的语言结构,可用简洁明确的代码来进行复杂控制逻辑的设计。同时VHDL语言还支持层次化的设计,支持设计库和可重复使用的元件生成。目前,VHDL语言已成为一种设计、仿真、综合的标准硬件描述语言。器件无关性:VHDL语言允许设计者在生成一个设计时不需要首先选择一个具体的器件。对于同一个设计描述,可以采用多种不同器件结构来实现其功能。因此设计描述阶段,可以集中精力从事设计构思。当设计、仿真通过后,指定具体的器件综合、适配即可。可移植性:VHDL语言是一种标准的语言,故采用VHDL进行的设计可以被不同的EDA工具所支持。从一个仿真工具移植到另一个仿真工具,从一个综合工具移植到另一个综合工具,从一个工作平台移植到另一个工作平台。在一个EDA工具中采用的技术技巧,在其它工具中同样可以采用。自顶向下的设计方法:传统的设计方法是,自底向上的设计或平坦式设计。自底向上的设计方法是先从底层模块设计开始,逐渐由各个模块形成功能复杂的电路。这种设计方法优点是很明显的,因为它是一种层次设计电路,一般电路的子模块都是按照结构或功能划分,因此这种电路层次清楚,结构明确,便于多人合作开发,同时设计文件易于存档,易于交流。自底向上设计方法的缺点也很明显,往往由于整体设计思路不对而使的花费几个月的低层设计付之东流。平坦式设计是整个电路只含有一个模块,电路的设计是平铺直叙的,没有结构和功能上的划分,因此不是层次电路的设计方式。优点是小型电路设计时可以节省时间和精力,但随着电路复杂程度的增加,这种设计方式的缺点变的异常突出。自顶向下的设计方法是将要设计的电路进行最顶层的描述(顶层建模),然后利用EDA软件进行顶层仿真,如果顶层设计的仿真结果满足要求,则可以继续将顶层划分的模块进行低一级的划分并仿真,这样一级一级设计最终将完成整个电路的设计。自顶向下的设计方法与前面两种方法相比优点是很明显的。数据类型丰富:作为硬件描述语言的一种VHDL语言的数据类型非常丰富,除了VHDL语言自身预定义的十种数据类型外,在VHDL语言程序设计中还可以由用户自定义数据类型。特别是std_logic数据类型的使用,使得VHDL语言能最真实模拟电路中的复杂信号。运行库和程序包丰富:目前支持VHDL语言的程序包很丰富,大多以库的形式存放在特定的目录下,用户可随时调用。如IEEE库收集了std_logic_1164、std_logic_arith、std_logic_unsigned等程序包。在FPGA综合时,还可以使用EDA软件商提供的各种库和程序包。而且用户利用VHDL语言编写的各种成果都可以以库的形式存放,在后续的设计中可以继续使用。建模方便:由于VHDL语言中可综合的语句和用于仿真的语句齐备,行为描述能力强,因此VHDL语言特别适合信号建模。VHDL语言无论仿真还是综合都是非常合适的描述语言。 VHDL语言是一种硬件电路的建模描述语言,因此与普通的计算机语言有较大差别,普通计算机语言是CPU按照时钟的节拍,一条指令执行完后才能执行下一条指令,因此指令执行是有先后顺序的,也即是顺序执行,而每条指令的执行占用特定的时间。而与VHDL语言描述结果相对应的是硬件电路,它遵循硬件电路的特点,语句的执行没有先后顺序,是并发的执行的;而且语句的执行不象普通软件那样每条指令占用一定的时间,只是遵循硬件电路自身的延迟时间。71.4 EDA工具 目前有多种EDA工具支持采用VHDL进行电路综合、仿真以及实现。比较常见的是Altera公司的Quartus开发平台和Xilinx公司的ISE开发平台。这些平台中使用的综合工具和仿真工具通常由专业的EDA厂商提供。本次设计中所使用的平台正是Quartus9.0,它是Altera公司提供的一套集成了编译、布局布线和仿真工具在内的综合开发环境。它能完成从代码输入到编译到仿真再到物理实现的全部设计流程。 1.5可编程逻辑控件FPGA本设计中选用FPGA,主要是因为它与传统的MCU相比有以下几个方面的优点:编程方式简便先进。FPGA产品中部分是采用菊花链在系统编程方式的。这种先进的编程方式已成为当今世界上各类可编程器件发展的趋势。因为它省却了价格昂贵,操作不便的专用编程器,只需要一个十分简单的下载编程电路和一条PC机的打印机通讯线就行了。它无须编程高压,在TTL电平下随时可进行在线编程,并可进行所谓菊花链式多片串行编程。高可靠性。在高可靠应用领域,MCU的缺憾为FPGA的应用留下了很大的用武之地。这族器件尽管在功能开发上是通过EDA软件实现的。但物理机制却像一片74LS164那样纯属硬件电路,十分可靠。通过合理设计,大多数应用中,无须考虑复杂的复位和初始化。设计中只需利用简单的语句将闲置状态导入同一初始入口,就能有效防止任何可能的“死机”现象。由于是并行工作,它的任一输入脚都可用作类似于MCU的中断监测引脚,且反应速度仅为纳妙级。FPGA的高可靠性还表现在几乎可将整个系统下载于同一芯片中,从而大大缩小了体积,易于管理和屏蔽。高速。FPGA的时钟延迟可达纳秒级,结合其并行工作方式,在超高速应用领域和实时测控方面有非常广阔的应用前景。功能强大,应用广阔。目前,FPGA的可选择范围很大,可根据不同的应用选用不同容量的芯片,如Lattice的ispLSI和AMD公司的MACH,最小芯片的等效逻辑门为1000门,最大达数十万门。ALTERA和XILINX公司推出的百万门的FPGA可实现几乎任何形式的数字电路或数字系统的设计。随着这类器件的广泛应用和成本的大幅下降,以及产品上市速率的提高,FPGA在系统中的直接应用率正直逼ASIC的开发。易学易用,开发便捷。单片机应用系统的设计对于行家里手来说是十分简单的事。然而,对于初学者,诸如CPU的工作方式、众多特殊寄存器的用法、中断概念等等,着实不是一件容易的事。相比之下,FPGA应用的学习却不需要太多的预备知识,只要稍具一点数字电路和计算机软件设计的基础知识,就能在短期内掌握基本的设计方法和开发技巧。而且反过来去学用单片机,就显得轻车熟路多了。这无疑是高技术为我们的学习提供了捷径,站在巨人的肩膀当然能更快地获得成功。可以预言,我国EDA技术的学习热潮和FPGA的应用热潮决不会逊色于过去10年的单片机热潮。开发周期短。由于相应的EDA软件功能完善而强大,仿真能力便捷而实时,开发过程形象而直观,兼之硬件因素涉及甚少,因此可以在很短时间内完成十分复杂的系统设计,这是产品快速进入市场的最宝贵的特征。一些EDA专家预言,未来的大系统的FPGA设计仅仅是各类再应用逻辑与IP核(CORE)的拼装,其设计周期仅以小时计。TI公司认为,一个ASIC百分之八十的功能可用IP核等现成逻辑合成。81.6有关于本次设计 本次设计实现简易音乐演奏器,理解音名与频率的关系及数控分频原理,经过对整体进行模块化分析、编程、综合、仿真及最终下载,完整实现简易音乐器的播放功能。按照EDA开发流程,采用VHDL硬件描述语言开发,将乐曲硬件播放电路设计进行模块化分解,层次化设计,分成几个单独的结构体,每个结构体实现部分功能,最后,经顶层文件将各单独结构体进行综合,实现乐曲硬件播放。我们知道,与利用单片机来实现乐曲演奏相比,以纯硬件完成乐曲演奏电路的逻辑要复杂得多,如果不借助于功能强大的EDA工具与硬件描述语言,仅凭传统的数字逻辑技术,即使最简单的演奏电路也难以实现。主要工作:根据硬件播放电路的功能进行全局分析,采用自上至下的设计方法,从系统总体要求出发,逐步将设计内容细化,最后完成系统结构的整体设计,实现预先设置乐曲的播放功能。917 2. 设计实现2.1系统原理 传统数字逻辑设计方法相比,本设计借助于功能强大的EDA工具和硬件描述语言来完成,如果只以纯硬件的方法完成乐曲播放电路的设计,将是难以实现的。本设计采用了梁祝的曲子来完成。先介绍一下硬件电路的发声原理。声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。2.1.1音符频率的获得 多个不同频率的信号可通过对某个基准频率进行分频器获得。由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。本文中选取750KHz的基准频率。由于现有的高频时钟脉冲信号的频率为12MHz,故需先对其进行16分频,才能获得750KHz的基准频率。对基准频率分频后的输出信号是一些脉宽极窄的尖脉冲信号(占空比=1/分频系数)。为提高输出信号的驱动能力,以使扬声器有足够的功率发音,需要再通过一个分频器将原来的分频器的输出脉冲均衡为对称方波(占空比=1/2),但这时的频率将是原来的1/2。表1中各音符的分频系数就是从750KHz的基准频率二分频得到的375KHz频率基础上计算得到的。由于最大分频系数是1274,故分频器采用11位二进制计数器能满足要求,乐曲中的休止符,只要将分频系数设为0,即初始值=211-1=2047,此时扬声器不会发声。表2-1 各个音符的频率及其对应的分频系数(基准频率375KHz)音符名频 率(Hz)分频系数计数初值音符名频 率(Hz)分频系数计数初值休止符37500002047中音4796.1784681579低音1294.3491274773中音5882.3534251622低音2330.3961135912中音6989.4463791668低音3370.9210111036中音71136.3633301717低音4386.5989701077高音11175.5493191728低音5394.7379501197高音21353.7902771770低音6495.3767571290高音31512.0972481799低音7555.566751372高音41609.4422331814中音1588.6976371410高音51802.8842081839中音2638.845871480高音62027.0271851862中音3742.5745051542高音72272.72716518822.1.2音调的控制频率的高低决定了音调的高低。计算出简谱中从低音1到高音1之间每个音名对应的频率,所有不同频率的信号都是从同一个基准频率分频得到的。由于音阶频率多为非整数,而分频系数又不能为小数,因此必须将计算得到的分频数四舍五入取整。若基准频率过低,则由于分频比太小,四舍五入取整后的误差较大;若基准频率过高,虽然误差较小,但分频数将变大。实际的设计应综合考虑这两方面的因素,在尽量减小频率误差的前提下取合适的基准频率。因此,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。综合考虑各因素,本文中选取12MHZ作为CLK的分频计数器的输入分频信号。乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在扬声器上连续地发出各个音符的音调。2.1.3 音长的控制 音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定。因此,在想控制音符的音长,就必须知道乐曲的速度和每个音符所对应的节拍数,在这个设计中所播放的乐曲的最短的音符为四分音符,如果将全音符的持续时间设为1s的话,那么一拍所应该持续的时间为0.25秒,则只需要再提供一个4HZ的时钟频率即可产生四分音符的时长。要想让系统知道现在应该播放哪个音符,而这个音符持续的时间应该是多少,就必须编写乐曲文件,在乐曲文件中音符是按地址存放的,当系统工作时就按4Hz的频率依次读取简谱,当系统读到某个音符的简谱时就对应发这个音符的音调,持续时间为0.25秒,而如果在曲谱文件中这个音符为三拍音长,那又该如何控制呢?其实只要将该音符连续书写三遍,这时系统读乐曲文件的时候就会连续读到三次,也就会发三个0.25秒的音长,这时我们听上去就会持续了三拍的时间,通过这样一个简单的操作就可以控制音乐的音长了。2.1.4乐曲节奏的控制本文中的梁祝乐曲,最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要提供一个4Hz的时钟频率即可产生1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低。2.1.5乐谱发生器本文将乐谱中的音符数据存储在LPM-ROM中,如“梁祝”乐曲中的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒的时间,相应地,音符“3”就要在LPM-ROM中连续的四个地址上都存储。当一个4Hz的时钟来时,相应地就从LPM-ROM中输出一个音符数据。2.1.6乐曲演奏电路原理 当一个4Hz的时钟脉冲来到时,乐谱发生器模块输出一个音符数据给分频系数模块,分频系数模块输出此音符相应的分频系数,将分频系数送给数控分频器模块,当12MHz的时钟脉冲来到时,数控分频器就根据分频系数输出相应的频率(即此音符所对应的发生频率)给扬声器,扬声器就可发出对应音符的声音来.连续的4Hz的时钟脉冲就将乐谱发生器里所存储的音符数据一个接一个的送给了分频系数模块,再经过数控分频模块,最后扬声器一个接一个的发出音符数据所对应的声音来。曲子也就流畅的播放出来了。2.2音乐硬件演奏电路的设计实现音乐硬件演奏电路主要是用VHDL语言来设计,并利用QuartusII软件工具来编译、测试和仿真。2.2.1各个模块的功能简介根据顶层原理图,共分为music模块、地址发生器模块、分频预置数模块、十六进制模块、数控分频模块这五个模块。music模块存放乐曲中的音符数据,地址发生器模块作为music模块中所定制的音符数据ROM的地址发生器,分频预置数模块提供分频预置数即给数控分频模块提供计数初值,十六进制模块对12MHz的时钟脉冲进行16分频,得到750KHz的频率,给数控分频模块提供时钟脉冲。数控分频模块根据分频预置数输出各个音符所对应的频率。2.2.2 music模块 Music模块存放乐曲中的音符数据,它是利用LPM-ROM来实现的,将乐谱中相应的音符放在一个连续的地址上。它首先是编写音符数据文件,将乐谱中相应的音符存放在一个连续的地址上。因为1拍的时间定为1秒,提供的是4Hz的时钟频率(即1/4拍的整数倍),则需将这个音符存储在相应次数的连续几个地址上。然后对音符数据进行ROM定制,最后对定制好的ROM文件进行测试和仿真。 表2-2 音符数据文件形成ROM中的配置数据(初始化数据)文件的方法如下:在QuartusII中编辑.mif文件。首先在File菜单下的New菜单上选择Memory Initialization File命令,进入编辑器,然后在空格处输入以上格式的数据文件。如46位置处为9,表示46为地址,9为该地址中的数据。这样每读到一个地址,即可输出其相应的数据。文件编辑好后,保存时取文件名为“c.mif”,存盘的路径为“工程文件夹下”。LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY altera_mf;USE altera_mf.all;ENTITY c ISPORT(address: IN STD_LOGIC_VECTOR (7 DOWNTO 0);clock: IN STD_LOGIC := 1;q: OUT STD_LOGIC_VECTOR (3 DOWNTO 0);END c;ARCHITECTURE SYN OF c ISSIGNAL sub_wire0: STD_LOGIC_VECTOR (3 DOWNTO 0);COMPONENT altsyncramGENERIC (clock_enable_input_a: STRING;clock_enable_output_a: STRING;init_file: STRING;intended_device_family: STRING;lpm_hint: STRING;lpm_type: STRING;numwords_a: NATURAL;operation_mode: STRING;outdata_aclr_a: STRING;outdata_reg_a: STRING;widthad_a: NATURAL;width_a: NATURAL;width_byteena_a: NATURAL);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 BYPASS,clock_enable_output_a = BYPASS,init_file = c.mif,intended_device_family = FLEX,lpm_hint = ENABLE_RUNTIME_MOD=NO,lpm_type = altsyncram,numwords_a = 256,operation_mode = ROM,outdata_aclr_a = NONE,outdata_reg_a = CLOCK0,widthad_a = 8,width_a = 4,width_byteena_a = 1)PORT MAP (clock0 = clock,address_a = address,q_a = sub_wire0);END SYN;定制的基本步骤如下:1)进入QuartusII,选菜单 tools-megawizard plug-in manager,选择“creat a new”,然后按“next”键,选择LPM-ROM;最后在browse下的栏中键入路径与输出文件名:“f:FPGA_musicc.vhd”,注意后缀vhd小写。2)单击“next”键,选择ROM数据位宽度为4,地址线宽为8,即设置此ROM能存储8位二进制数据共64个。3)通过在窗口的“browse”钮,找到ROM中的加载文件路径和文件名:“f:FPGA_musicc.mif”,注意ROM元件的inclock是地址锁存时钟。4)在QuartusII中打开已定制的ROM文件。将它设置为工程,并确定目标器件,进行测试。2.3地址发生器模块地址发生器模块设置了一个8位二进制计数器(计数最大值为138),作为音符数据ROM的地址发生器。每来一个时钟脉冲信号(Clk),8位二进制计数器就计数一次,ROM文件中的地址也就随着递增,音符数据ROM中的音符也就一个接一个连续的取出来了。2.3.1地址发生器的VHDL设计这个计数器的计数频率选为4Hz,即每一计数值的停留时间为0.25秒,恰为当全音符设为1秒,四四拍的4分音符持续时间。例如,地址发生器在以下的VHDL逻辑描述中,“梁祝”乐曲的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒时间。那么相应随着程序中的计数器按4Hz的时钟频率作加法计数时,即随地址递增时,将从音符数据ROM中将连续取出4个音符“3”通过toneindex3.0端口输向分频预置数模块。这样梁祝乐曲中的音符就一个接一个的通过toneindex3.0端口输向分频预置数模块。程序如下Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity notetabs is Port( clk : in std_logic;Toneindex : out std_logic_vector(3 downto 0); End;Architecture one of notetabs is Component c Port(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); Begin Cnt8 : process(clk) Begin If counter=11111111then counter=00000000; Elsif(clkevent and clk=1)then countercounter,q=toneindex,clock=clk);End;2.3.2波形仿真将所编写的地址发生器模块的程序设为工程,选用FLEX10K中的EPF10K10LC84-4为目标芯片进行仿真。仿真结果如下图:图2-1 地址发生器模块的仿真波形图程序的功能是每来一个时钟,地址值递增1,并将这个地址上所存储的音符数据输出。从图中可以看到,当Clk来了一个时钟脉冲,输出相应地址上的音符3, 地址值递增1;接下来的三个时钟脉冲来时,输出也是音符3,地址连续递增3次;再下一个脉冲来时,输出为音符5等等都符合模块中的音符数据文件中的地址/数据表。这个仿真波形图证明了程序实现了地址发生器模块的功能。2.4分频预置数模块分频预置数模块是乐曲简谱码对应的分频预置数查表电路。它提供了每个音符所对应的分频预置数,即给数控分频模块提供计数初值,这里以“梁祝”乐曲为例,列出了在这个乐曲中所用到的13个音符的分频预置数。2.4.1分频预置数模块的VHDL设计在这个模块的VHDL逻辑描述中设置了“梁祝”乐曲中全部音符所对应的分频预置数,共13个,每一音符的停留时间由音乐节拍和地址发生器模块的时钟(Clk)的输入频率决定,在此为4Hz。这13个值的输出由程序的4位输入值index3.0确定。输向程序中index3.0的值又由地址发生器模块的输出toneindex3.0的输出值和持续时间决定。程序如下:Library ieee;Use ieee.std_logic_1164.all;Entity tonetaba is Port( 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(10 downto 0);End;Architecture one of tonetaba isBegin Search : process(index) Begin Case index is When 0000=tone=11111111111;code=0000;hightone=01100000101;code=0001;hightone=01110010000;code=0010;hightone=10000001100;code=0011;hightone=10010101101;code=0101;hightone=10100001010;code=0110;hightone=10101011100;code=0111;hightone=10110000010;code=0001;hightone=10111001000;code=0010;hightone=11000000110;code=0011;hightone=11001010110;code=0101;hightone=11010000100;code=0110;hightone=11011000000;code=0001;high null; End case; End process;End;2.4.2 波形仿真将所编写的分频预置数模块的程序设为工程,仿真选用的目标芯片是EPF10K10LC84-4。仿真结果如图2-2: 图2-2 分频预置数模块的仿真波形图 模块的功能是输出各个音符所对应的分频预置数,由上面的仿真波形图可看到当index是“0000”,tone输出为2047,即休止符的分频预置数;当index是“0101”时, tone输出为1197即低音5的分频预置数;当index是“1111”时, tone输出为1728即高音1的分频预置数等等其它状态时,tone分别输出相应音符的分频预置数。这个仿真波形图证明了程序实现了模块的功能。2.5十六进制模块由其clk端输入一具有较高频率的信号(这里是12MHz)的信号,通过分频后由cout输出。这里是对12MHz的信号进行16分频得到750KHz的信号。750KHz的时钟脉冲信号是给数控分频模块提供时钟信号。2.5.1十六进制模块的VHDL设计 用以下的VHDL逻辑描述来实现十六进制模块的功能。Library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt16 is port( clk : in std_logic; cout : out std_logic);end cnt16;architecture shiliu of cnt16 is begin process(clk) variable cqi : std_logic_vector(3 downto 0); begin if cqi1111 then cqi:=0000; elsif clkevent and clk=1 then cqi:=cqi+1; end if; if cqi=1111then cout=1; else cout=0; end if; end process;end shiliu;2.5.2 波形仿真将程序设为工程,选用目标芯片为EPF10K10LC84-4对程序进行编译和仿真。仿 真结果如下图: 图2-3 十六进制仿真波形图此模块的功能是对输入的时钟脉冲信号的频率进行16分频。从仿真波形图上可以看到cout输出一个脉冲,此时的Clk刚好来第16个脉冲,即cout的频率是Clk频率的16分之一。可见所编写的程序实现了模块的功能。2.6 数控分频模块音符的频率由数控分频模块获得,这是一个数控分频电路。它是由一个初值可变的加法计数器构成。该计数器的模为2047,当计数器记满时,计数器产生一个溢出信号FULL,此溢出信号就是用作发音的频率信号。在计数器的输入端给定不同的初值,而此预置数就是表1中的计数初值,就可得到不同音符的发音频率信号。它计满时所需要的计数初值可由下式来表示: 计数初值(Tone)=2047-分频系数而分频系数又可有下式来求: 分频系数=基准频率/音符的发生频率低音时Tone值小,分频系数大,溢出信号周期长,扬声器发出的声音低,Tone随音乐的乐谱变化大,自动控制分频比,实现了数控分频,发生信号的频率与音调Tone成正比。这就是利用数控分频器自动演奏音乐的原理。2.6.1 数控分频模块的VHDL设计 其时钟(Clk)端输入的是在十六进制模块里对12MHz的信号进行16分频得到的750KHz,750KHz的信号根据分频预置数模块中所提供的计数初值,分别得出相应音符频率的两倍值。此时从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,这时的频率就变为原来的1/2,刚好就是相应音符的频率。数控分频模块中对Clk输入信号的分频比由11位预置数tone10.0决定。Fout的输出频率将决定每一个音符的音调,这样,分频计数器的预置值tone10.0与Fout的输出频率就有了对应关系。例如在分频预置数模块中若取tone10.0=1036,将发出音符为“3”音的信号频率。程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity pulse is port ( clk : in std_logic; d : in std_logic_vector(10 downto 0); fout : out std_logic );end;architecture ONE of pulse is signal full : std_logic;begin p_reg: process(clk) variable cnt11,cnt111 : std_logic_vector(10 downto 0); begin if clkevent and clk = 1 then cnt111:= 2046 - d; if cnt11 = cnt111 then cnt11 := 00000000000; full = 1; else cnt11:= cnt11 + 1; full = 0; end if; end if; end process p_reg ; p_div: process(full) variable cnt2 : std_logic; begin if fullevent and full = 1 then cnt2 := no
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 牙粉制造工安全规范考核试卷及答案
- 网商综合考核试卷及答案
- 蔬菜种苗工协作考核试卷及答案
- 药物组合协同效应-洞察及研究
- 22. Shrinking Powder说课稿-2023-2024学年小学英语4b典范英语(Good English)
- 机械类培训课件
- 形象设计师晋升考核试卷及答案
- 第二课 图文混排教学设计-2023-2024学年初中信息技术(信息科技)七年级 第9册滇人版(旧版)
- 模特工艺创新考核试卷及答案
- 塑料打火机制作工协作考核试卷及答案
- 《社会生活的变迁》教学课件
- DB1508T 171-2025 酸枣生态种植技术规程
- 工厂各部门管理制度
- 财务风险预警管理制度
- 2025-2026人教版小学数学二升三分班考试试卷附答案(三套)
- powerbi考试题及答案
- GB/T 26925-2025节水型企业火力发电行业
- 2025届安徽省六校研究会高三开学联考-物理试卷(含答案)
- 《社会工作》课件
- 《AIGC应用实战:写作、绘图、视频制作、直播》课件 第七章 即梦的使用方法
- LY/T 1607-2024造林作业设计规程
评论
0/150
提交评论