APP下载

基于FPGA的简易电子琴设计

2017-05-18王丽君

电子科技 2017年5期
关键词:预置电子琴计数器

王丽君,李 萌

(1.南华大学 电气工程学院,湖南 衡阳 421001;2.南华大学 计算机科学与技术学院,湖南 衡阳 421001)

基于FPGA的简易电子琴设计

王丽君1,李 萌2

(1.南华大学 电气工程学院,湖南 衡阳 421001;2.南华大学 计算机科学与技术学院,湖南 衡阳 421001)

介绍了一种基于在系统可编程门阵列(FPGA)的简易电子琴设计方法,可实现手动弹奏、自动演奏预存乐曲和简谱码显示功能。该设计的主体部分采用超高速集成电路硬件描述语言(VHDL)编程实现。根据简谱记录的频率产生方式,通过数控分频器将基准频率按一定的分频比分频,得到乐曲中所有音符信号的频率,再由驱动电路驱动发声或接耳机,便可实现乐曲的弹奏或播放功能,用数码管和发光管来显示输出音名对应的简谱码。该方法设计简单、修改方便、设计周期短,实验证明了该设计的可行性,具有一定的实用价值。

FPGA;电子琴;数控分频器;数码管

数字音乐电子琴是是现代电子科技与音乐结合的产物,相比体积庞大、价格昂贵的钢琴,数字音乐电子琴以其操作简单、价格低廉的优势受到喜爱[1]。本文介绍的简易电子琴的设计,采用Alter 公司的现场可编程门阵列(Field-Programmable Gate Array,FPGA)EP3C40Q240C8芯片作为核心控制器件,以该公司提供的Quartus II 9.0为软件平台,可实现电子琴以下几个功能:(1)21个琴键手动弹奏,高、中、低音各7个;(2)5首预存简谱乐曲自动循环演奏,曲目可通过数字按钮任意选择,可快进、后退、暂停、复位;(3)数码管动态显示当前音名的简谱码,中音直接显示,低音在数码管下方加发光管点亮表示,高音在数码管上方加发光管点亮表示,发声通过扬声器或接耳机实现。由于该设计的主体部分在FPGA中实现,且采用自顶向下的设计方法,提高了开发和研制的效率,使整个设计和修改过程变得方便、高效[2]。

1 总体设计方案

系统结构图如图1所示,其中虚线框内部分在FPGA中实现。

图1 数字音乐电子琴系统结构图

硬件电子琴电路图如图2所示。

图2 硬件电子琴电路图

2 系统各部分电路设计

2.1 音乐与频率的关系

乐曲演奏包含两个要素:(1)组成乐曲音符的频率;(2)该音符持续的时间。因此只要确定这两个要素所对应的数值就可以进行音符的输出了[3]。简谱中音名与频率的对应关系如表1所示[4]。根据表中各音符频率,只要能在音符产生电路模块给出合适的分频比和该分频比持续的时间,就能在声音输出控制模块产生对应音符的频率和节拍,通过扬声器发出美妙的音乐[5]。

表1 简谱中音名与频率的对应关系

2.2 时钟电路

设计中采用的FPGA芯片EP3C40Q240C8含有高性能的嵌入式锁相环。此锁相环可以与输入的时钟信号同步, 输出一个至多个同步倍频或分频的片内时钟, 以供逻辑系统应用[6]。

20 MHz系统时钟通过FPGA内部锁相环分频后分两路输出。一路输出的频率为2 kHz,经分频器分频后得到4 Hz的时钟,作为乐谱和节拍发生器模块的节拍控制。另一路输出的频率为1 Hz,作为数控分频器的基准频率。

2.3 乐曲长度控制计数器

CNT825T是一个10位二进制计数器,作为乐谱码ROM的地址发生器[7]。ROM中存放着“梁祝”等5首乐曲共计825个音符的索引值。该计数器的计数频率为4 Hz,即每一计数值的停留时间为0.25 s,恰为当全音符设为1 s时,四四拍的4 分音符持续时间[8]。其中SEL[4..0]为5首预存乐曲的选择按钮,外接数字按钮1-5。按下数字“1”时,选择第一首乐曲,SEL[4..0]的值为“00001”,计数器从0位置开始计数,所以该键也可作为复位键使用;按下数字“3”时,选择第三首乐曲,SEL[4..0]的值为“00100”,计数器跳转到第三首乐曲的地址值,并开始计数,其余类推。FF和FB分别为快进、快退键,按一次计数值加或减15。PP减键为播放/暂停键,播放时按一下该键计数器停止计数,再按一下继续计数。若计数值已满825,则清零重新计数,实现循环播放功能[9]。

