如发现有乱码,
请直接从这里浏览原文
正文摘录:2006年第24期总第239乐曲要求定时改变计数器的预置数,即产生乐曲所需要的频率信号。3电路设计过程3.1系统总体框图该音乐存储电路由乐谱存储模块、音符产生模块、声音输出模块、显示模块等组成,其总体框图如图2所示。图2电路的总体框图3.2电路各模块的功能(1)乐谱存储电路模块(notetabs)主要用来记录产生所选乐曲的乐谱,音调的产生和节拍的控制由每个音符发声的持续时间来决定。这里定义了一个可预置初值的时长计数器,目的是保证当一首乐曲演奏完时,能自动从头开始演奏。计数器计数频率选为4Hz,即每一计数值的停留时间为O.25s,当全音符设为ls时,恰为四四拍的四分音符持续时间。每个音符发声的持续时间控制通过记谱的方式来完成,对于占用时间较长的节拍(一定是1/4拍的整数倍),如2/4拍只需将该音符连续记录2次即可。该设计中放置了4个乐曲,要求可选择播放曲目,当可预置端为有效时,将初值预置到所选曲目的开始状态,便可演奏所选曲目。(2)音符产生电路模块(tonetaba)主要功能是为每个音符提供对应的分频系数。表2列出了各音符对应的分频系数(基准频率为12MHz)。分频计数器的分频系数n与基准频率,的大小相关,”一_厂÷对应的音阶频率÷11(预分频系数)÷2(输出口2分频)。表2音符对应的分频系数声音输出电路模块(speaker)是一个数控分频器,由CLK端输入一具有较高频率(12MHz)的信号,通过spea—kout输出,驱动扬声器发声。由于数控分频器输出的波形是脉宽极窄的脉冲波,为有利于驱动扬声器,加一D触发器以均衡其占空比。显示电路模块主要是根据乐谱存储电路所选的曲目,显示相应的乐曲的名称。这里采用的是点阵显示,主要原理是:列信号为SELO~SEI.3,行信号为Lo~u5,需要一个扫描频率。因为只有单列信号扫描频率超过30Hz时,人眼看上去才不会闪烁,因此扫描频率必须大于或等于30×16(480Hz)。本设计中单列扫描频率为152Hz,符合要求。主程序(各模块连接电路)定义了系统的全部输入、输出端口。输入端口有CLK12MHz(系统时钟)、CLK4Hz(音乐节拍时钟);输出端口有:Speakout(声音输出,接扬声器)selout(点阵的列选信号),dotout(点阵的行选信号),主程序调用子程序中,调用4个eomponent模块、notebabs模块、toneraba模块、speaker’a模块和dot模块。3.3程序设计方法本音乐存储电路采用自顶向下的设计方法。先从系统功能出发,将电路分为4大模块分别设计,模块之间通过参量传递进行通信,接下来再分别设计每个模块。在进行模块功能设计时,除了采用原理图的输入方式外,也可以用VHDL语言直接进行设计,或混合使用文本文件和其他类型的设计文件进行设计。这里各个模块都采用VHDL语言进行设计的。例如声音输出模块(speakel‘a模块)的部分程序如下:architectureoneofspeakeraissignalpreclk,fullspks:stdlogic;begindivide(:lk:process(elk)vat’iablc:count4:std—logi(:一’vector(3downtoO);beginpreclk<一’O’;将cLK进行ll预分频ifcount4>10thenpreclk<一’1’;count4:一’’0000'’;elsifclk’eventandclk一’1’thencount4:一count4+1;endif:endproee-ss:genspks:process(preclk,tone);11位可预置数计数器Variable‘countll:std~logic—Vector(10downtoO);beginifpreelk’event。andpreelk一’1’thenifcountll—167ffthencountll:一tonefullspks<一’1’:elsecountll:一countll+1;flallspks<一’O’;endif:endif:endprocess;delayspks:process(fullspks);将输出再2分频,使其带动扬声器variablecounl,2:std—logic’;beginiffullspks’eventandfullspks一’1’thencount2:一notcount2;ifcount2—1’thenspks<一’1’:elsespks<一’O‘:endif:(下转第12页)
阅读此文(图):
在线翻阅