我们生活在一个信息高速发达的时代,各种各样电子产品层出不穷。对于广大老百姓来说,电子琴可以说已经不再是什么“新鲜玩意”了,它现在作为一种休闲和娱乐的产品早就推出市面,面向百姓,进入了我们的生活。作为一个电子信息科学与技术专业的学生,了解这些电子产品的基本的组成和设计原理是十分必要的,我们学习过了计算机组成的理论知识,而我所做的课程设计正是对我学习的理论进行实践和巩固。
电子琴作为音乐与科技的产物,在电子化和信息化的时代,为音乐的大众化做出了很大的贡献,歌曲的制作大多数都要由电子琴来完成,然后通过媒介流传开来,电视剧和电影的插曲、电视节目音效、甚至你的手机铃声,都很可能包含电子琴的身影。
电子琴因其操作简单, 且能模拟各种传统乐器的音色, 而深受消费者喜爱。笔者介绍了一种电子琴的设计方法。该系统基于可编程逻辑器件 FPGA( FieldProgrammable Logical Device) 芯片 , 利用 VHDL 硬件描述语言设计系统核心部件, 再配以适当的外围电路,可从琴键上进行演奏也可自动进行乐曲演奏, 可模拟传统乐器笛、风琴、小号、单簧、基准频率产生器双簧等音色。该电子琴共有12 个琴键 ( 7 个白色琴键 , 5个黑色琴键) , 分高音、中音、低音 3 个音区, 演奏时音名可动态显示。
原理分析
乐曲都是由一连串的音符组成,按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在扬声器上连续地发出各个音符的音调。为了准确地演奏出一首乐曲,仅仅让扬声器能够发出声音是远远不够的,还必须准确地控制乐曲的节奏,即每个音符的持续时间。由此可见,乐曲中每个音符的发音频率以及音符持续的时间是乐曲能够连续演奏的两个关键因素。
乐曲的12平均率规定:每2个八度音之间的频率要相差1倍,比如简谱中的中音2与高音2。在2个八度音之间,又可分为12个半音。另外,音符A(简谱中的低音5)的频率为392Hz,音符E到F之间、B到C之间为半音,其余为全音。由此可以计算出简谱中从低音l至高音1之间每个音符的频率。简谱音名与频率对应关系下图2-1所示:
1 系统组成
该电子琴系统组成框图如图 1 所示。
2 系统各部分电路设计
2.1 基准频率产生器
电路由晶振与反相器 CC4069 构成时钟脉冲振荡器。振荡器输出的频率为 6 MHz, 作为系统的基准频率。
自动演奏及键盘编码模块( AUTOMUSIC 模块)
该模块主要包括两大内容: 键盘输入编码及乐曲自动演奏。其 VHDL 程序的结构如图 2 所示, 包括 3 个进 程 : p01:process ( clk, Auto) 进程完成对系统时钟 6 MHz 的 1 500 000 分频, 得到 4 Hz 的信号 clk2, 作为另一进程的计数时钟, 用来控制每个音阶之间的停顿时间; p02: process( clk2) 进程为地址计数器, 计数范围为0~音乐存贮模块中音符的最大地址数。完成自动演奏乐曲的地址累加, 同时实现乐曲循环演奏; music: pro-cess ( count0, Auto, index2) 进程主要用来记录所选乐曲的乐谱、根据乐谱产生 12 位发声控制输出 index0 信号。当 auto 为“0”时, 将存储在此模块中的 12位二进制数作为发声控制信号 , 自动演奏乐曲。在记录乐谱时 , 若将 1 拍的时间长度定为1 s, 因地址计数器的时钟频率为 4 Hz, 即 1/4 拍时间为 0.25 s,则 1 个全音音符需重复记录 4次 , 2/4 拍音符重复记录 2 次, 该进程的流程图如图 3所示。
该模块程序中 clk 接基准频率产生器, 输入系统的基准频率 6 MHz; auto 为键盘输入演奏与自动演奏的切换开关, 即当 auto=“0”时, 选择音乐存储器里的乐曲 , 自动演奏 ; auto=“1”时 , 选择键盘输入的信号 , 从琴键上演奏。high2, med2, low2 分别接键盘上高、中、低音的控制开关 , Index2[0]~Index2[11]分别接键盘上的12 个琴键, HIGH0, med0, low0 分别输出音调的音区信息( 分别对应高音、中音、低音区) ; Index0[0]~Index0[11]输出琴键编码或音乐存储器里的乐曲的音符编码。
2.3 音符产生电路模块( Tone 模块)
该模块的作用是产生各音符的分频预置值。根据各音名与频率的关系( 如表 1) 以及声音输出控制模块( speaker 模块) 中数控分频器的设计, 分别计算出高音区、中音区、低音区不同音符的分频预置值, 如表 2 所示。( 在表 1、表 2 中, 音符 1、2、3、4、5、6、7 对应电子琴的 7 个白色琴键, 音符 1*、2*、4*、5*、6* 对应电子琴的 5个黑色琴键。) 程序中 Index 为 AUTOMUSIC 模块传入的音符编码, high0, med0, low0 为 AUTOMUSIC 模块传入表示音符所处音区, 如 high0=‘1’表示音符处于高音区 ; low0=‘1’表 示音符处于低音区 ; 程序中 Tone 为输出音符分频预置值, 因最大的预置数为 6 668, 为节省硬件资源及提高系统运行速度, 将 Tone 取值范围定为0~16#1E00#; HIGH, med, low 输出音符所处音区, 接外电路的发光二极管 , 高电平有效 ; CODE 端口接数码管, 输出音符的显示数码。该模块 VHDL 程序的结构如图 4 所示, 程序主要部分 se 进程流程图如图 5 所示。
2.4 声音输出控制模块( speaker 模块)
该模块主要电路为数控分频器。其 VHDL 程序结构如图 6 所示。程序中 CLK1 输入系统的基准频率 6 MHz, TONE1 接 Tone 模块传来的分频预置值, SPKS 输出端接音色产生器, 输出各音符所对应的频率。该程序包括 3 个进程 , 其中 DivideCLK : PROCESS( clk1) 进程功能将系统的基准频率 6 MHz 进行 3 分频得到 2 MHz 的频率, 由信号 PreCLK 传给 GenSpkS:PROCESS( PreCLK, Tone1) 进程。在设计中 PreCLK 频率太大,会使在 GenSpkS 进程分频中占用太多的硬件资源 ,PreCLK 频率太小 GenSpkS 进程分频后输出音符频率误差太大, 综合考虑这两个方面, PreCLK 选用 2 MHz的频率。GenSpkS 进程由一个初值可变的加法计数器构成, 初值为 Tone 模块传来的分频预置值( Tone1) 。分频后得到的频率 FullSpkS 为对应的音符频率的 2 倍。由于 FullSpkS 频率的脉宽很窄, 为便于驱动扬声器, 将FullSpkS 信 号 传 给 进 程 DelaySpkS:PROCESS ( Full-SpkS) , 在此进程中利用一个 D 触发器将 FullSpkS 信号进行二分频, 使到达扬声器的波形为对称方波, 此时输出的频率即达到所对应音符的实际频率。
2.4 在 FPGA 芯片中顶层文件的原理图该原理图
如图 7 所示。输入端 CLK1, CLK 接系统的基准频率 6 MHz, AUTO 接键盘输入演奏与自动演奏的切换开关 , 总线 INDEX2[11..0]接键盘上的 12 个琴键, HIGH2, MED2, LOW2 分别接键盘上高、中、低音的控制开关; 输出端 HIGH, MED, LOW 分别接发光二极管, 指示音调的音区信息( 分别对应高音、中音、低音区) , CODE[7..0]接 LED 数码管, 输出音符的显示数码,SPKS 输出端接音色产生器,输出各音符所对应的频率。
2.6 音色产生器
音色指乐音的音域范围、频谱成分及其包络特性等。音色产生器的功能是模拟各种传统乐器如笛子、小 号、双簧、风琴等的乐音。这些乐音的区别表现在发同风琴一音符时, 波形的频谱与包络特性不同。由此设计的一种简单音色产生电路如图 8 所示。其中, 74LS93 的输入脉冲 CLK0 来自 FPGA 芯片的音符频率输出端 spks; 74LS93 的输出端 Q0~Q3 为音符频率 spks 的 2,4, 8 及 16 分频信号。电阻 R1~R10 组成权电阻相加网络, 可产生由不同频率成分与不同幅度组成的各种波形。适当选择 R1~R10 的阻值或一定比值( 与乐器标准音比较后定) , 可获得如图 8 所示的笛子、小号、双簧、风琴等的基本乐音。再经 RC 滤波输出, 以改善音色。
该设计将电子琴系统的核心部分集成在可编程逻辑器件FPGA 芯片上, 大大简化了外部电路, 较以前的传统设计, 既减少了所用芯片的种类和数量 ,缩小了体积, 降低了功耗, 提高了系统的整体性能,对系统在使用中的故障率大为减少。此外, 这种基于可编程逻辑器件以 VHDL 硬件描述语言进行设计, 在电子设计的各个阶段、各个层次进行计算机模拟验证, 保证设计过程的正确性, 可降低设计成本 , 缩短设计周期, 具有广阔的应用前景。
评论
查看更多