2.4 乐谱码ROM

乐谱码ROM中存放着预存乐曲的乐谱索引值,每个音符发声的持续时间控制通过记谱的方式来完成,占用几拍,就将该音符的索引值连续记录几次[10]。索引值最多可输出32个,这里只需输出21个,从“00001”到“10101”,表示从低音“1”到高音“7”的索引值。通过4 Hz的时钟,把乐谱中的音符索引值连续送出。

2.5 手动弹奏音阶控制模块

Tone为手动弹奏音阶控制模块。Index[20..0]为弹奏的21琴键输入,当21位发声控制输入Index中某一位为高电平时,则对应该音阶的数值将从端口q1[4..0]输出,作为获得该音阶的分频预置数的索引值[11]。

2.6 分频预置数产生模块

F_CODE为分频预置数产生模块。它的输入端INX[4..0]连接到乐谱码ROM的输出, INX1[4..0]连接到手动弹奏音阶控制模块Tone的输出。AUTO为手动/自动选择按钮,当AUTO 为“0”时(默认),通过F_CODE内部的二选一多路选择器,选择INX1[4..0]作为输入,此时为手动弹奏模式;当AUTO 为“1”时,选择INX[4..0]作为输入,此时为预存乐曲自动播放模式。

F_CODE内部设置了21个音符所对应的分频预置数,该模块的主要功能是接收到手动/自动输入的音符索引值后,通过内部的乐曲简谱码索引值的分频预置数查表电路,产生该音符所对应的分频预置值,预置值在输入口停留的时间即为此音符的节拍值,由乐曲长度控制计数器CNT825T的输入时钟频率CLK决定。同时由CODE[3..0]输出对应该音符的简谱码,外接数码管显示,HIGH和LOW输出指示该音符的高8度和低8度,外接发光管显示[12]。

F_CODE模块查表电路的部分代码如下(C调):

CASE INX IS -- 译码电路,查表方式,控制音调的预置数

WHEN "00000" => TO<="11111111111" ; CODE<="0000";

HIGH <=’0’; LOW <=’0’ -- 2047, 休止符不发音

WHEN "00001" => TO<="00010001100" ; CODE<="0001";

HIGH <=’0’; LOW <=’1’ -- 140,低音1,

WHEN "00010" => TO<="00101011011" ; CODE<="0010";

HIGH <=’0’; LOW <=’1’ -,347,低音2

……………………

WHEN "10100" => TO<="11011100100" ; CODE<="0110";

HIGH <=’1’; LOW <=’0’ ——1764,高音6

WHEN "10101" => TO<="11100000011" ; CODE<="0111";

HIGH <=’1’; LOW <=’0’——1795,高音7

WHEN OTHERS => NULL;2.7 声音输出控制电路

该模块由图2中的数控分频器实现,通过对给定的基准频率,按一定的分频比进行分频,来产生各音符所对应的频率[13]。若其基准频率过低,会使得分频后的输出误差较大;若基准频率过高,会耗费较多的FPGA资源。综合考虑,CLK选用1 MHz。数控分频器其实是一个具有预置功能的可变模计数器,输出音符频率与基准频率的关系为

f=f0/2(2n-TN)

(1)

其中,f为输出音符频率;f0为基准频率1 MHz;n为计数器的位数;TN为计数器11位预置数;2表示二分频。因为输出最小的频率为216.63 Hz,计算后可知n取11即可。

可变模计数器的部分代码如下:

IF CLK ’EVENT AND CLK=’1’ THEN

IF Count=2047 THEN

--若记满,将预置数TN输入

ELSE Count:=Count+1;

--若没计满,继续计数

FullSpkS<=0’;

……………………

IF FullSpkS’EVENT AND FullSpkS = ’1’

THEN Count2 := NOT Count2;

--将输出再2分频,展宽脉冲,使扬声器有足够功率发音

IF Count2 = ’1’ THEN SPKS <= ’1’;

ELSE SPKS <= ’0’;--SPKS为声音输出

由于FullSpkS是脉宽极窄的脉冲式信号,不利于驱动扬声器,故对其二分频,均衡占空比后,由SPKS输出。SPKS可外接喇叭或蜂鸣器驱动发声[14]。为了不影响他人,也可外接耳机。

按照乐曲要求,根据表1 的音符频率和式(1),可计算出产生各音符所对应的计数预置数 ,从而产生乐曲所需要的各频率信号[15]。

