版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于EDA的简易电子琴设计鲍亚文(安庆师范大学物理与电气工程学院 安徽 安庆 )指导老师:郑江云摘要:本设计是一个简易的七音符电子琴,该电子琴可以通过按键输入来控制音调,也可对预置乐曲的自动演奏,同时由数码管显示即时音符。系统的实现是基于EDA技术,在Quartus软件平台上,借助FPGA目标器件,用硬件描述语言Verilog HDL进行编程并仿真验证。本设计中的电子琴可操作性好,音符显示直观,声音优美。关键词:电子琴,电子设计自动化,Verilog HDL语言引言科技发展的日新月异,催生了一系列新奇实用的电子产品。在这些电子产品中,电子琴早已成为电子乐器行列中的重要一员。电子琴是人类仿制常规
2、乐器的代表之一,其发明问世极大地丰富了人们的听觉感受,推动了音乐的普及和发展。在信息化与电子化交织的今天,电子琴作为社会科技与文明的产物,正扮演着音乐领域中不可或缺的角色。EDA技术的快速发展和成熟,FPGA等数字可编程器件的出现和进步,基于EDA技术的设计也变得愈加简单可行。基于EDA技术的设计不仅系统可靠性较高,而且能实现较为复杂的功能。运用EDA软件可方便地在计算机平台上实现设计与仿真,本设计中的电子琴便是基于EDA技术,运用Verilog HDL语言设计完成的。1 EDA概述与音乐知识1.1 EDA技术1.1.1 EDA的发展EDA(Electronic Design Automati
3、on,电子设计自动化)可以认识为在计算机工作平台上,以EDA软件为开发环境,以PLD器件或ASIC专用集成电路为目标器件来设计实现电路系统的一门技术。EDA技术在逐渐进步,其大致经历了3个发展阶段:CAD阶段(20世纪70年代至80年代初)、CAE阶段(20世纪80年代初至90年代初)、EDA阶段(20世纪90年代以后)。1EDA技术在进入21世纪后,得到了不小的进步和发展,突出表现在以下几个方面:2(1)不断推出在仿真验证和设计两方面都支持标准硬件描述语言的EDA软件,功能更加强大且验证更加高效;(2) EDA技术使得电子设计成果以自主知识产权(IP)的方式予以确认,提高了设计成果的可重用性
4、;(3)EDA技术使得电子领域各学科之间的界限更加模糊,互为包容,如模拟和数字、软件和硬件、系统和器件、ASIC和FPGA等;(4)SoPC(可编程芯片系统)进入实用化阶段;(5)高速数字信号处理算法可基于FPGA的DSP技术实现。1.1.2 EDA的设计流程一个完整的EDA设计流程既是自顶向下设计方法的具体实施途径,也是EDA工具软件本身的组成结构。自顶向下的设计,即Top-down设计,这种设计方法首先从系统设计入手,在顶层进行功能方框图的划分与结构设计。在功能级仿真纠错,并用硬件描述语言对高层次的系统行为进行描述,然后用综合工具将设计转化为具体门电路网表。由于设计的主要仿真和调试过程是在
5、高层次完成的,这一方面有利于在早期发现结构设计上的错误,避免设计工作的浪费,同时也减少了逻辑功能仿真的工作量,提高了设计的一次成功率。EDA设计流程一般包括:设计输入、综合、布局布线、仿真、编程配置的步骤。3设计输入原理图HDL文本功能仿真综合时序仿真FPGA/CPLD适配FPGA/CPLD编程下载在线测试 图1 基于FPGA/CPLD器件的数字系统设计流程 (1)设计输入(Design Entry):主要为原理图(schematic)输入和HDL文本编辑输入2部分。(2)综合(Synthesis):将高级抽象层次的设计描述自动转化为低层次描述。(3)布局布线:将综合生成的电路逻辑网表映射到具
6、体的目标器件,并产生最终的可下载文件。(4)仿真:包括功能仿真和时序仿真,对设计电路的功能的验证。(5)编程配置:把适配后生成的编程文件装入到PLD器件中,CPLD器件的下载称为编程,FPGA器件的下载称为配置。1.1.3 Quartus II设计平台和Verilog HDL语言本设计的开发工具是Quartus II,采用Verilog HDL语言编程。Quartus II适合大规模FPGA的开发,是Altera继MAX+plus II后的新一款开发工具。Quartus II提供了更优化的综合和适配功能,改善了对第三方仿真和分析工具的支持。它还包括了DSP Builder、SOPC Build
7、er等开发工具,支持系统级的开发等。Quartus II是一款具有标准的EDA工具接口和完善的可视化设计环境的FPGA/CPLD集成开发软件。设计输入有多种表达方式,最常用的是原理图方式和HDL文本方式。Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言。用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。4Verilog HDL和VHDL是世界上流行的2种硬件描述语言,都是在20世纪80年代中期被开发出来的。Verilog HDL由GDA公司开发,它是在C语言的
8、基础上发展而来的,但作为一种硬件描述语言和C语言有着本质的区别,Verilog语言概括起来有着如下的一些特点:(1) 适用于可综合的电路设计,也适用于电路和系统的仿真。(2) 能在多个层次上对所设计的系统进行描述,对设计的规模也没有任何限制。(3) 行为描述和结构描述灵活且支持混合建模。(4) 行为描述语句类似于软件高级语言。(5) 内置各种逻辑门和开关级元件。(6) UDP(用户定义原语)可灵活创建。1.1.4 FPGA器件FPGA(Field Programmable Gate Array),现场可编程门阵列,是一种在采用单元型结构的新型PLD器件。作为ASIC(专用集成电路)领域中的一种
9、半定制电路,FPGA既弥补了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点,成为当前主流的PLD器件之一。FPGA使用CMOS、SRAM工艺制作,和阵列型PLD结构不同,内部由许多独立的可编程逻辑单元构成,各逻辑单元间可以灵活地相互连接,具有密度高、速度快、编程灵活、可重新配置等优势。1.2 电子琴与相关的音乐知识EDA技术的成熟,FPGA器件的发展使得基于EDA技术的电子琴设计成为可能。在计算机上运用EDA软件可以很方便地对所需要实现的电子琴进行设计和仿真。采用传统方法如单片机设计的电子琴,要求设计人员对硬件非常熟悉,且单片机制作的主控板受制版工艺、布局结构和起器件质量等因素的影响
10、导致抗干扰能力差、故障率高、不易扩展等问题。EDA技术对于设计人员来说,修改程序可以实现不同的功能,对于设计周期来说节省了时间。本设计中的电子琴是通过按键控制发音的,系统演奏时能选择手动演奏或是自动演奏一段预置的简短音乐。为完成该设计,需要了解一些基本的音乐知识理论。在音乐领域中,简谱和五线谱是人们用来记谱的两种记谱法,简谱相对简易,其又分为字母简谱和数字简谱。数字简谱以1、2、3、4、5、6、7来表示音阶中的7个基本音级,分别用do,re,mi,fa,sol,la,si来读音。在一段4/4拍数字简谱中,单独的数字表示一个四分音符,数字下面的横线为减时线,表示四分音符长度减半;数字右面的短横线
11、称为增时线,每加一条则延长一个四分音符时间;数字右面的圆点称为附点,用来延长前面音符时值的一半。如4/4拍一个四分音符(5)为1拍,则全音符(5- - -)为4拍,二分音符(5-)为2拍,八分音符(5)为半拍。在一段数字简谱后面的竖直线为小节,0为休止符。另外为了标记简谱中的重低音,在数字上方的圆点记为重音,在下方的为低音,单独的数字则是中音。2.系统分析与方案设计2.1 设计思想与原理框图扬声器设计思想为利用EDA技术对FPGA器件进行配置实现电子琴,系统扫描按键输入信号来选择是手动还是自动演奏,采集的信号转化为分频预置数,数控分频器输出不同音符的频率给扬声器,并由数码管显示当前音符。按键译
12、码数码管4音调显示置数分频扬声器反馈预置计数器二分频器CLK-6MHz数码管123音符显示 分频曲谱产生CLK-4Hz图2 系统原理框图2.2 原理说明(1) 当演奏者按下7个音调键盘后,在系统基准时钟6MHz下,根据键盘的输入信号分频,产生所需的7个不同音调的频率并二分频输出给speaker,同时由数码管HEX4显示音调。(2) 当自动演奏信号auto为真时,对系统6MHz基准时钟分频,产生一个频率为4Hz的时钟用于谱曲的分频比预置。6MHz时钟使数控分频器产生曲谱演奏音符的对应频率,再经过一个二分频器输出该频率,最后通过speaker发出该音符的声音,同时由数码管HEX3、 HEX2和 H
13、EX1分别显示高中低音符。(3) 当auto为0演奏者按下stp键后,speaker不发声,输出始终为0Hz的信号,同时音调数码管均显示0。3.Quartus II设计过程3.1 自动演奏乐曲要使用电子琴完成一段音乐的演奏,音调和音长是2个最关键的参数。根据音乐知识,音调是由频率控制的,音长为该音符持续时间的长短。在本设计中,乐谱产生电路用来控制音乐的音调和音长。本设计中曲谱的自动演奏需要在C调中选取从低音1到高音7共21个音阶,这些不同信号的频率都可以由一个基准频率分频得到。因为各音阶的频率为非整数,而分频系数不能为小数,所以必须对分频系数进行四舍五入。这样基准频率的选择变得比较重要,基准频
14、率选择较低,分频系数就小,误差大;基准频率选择较高,误差是小了,但是分频系数也大。综合考虑,选取6 MHz的基准频率是可行的。数控分频器输出的为脉宽极窄的脉冲式信号,为了减少输出的偶次谐波分量,需要在数控分频器和扬声器之间加一个二分频器以均衡其占空比,保证到达扬声器的是对称方波。二分频器将基准频率二分频,即为3MHz,计算分频系数也就以3MHz为基准频率。分频系数为基准频率和各音阶频率的比值,例如中音1的频率为523Hz,分频系数为5736,高音7的频率为1976 Hz,分频系数为1518。由于最大分频系数为11450,故采用14位二进制计数器已经足够。在演奏时,对于不同的分频系数,只需要加载
15、对应的预置数。采用加载预置数的方法比反馈复零法更节省资源,实现起来也更加简单。用差值法分频,把初始值214 -1=16383和各音阶的分频系数的差值作为预置数即可发出不同频率的音符。对于乐曲中的休止符,只要将分频系数设为0,初始值为16383即可,此时扬声器不发声。6表1 各音阶频率对应分频系数与预置数(由3Mhz计算得出)低音频率/Hz分频系数初始值中音频率/Hz分频系数初始值高音频率/Hz分频系数初始值12621145049331523573610647110462868135152294102046179258751111127221175255313830333090917294365
16、94552118313131822761410743498596778746984298120854139721471423653927653873057843827125565156819131447064406818956568034091297467601705146787494607310310798830361334771976151814865音符的持续时间由乐曲的速度及每个音符的节拍数确定。通过控制计数器预置数的停留时间,预置数的停留时间长,则音符的停留时间长。以下是生日歌的C调简谱:图3 生日歌简谱简谱中,如果将全音符的持续时间设定为1秒,则四分音符为0.25秒,只需要再提供一
17、个4Hz的时钟频率即可产生四分音符的时长。每个音符的演奏时间都是0.25的整数倍,对于节拍较长的音符,如二分音符在记谱时将该音名连续记录2次,全音符连续记录4次即可。在编写乐谱程序时记音符的拍数,由于二分频器的存在,一拍就要记为连续的2个时钟节拍。为了实现乐曲的循环演奏,需要再加一个时长计数器counter,当乐曲演奏结束时能再次重新演奏。3.2 手动按键演奏本设计中的电子琴且除了能自动演奏一段预置的乐曲外,还能完成手动演奏发出C调的7个中音 。由于自动演奏是在人按下自动演奏键以后进行的,所以设置一个auto来控制是否自动演奏。当auto为真时,实现预置乐曲的自动演奏,否则扫描按键由人工演奏。
18、如果自动演奏则按照乐谱,把musicout赋值给speaker。手动演奏时的音调频率同样需要由系统时钟分频得到,设置一个i以改变分频系数,再对speaker二分频。各个音调的分频系数以3MHz计算得出,即为表1中从中音1到中音7的分频系数。如中音1的分频系数应为5736。相应地,中音1的输出信号程序应该编写成:doo:begin if(i=5736)beginspeaker=!speaker;tone=4b0001;i=0;endelsei=i+1d1;end3.3 音名显示音名显示数码管用来显示演奏时对应的音符。本设计中,用数码管HEX3、HEX2、HEX1分别显示自动演奏时的高中低音符,其
19、中high_7s、mid_7s和low_7s分别为高中低音显示信号;用数码管HEX4显示手动演奏时的音调,tone_7s为键盘演奏音调信号。采用7段共阳数码管,以a、b、c、d、e、f、g来标记数码管的7个LED显示位,对各个要显示位置加以低电平即可点亮。本设计中,定义输出reg6:0 ledout为显示信号,例如要显示“0”,只要使ledout=7b。借助这些数码管,能够实现演奏的动态显示。图4 共阳数码管原理图3.4 源程序module eorgan(key,clk6m,auto,speaker,tone_7s,high_7s,mid_7s,low_7s); input key,clk6m
20、,auto; /键盘输入,6M基准时钟输入,自动演奏 wire7:0 key; /键盘输入信号 output 6:0 tone_7s; /数码管显示键盘音调output reg speaker; output 6:0 high_7s; /显示乐曲高音音符output 6:0 mid_7s; /显示乐曲中音音符output 6:0 low_7s; /显示乐曲低音音符 reg20:0 i; reg clk4; reg3:0 high,mid,low,tone; /高中低音信号和键盘音调信号 reg13:0 divider,origin; /自动演奏分频系数和初始值 reg carry; reg m
21、usicout; /乐谱输出信号 reg 19:0 count20; reg7:0 counter; parameter stp=8b, /休止 doo=8b, /do re=8b, /re mi=8b, /mi fa=8b, /fa sol=8b, /sol la=8b, /la si=8b; /si always (posedge clk6m) begin if(auto) speaker=musicout; /如果automusic为真,输出乐谱 else begin /否则判断键盘key的输入case(key) stp:beginspeaker=0;tone=4b0000;i=5736
22、)beginspeaker=!speaker;tone=4b0001;i=0;endelsei=5111)beginspeaker=!speaker;tone=4b0010;i=0;endelsei=4552)beginspeaker=!speaker;tone=4b0011;i=0;endelsei=4298)beginspeaker=!speaker;tone=4b0100;i=0;endelsei=3827)beginspeaker=!speaker;tone=4b0101;i=0;endelsei=3409)beginspeaker=!speaker;tone=4b0110;i=0;e
23、ndelsei=3036)beginspeaker=!speaker;tone=4b0111;i=0;endelsei=i+1d1;enddefault:beginspeaker=0;tone=4b0000;i=0;endendcase end end always (posedge clk6m) /通过置数,改变分频比begin if(divider=16383)begin carry=1;divider=origin;end else begin divider=divider+1d1;carry=0;endend always (posedge carry) begin musicout
24、=musicout; /2 分频产生方波信号 end always (posedge clk6m) /从6Mhz得到4hzbegin if(!auto)begin count20=20d0;clk4=0;endelse if(count20=20d) begin count20=20d0;clk4=clk4;endelse count20=count20+20d1;end always (posedge clk4) /分频比预置 begin case(high,mid,low) h001: origin=4933; /低音1h002: origin=6179; /低音2h003: origin
25、=7294; /低音3h004: origin=7787; /低音4h005: origin=8730; /低音5h006: origin=9565; /低音6h007: origin=10310; /低音7h010: origin=10647; /中音1h020: origin=11272; /中音2h030: origin=11831; /中音3h040: origin=12085; /中音4h050: origin=12556; /中音5h060: origin=12974; /中音6h070: origin=13347; /中音7h100: origin=13515; /高音1h200
26、: origin=13830; /高音2h300: origin=14107; /高音3h400: origin=14236; /高音4h500: origin=14470; /高音5h600: origin=14678; /高音6h700: origin=14865; /高音7h000: origin=16383; /休止 endcase end always (posedge clk4)begin if(counter=52) counter=0; /计时,以实现循环演奏 else counter=counter+1d1; case(counter) /记谱0: high,mid,low=
27、h050; /“祝” 1: high,mid,low=h050; /“你”2: high,mid,low=h060; /“生”3: high,mid,low=h060; /持续2个时钟节拍,以下类似4: high,mid,low=h050; /“日”5: high,mid,low=h050; 6: high,mid,low=h100; /“快”7: high,mid,low=h100; 8: high,mid,low=h070; /“乐”9: high,mid,low=h070; 10: high,mid,low=h070;11: high,mid,low=h070; 12: high,mid
28、,low=h050; /“祝”13: high,mid,low=h050;14: high,mid,low=h050; /“你”15: high,mid,low=h050;16: high,mid,low=h060; /“生”17: high,mid,low=h060; 18: high,mid,low=h050; /“日”19: high,mid,low=h050; 20: high,mid,low=h200; /“快”21: high,mid,low=h200;22: high,mid,low=h100; /“乐”23: high,mid,low=h100;24: high,mid,low
29、=h100; 25: high,mid,low=h100; 26: high,mid,low=h050; /“祝”27: high,mid,low=h050; /“你”28: high,mid,low=h500; /“生” 29: high,mid,low=h500;30: high,mid,low=h300; /“日”31: high,mid,low=h300;32: high,mid,low=h100; /“快”33: high,mid,low=h100;34: high,mid,low=h070; /“乐” 35: high,mid,low=h070; 36: high,mid,low=
30、h060; 37: high,mid,low=h060;38: high,mid,low=h400; /“祝”39: high,mid,low=h400; /“你”40: high,mid,low=h300; /“生” 41: high,mid,low=h300;42: high,mid,low=h100; /“日”43: high,mid,low=h100;44: high,mid,low=h200; /“快”45: high,mid,low=h200;46: high,mid,low=h100; /“乐”47: high,mid,low=h100; 48: high,mid,low=h10
31、0; 49: high,mid,low=h100; 50: high,mid,low=h100;51: high,mid,low=h100;52: high,mid,low=h000;endcase endled_7s u1(high,high_7s); /高音音符显示led_7s u2(mid,mid_7s); /中音音符显示led_7s u3(low,low_7s); /低音音符显示 led_7s u4(tone,tone_7s); /键盘输入音调显示endmodulemodule led_7s(datain,ledout); /7段数码管译码显示模块input 3:0 datain;ou
32、tput reg6:0 ledout;always begincase(datain)0:ledout=7b;1:ledout=7b;2:ledout=7b;3:ledout=7b;4:ledout=7b;5:ledout=7b;6:ledout=7b;7:ledout=7b;8:ledout=7b;9:ledout=7b;default:ledout=7b;endcaseendendmodule3.5 仿真结果在Quartus工程中对以上程序全编译并新建波形仿真图,进行波形仿真,得到手动和自动演奏时的仿真波形。图5 手动演奏仿真波形图图5系手动演奏仿真波形图,从左至右分别是auto为0时按下
33、中音1到中音7键后的波形。tone_7s显示各键按下时的音调,分别显示(无按键输入)、(do)、(re)、(mi)、(fa)、(sol)、(la)、(si)以及stp键按下后的。同时speaker发出不同音阶的声音,可以看到从中音1到中7随着频率的变高,波形的横向宽度也在逐渐变窄。图6 自动演奏仿真波形图一图7 自动演奏仿真波形图二图6和图7系自动演奏仿真波形图,可以看出当auto为1时,开始按着预置的谱曲在演奏音乐。tone_7s一直(0),high_7s,mid_7s和low_7s显示即时的音符。当high_7s,mid_7s和low_7s同时分别显示:、为中音5(“祝”和“你”各半拍), 、为中音6(“生”一拍), 、为中音5(“日”一拍), 、为高音1(“快”一拍), 、为中音7(“乐”两拍)等。综合以上仿真结果得出结论,这次毕业设计达到了既定的设计目标。4.结论此次毕业设计完成,我于其中感触如下:Verilog HDL语言和C语言虽然有着本质的不同,但是有了C语言的学习经验,运用Verilog HDL语言也不是难事。FPGA设计简单,开发时间
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论