基于EDA的简易电子琴设计鲍亚文.docx
- 文档编号:27891114
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:22
- 大小:322KB
基于EDA的简易电子琴设计鲍亚文.docx
《基于EDA的简易电子琴设计鲍亚文.docx》由会员分享,可在线阅读,更多相关《基于EDA的简易电子琴设计鲍亚文.docx(22页珍藏版)》请在冰豆网上搜索。
基于EDA的简易电子琴设计鲍亚文
基于EDA的简易电子琴设计
鲍亚文(安庆师范大学物理与电气工程学院安徽安庆246011)
指导老师:
郑江云
摘要:
本设计是一个简易的七音符电子琴,该电子琴可以通过按键输入来控制音调,也可对预置乐曲的自动演奏,同时由数码管显示即时音符。
系统的实现是基于EDA技术,在Quartus软件平台上,借助FPGA目标器件,用硬件描述语言VerilogHDL进行编程并仿真验证。
本设计中的电子琴可操作性好,音符显示直观,声音优美。
关键词:
电子琴,电子设计自动化,VerilogHDL语言
引言
科技发展的日新月异,催生了一系列新奇实用的电子产品。
在这些电子产品中,电子琴早已成为电子乐器行列中的重要一员。
电子琴是人类仿制常规乐器的代表之一,其发明问世极大地丰富了人们的听觉感受,推动了音乐的普及和发展。
在信息化与电子化交织的今天,电子琴作为社会科技与文明的产物,正扮演着音乐领域中不可或缺的角色。
EDA技术的快速发展和成熟,FPGA等数字可编程器件的出现和进步,基于EDA技术的设计也变得愈加简单可行。
基于EDA技术的设计不仅系统可靠性较高,而且能实现较为复杂的功能。
运用EDA软件可方便地在计算机平台上实现设计与仿真,本设计中的电子琴便是基于EDA技术,运用VerilogHDL语言设计完成的。
1EDA概述与音乐知识
1.1EDA技术
1.1.1EDA的发展
EDA(ElectronicDesignAutomation,电子设计自动化)可以认识为在计算机工作平台上,以EDA软件为开发环境,以PLD器件或ASIC专用集成电路为目标器件来设计实现电路系统的一门技术。
EDA技术在逐渐进步,其大致经历了3个发展阶段:
CAD阶段(20世纪70年代至80年代初)、CAE阶段(20世纪80年代初至90年代初)、EDA阶段(20世纪90年代以后)。
[1]
EDA技术在进入21世纪后,得到了不小的进步和发展,突出表现在以下几个方面:
[2]
(1)不断推出在仿真验证和设计两方面都支持标准硬件描述语言的EDA软件,功能更加强大且验证更加高效;
(2)EDA技术使得电子设计成果以自主知识产权(IP)的方式予以确认,提高了设计成果的可重用性;
(3)EDA技术使得电子领域各学科之间的界限更加模糊,互为包容,如模拟和数字、软件和硬件、系统和器件、ASIC和FPGA等;
(4)SoPC(可编程芯片系统)进入实用化阶段;
(5)高速数字信号处理算法可基于FPGA的DSP技术实现。
1.1.2EDA的设计流程
一个完整的EDA设计流程既是自顶向下设计方法的具体实施途径,也是EDA工具软件本身的组成结构。
自顶向下的设计,即Top-down设计,这种设计方法首先从系统设计入手,在顶层进行功能方框图的划分与结构设计。
在功能级仿真纠错,并用硬件描述语言对高层次的系统行为进行描述,然后用综合工具将设计转化为具体门电路网表。
由于设计的主要仿真和调试过程是在高层次完成的,这一方面有利于在早期发现结构设计上的错误,避免设计工作的浪费,同时也减少了逻辑功能仿真的工作量,提高了设计的一次成功率。
EDA设计流程一般包括:
设计输入、综合、布局布线、仿真、编程配置的步骤。
[3]
图1基于FPGA/CPLD器件的数字系统设计流程
(1)设计输入(DesignEntry):
主要为原理图(schematic)输入和HDL文本编辑输入2部分。
(2)综合(Synthesis):
将高级抽象层次的设计描述自动转化为低层次描述。
(3)布局布线:
将综合生成的电路逻辑网表映射到具体的目标器件,并产生最终的可下载文件。
(4)仿真:
包括功能仿真和时序仿真,对设计电路的功能的验证。
(5)编程配置:
把适配后生成的编程文件装入到PLD器件中,CPLD器件的下载称为编程,FPGA器件的下载称为配置。
1.1.3QuartusII设计平台和VerilogHDL语言
本设计的开发工具是QuartusII,采用VerilogHDL语言编程。
QuartusII适合大规模FPGA的开发,是Altera继MAX+plusII后的新一款开发工具。
QuartusII提供了更优化的综合和适配功能,改善了对第三方仿真和分析工具的支持。
它还包括了DSPBuilder、SOPCBuilder等开发工具,支持系统级的开发等。
QuartusII是一款具有标准的EDA工具接口和完善的可视化设计环境的FPGA/CPLD集成开发软件。
设计输入有多种表达方式,最常用的是原理图方式和HDL文本方式。
VerilogHDL是一种硬件描述语言(HDL:
HardwareDescriptionLanguage),以文本形式来描述数字系统硬件的结构和行为的语言。
用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。
[4]VerilogHDL和VHDL是世界上流行的2种硬件描述语言,都是在20世纪80年代中期被开发出来的。
VerilogHDL由GDA公司开发,它是在C语言的基础上发展而来的,但作为一种硬件描述语言和C语言有着本质的区别,Verilog语言概括起来有着如下的一些特点:
(1)适用于可综合的电路设计,也适用于电路和系统的仿真。
(2)能在多个层次上对所设计的系统进行描述,对设计的规模也没有任何限制。
(3)行为描述和结构描述灵活且支持混合建模。
(4)行为描述语句类似于软件高级语言。
(5)内置各种逻辑门和开关级元件。
(6)UDP(用户定义原语)可灵活创建。
1.1.4FPGA器件
FPGA(FieldProgrammableGateArray),现场可编程门阵列,是一种在采用单元型结构的新型PLD器件。
作为ASIC(专用集成电路)领域中的一种半定制电路,FPGA既弥补了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点,成为当前主流的PLD器件之一。
FPGA使用CMOS、SRAM工艺制作,和阵列型PLD结构不同,内部由许多独立的可编程逻辑单元构成,各逻辑单元间可以灵活地相互连接,具有密度高、速度快、编程灵活、可重新配置等优势。
1.2电子琴与相关的音乐知识
EDA技术的成熟,FPGA器件的发展使得基于EDA技术的电子琴设计成为可能。
在计算机上运用EDA软件可以很方便地对所需要实现的电子琴进行设计和仿真。
采用传统方法如单片机设计的电子琴,要求设计人员对硬件非常熟悉,且单片机制作的主控板受制版工艺、布局结构和起器件质量等因素的影响导致抗干扰能力差、故障率高、不易扩展等问题。
EDA技术对于设计人员来说,修改程序可以实现不同的功能,对于设计周期来说节省了时间。
本设计中的电子琴是通过按键控制发音的,系统演奏时能选择手动演奏或是自动演奏一段预置的简短音乐。
为完成该设计,需要了解一些基本的音乐知识理论。
在音乐领域中,简谱和五线谱是人们用来记谱的两种记谱法,简谱相对简易,其又分为字母简谱和数字简谱。
数字简谱以1、2、3、4、5、6、7来表示音阶中的7个基本音级,分别用do,re,mi,fa,sol,la,si来读音。
在一段4/4拍数字简谱中,单独的数字表示一个四分音符,数字下面的横线为减时线,表示四分音符长度减半;数字右面的短横线称为增时线,每加一条则延长一个四分音符时间;数字右面的圆点称为附点,用来延长前面音符时值的一半。
如4/4拍一个四分音符(5)为1拍,则全音符(5---)为4拍,二分音符(5-)为2拍,八分音符(5)为半拍。
在一段数字简谱后面的竖直线为小节,0为休止符。
另外为了标记简谱中的重低音,在数字上方的圆点记为重音,在下方的为低音,单独的数字则是中音。
2.系统分析与方案设计
2.1设计思想与原理框图
设计思想为利用EDA技术对FPGA器件进行配置实现电子琴,系统扫描按键输入信号来选择是手动还是自动演奏,采集的信号转化为分频预置数,数控分频器输出不同音符的频率给扬声器,并由数码管显示当前音符。
CLK-6MHz
分频
CLK-4Hz
图2系统原理框图
2.2原理说明
(1)当演奏者按下7个音调键盘后,在系统基准时钟6MHz下,根据键盘的输入信号分频,产生所需的7个不同音调的频率并二分频输出给speaker,同时由数码管HEX4显示音调。
(2)当自动演奏信号auto为真时,对系统6MHz基准时钟分频,产生一个频率为4Hz的时钟用于谱曲的分频比预置。
6MHz时钟使数控分频器产生曲谱演奏音符的对应频率,再经过一个二分频器输出该频率,最后通过speaker发出该音符的声音,同时由数码管HEX3、HEX2和HEX1分别显示高中低音符。
(3)当auto为0演奏者按下stp键后,speaker不发声,输出始终为0Hz的信号,同时音调数码管均显示0。
3.QuartusII设计过程
3.1自动演奏乐曲
要使用电子琴完成一段音乐的演奏,音调和音长是2个最关键的参数。
根据音乐知识,音调是由频率控制的,音长为该音符持续时间的长短。
在本设计中,乐谱产生电路用来控制音乐的音调和音长。
本设计中曲谱的自动演奏需要在C调中选取从低音1到高音7共21个音阶,这些不同信号的频率都可以由一个基准频率分频得到。
因为各音阶的频率为非整数,而分频系数不能为小数,所以必须对分频系数进行四舍五入。
这样基准频率的选择变得比较重要,基准频率选择较低,分频系数就小,误差大;基准频率选择较高,误差是小了,但是分频系数也大。
综合考虑,选取6MHz的基准频率是可行的。
数控分频器输出的为脉宽极窄的脉冲式信号,为了减少输出的偶次谐波分量,需要在数控分频器和扬声器之间加一个二分频器以均衡其占空比,保证到达扬声器的是对称方波。
二分频器将基准频率二分频,即为3MHz,计算分频系数也就以3MHz为基准频率。
分频系数为基准频率和各音阶频率的比值,例如中音1的频率为523Hz,分频系数为5736,高音7的频率为1976Hz,分频系数为1518。
由于最大分频系数为11450,故采用14位二进制计数器已经足够。
在演奏时,对于不同的分频系数,只需要加载对应的预置数。
采用加载预置数的方法比反馈复零法更节省资源,实现起来也更加简单。
用差值法分频,把初始值214-1=16383和各音阶的分频系数的差值作为预置数即可发出不同频率的音符。
对于乐曲中的休止符,只要将分频系数设为0,初始值为16383即可,此时扬声器不发声。
[6]
表1各音阶频率对应分频系数与预置数(由3Mhz计算得出)
低音
频率/Hz
分频系数
初始值
中音
频率/Hz
分频系数
初始值
高音
频率/Hz
分频系数
初始值
1
262
11450
4933
1
523
5736
10647
1
1046
2868
13515
2
294
10204
6179
2
587
5111
11272
2
1175
2553
13830
3
330
9091
7294
3
659
4552
11831
3
1318
2276
14107
4
349
8596
7787
4
698
4298
12085
4
1397
2147
14236
5
392
7653
8730
5
784
3827
12556
5
1568
1913
14470
6
440
6818
9565
6
80
3409
12974
6
760
1705
14678
7
494
6073
10310
7
988
3036
13347
7
1976
1518
14865
音符的持续时间由乐曲的速度及每个音符的节拍数确定。
通过控制计数器预置数的停留时间,预置数的停留时间长,则音符的停留时间长。
以下是生日歌的C调简谱:
图3生日歌简谱
简谱中,如果将全音符的持续时间设定为1秒,则四分音符为0.25秒,只需要再提供一个4Hz的时钟频率即可产生四分音符的时长。
每个音符的演奏时间都是0.25的整数倍,对于节拍较长的音符,如二分音符在记谱时将该音名连续记录2次,全音符连续记录4次即可。
在编写乐谱程序时记音符的拍数,由于二分频器的存在,一拍就要记为连续的2个时钟节拍。
为了实现乐曲的循环演奏,需要再加一个时长计数器counter,当乐曲演奏结束时能再次重新演奏。
3.2手动按键演奏
本设计中的电子琴且除了能自动演奏一段预置的乐曲外,还能完成手动演奏发出C调的7个中音。
由于自动演奏是在人按下自动演奏键以后进行的,所以设置一个auto来控制是否自动演奏。
当auto为真时,实现预置乐曲的自动演奏,否则扫描按键由人工演奏。
如果自动演奏则按照乐谱,把musicout赋值给speaker。
手动演奏时的音调频率同样需要由系统时钟分频得到,设置一个i以改变分频系数,再对speaker二分频。
各个音调的分频系数以3MHz计算得出,即为表1中从中音1到中音7的分频系数。
如中音1的分频系数应为5736。
相应地,中音1的输出信号程序应该编写成:
doo:
beginif(i>=5736)
begin
speaker=!
speaker;tone=4'b0001;
i<=0;
end
else
i<=i+1'd1;
end
3.3音名显示
音名显示数码管用来显示演奏时对应的音符。
本设计中,用数码管HEX3、HEX2、HEX1分别显示自动演奏时的高中低音符,其中high_7s、mid_7s和low_7s分别为高中低音显示信号;用数码管HEX4显示手动演奏时的音调,tone_7s为键盘演奏音调信号。
采用7段共阳数码管,以a、b、c、d、e、f、g来标记数码管的7个LED显示位,对各个要显示位置加以低电平即可点亮。
本设计中,定义输出reg[6:
0]ledout为显示信号,例如要显示“0”,只要使ledout<=7’b1000000。
借助这些数码管,能够实现演奏的动态显示。
图4共阳数码管原理图
3.4源程序
moduleeorgan(key,clk6m,auto,speaker,tone_7s,high_7s,mid_7s,low_7s);
inputkey,clk6m,auto;//键盘输入,6M基准时钟输入,自动演奏
wire[7:
0]key;//键盘输入信号
output[6:
0]tone_7s;//数码管显示键盘音调
outputregspeaker;
output[6:
0]high_7s;//显示乐曲高音音符
output[6:
0]mid_7s;//显示乐曲中音音符
output[6:
0]low_7s;//显示乐曲低音音符
reg[20:
0]i;
regclk4;
reg[3:
0]high,mid,low,tone;//高中低音信号和键盘音调信号
reg[13:
0]divider,origin;//自动演奏分频系数和初始值
regcarry;
regmusicout;//乐谱输出信号
reg[19:
0]count20;
reg[7:
0]counter;
parameterstp=8'b10000000,//休止
doo=8'b00000001,//do
re=8'b00000010,//re
mi=8'b00000100,//mi
fa=8'b00001000,//fa
sol=8'b00010000,//sol
la=8'b00100000,//la
si=8'b01000000;//si
always@(posedgeclk6m)
begin
if(auto)
speaker<=musicout;//如果automusic为真,输出乐谱
elsebegin//否则判断键盘key的输入
case(key)
stp:
begin
speaker<=0;tone=4'b0000;
i<=0;
end
doo:
begin//do
if(i>=5736)
begin
speaker=!
speaker;tone=4'b0001;
i<=0;
end
else
i<=i+1'd1;
end
re:
begin//re
if(i>=5111)
begin
speaker=!
speaker;tone=4'b0010;
i<=0;
end
else
i<=i+1'd1;
end
mi:
begin//mi
if(i>=4552)
begin
speaker=!
speaker;tone=4'b0011;
i<=0;
end
else
i<=i+1'd1;
end
fa:
begin//fa
if(i>=4298)
begin
speaker=!
speaker;tone=4'b0100;
i<=0;
end
else
i<=i+1'd1;
end
sol:
begin//sol
if(i>=3827)
begin
speaker=!
speaker;tone=4'b0101;
i<=0;
end
else
i<=i+1'd1;
end
la:
begin//la
if(i>=3409)
begin
speaker=!
speaker;tone=4'b0110;
i<=0;
end
else
i<=i+1'd1;
end
si:
begin//si
if(i>=3036)
begin
speaker=!
speaker;tone=4'b0111;
i<=0;
end
else
i<=i+1'd1;
end
default:
begin
speaker<=0;tone=4'b0000;
i<=0;
end
endcase
end
end
always@(posedgeclk6m)//通过置数,改变分频比
beginif(divider==16383)
begincarry<=1;divider<=origin;end
elsebegindivider<=divider+1'd1;carry<=0;end
end
always@(posedgecarry)
begin
musicout<=~musicout;//2分频产生方波信号
end
always@(posedgeclk6m)//从6Mhz得到4hz
begin
if(!
auto)
begincount20<=20'd0;clk4<=0;end
elseif(count20==20'd750000)
begincount20<=20'd0;clk4<=~clk4;end
elsecount20<=count20+20'd1;
end
always@(posedgeclk4)//分频比预置
begincase({high,mid,low})
'h001:
origin<=4933;//低音1
'h002:
origin<=6179;//低音2
'h003:
origin<=7294;//低音3
'h004:
origin<=7787;//低音4
'h005:
origin<=8730;//低音5
'h006:
origin<=9565;//低音6
'h007:
origin<=10310;//低音7
'h010:
origin<=10647;//中音1
'h020:
origin<=11272;//中音2
'h030:
origin<=11831;//中音3
'h040:
origin<=12085;//中音4
'h050:
origin<=12556;//中音5
'h060:
origin<=12974;//中音6
'h070:
origin<=13347;//中音7
'h100:
origin<=13515;//高音1
'h200:
origin<=13830;//高音2
'h300:
origin<=14107;//高音3
'h400:
origin<=14236;//高音4
'h500:
origin<=14470;//高音5
'h600:
origin<=14678;//高音6
'h700:
origin<=14865;//高音7
'h000:
origin<=16383;//休止
endcase
end
always@(posedgeclk4)
beginif(counter==52)counter<=0;//计时,以实现循环演奏
elsecounter<=counter+1'd1;
case(counter)//记谱
0:
{high,mid,low}<='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;//
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 EDA 简易 电子琴 设计 鲍亚文
![提示](https://static.bdocx.com/images/bang_tan.gif)