自动演奏模式时,随着乐曲长度控制计数器CNT825T模块按4 Hz的时钟速率作加法计数时,即随地址值递增时,音符数据ROM 中的音符数据通过INX[4..0]端口输向F_CODE模块,乐曲就开始连续自然地演奏起来了。手动弹奏模式时,21琴键输入的高电平,通过Tone模块,从INX1[4..0]输出对应的音符索引值送向F_CODE模块,产生相应的音符,音符持续的时间长短由手指按压琴键的时间决定。

3 结束语

系统完成了预期的电子琴的所有功能。该设计将电子琴系统的核心部分集成在可编程逻辑器件FPGA 芯片上,在很大程度上简化了外部电路;采用VHDL 语言的层次化和模块化的设计方法,增强了设计的可移植性和可扩展性;精确的数字分频系数使电子琴的发音准确,提高了系统的整体性能,为各类大容量语音芯片系统设计开辟了一条新的技术方法,使设计具有广阔的应用前景。

[1] 钟秀媚,陈荣军,李伟健.一种基于FPGA 和超声波的虚拟电子琴设计[J].电子设计工程,2012,20(19):142-144.

[2] 郭培源,乔美华.基于CPLD/FPGA芯片的音乐存储与回放系统的设计[J].网络与多媒体,2004(10):54-57.

[3] 曹康,童闻焕.基于FPGA 的乐曲演奏电路设计[J].成功:教育版,2007(5):98-99.

[4] 吴翠娟.基于FPGA 的简易电子琴控制电路设计[J].电脑知识与计数,2014,28(10):6777-6780.

[5] 高文华,刘相龙,崔丽娟,等.音乐发生器的FPGA设计与仿真[J].电声技术,2013,37(3):25-28.

[6] 裴志强,杨玉飞,刘宝娟.数字时钟锁相环的设计与实现[J].微机处理,2012(1):4-6.

[7] 杨盼盼,李华伟.基于FPGA非正弦波形发生器的电路设计[J].电子设计工程,2015,23(24):76-78.

[8] 崔智军,刘昭元,张瑜.基于FPGA的简易触摸电子琴设计[J].现代电子技术,2014,37(22):114-116.

[9] 吴进强,苏凯雄.智能电视TV播放器的设计与实现[J].电视技术,2013,37(21):44-48.

[10] 周若华,颜永红.一个快速自动音乐记谱方法[J].声学学报,2010,35(2):282-287.

[11] 王大为,党世红.基于AT89C51单片机的简易电子琴设计[J].电脑知识与技术,2014,10(23):5548-5550.

[12] 张海峰,王福源.基于FPGA 的通用乐曲电路设计[J].中原工学院学报,2005,16(4):54-57.

[13] 罗芬,赵新业,梁小流.多功能音乐演奏器的设计[J].大众科技,2010(11):36-37.

[14] 何小河.基于FPGA的音乐播发器设计[J].电子世界,2014(14):172-174.

[15] 李峡.如何让单片机演奏音乐[J].河南科技,2011(3):88-89.

A Simple Design of the Electronic Piano Based on FPGA

WANG Lijun1,LI Meng2

(1.School of Electric Engineering, University of South China, Hengyang 421001, China;2. School of Computer Science and Technology, University of South China, Hengyang 421001, China)

A simple design of the electronic piano based on FPGA capable of manual-play, auto- play and display of the numbered musical notation codes is presented. It is realized mainly by VHDL. In accordance with the generation method of audio signal frequency, we can get all frequencies of musical note by the NC Frequency divider. By connecting the output to the loudspeaker or headset, manual-play and auto-play functions can be realized. The numbered musical notation codes are shown by nixie tube and luminous. The design has the advantage of simple structure, easy modification and short design cycle. Experiment result shows its feasibility.

FPGA; electronic piano; nc frequency divider; nixie tube

2016- 06- 20

王丽君(1979-),女,硕士,讲师。研究方向:电子信息工程。李萌(1975-),男,硕士,讲师。研究方向:计算机应用。

10.16180/j.cnki.issn1007-7820.2017.05.017

TN79

A

1007-7820(2017)05-062-04

猜你喜欢

预置电子琴计数器
采用虚拟计数器的电子式膜式燃气表
基于排队论的水下预置反舰导弹部署优化
关于74LS90计数器的Multisim仿真分析
基于AT89C51单片机的电子琴设计
SR620型与53230A型计数器的性能测试
多级网络物资预置—前送模型及改进布谷鸟搜索算法研究
电子琴
算盘是个“小气鬼”
混料设计在6061铝合金激光焊预置Al-Si-Ni粉末中的应用
预置缝线减张缝合法预防低位直肠癌术后吻合口瘘效果观察