基于BASYS2的电子琴设计.docx
《基于BASYS2的电子琴设计.docx》由会员分享,可在线阅读,更多相关《基于BASYS2的电子琴设计.docx(76页珍藏版)》请在冰豆网上搜索。
基于BASYS2的电子琴设计
课题:
基于BASYS2的电子琴设计
【摘要】
本项目要求设计并实现一个基于BASYS2的电子琴,利用BASYS2实验板的拨码开关实现电子琴相应功能的控制,电子琴的输出有两个声道,可独立输出。
该电子琴可外接PS2键盘,实现电子琴按键功能,同时外接VGA显示器实现电子琴的界面。
该电子琴还具有存储输入按键值并回放功能。
【关键词】:
FPGA、BASYS2、电子琴、PS/2、VGA
Abstract:
Thisprojectisaimedatdesigningan electricpianobasedonBASYS2.TheswitchontheBASYS2willcontrolthefunctionoftheelectricpiano.Thispianowithtwodifferentaudiochannel,canalsomemorythekeyswhichhavebeenpressedandreplaythem.ThispianocanbeconnectedtoaPS/2keyboard,whichplaysaroleofkeysofthepiano,andconnectedtoaVGAmonitor,whichcoulddisplaytheinterfaceofthepiano.
Keywords:
FPGA、BASYS2、ELECTRICPIANO、PS/2、VGA
1.项目描述
1.1.项目要求
本项目要求设计并实现一个基于BASYS2的电子琴,利用BASYS2实验板的拨码开关实现电子琴相应功能的控制,该电子琴可外接PS2键盘,实现电子琴按键功能,同时外接VGA显示器实现电子琴的界面。
该电子琴还具有存储输入按键值并回放功能,电子琴的输出有两个声道,可独立输出。
1.2.项目背景
本项目作为《硬件课程设计》课程的训练项目提出,在基本的设计实现基础上,将不断对已有的设计进行进一步的修改和完善,最终完成整个硬件和软件开发过程。
FPGA(Field-ProgrammableGateArray),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。
它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
目前以硬件描述语言(Verilog 或 VHDL)所完成的电路设计,可以经过简单的综合和布局,快速地烧录至FPGA上进行测试,是现代IC设计验证的技术主流。
这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。
在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器(Flip-flop)或者其他更加完整的记忆块。
了解利用FPGA实现电子琴的基本原理,综合运用所学知识实现一个具有多个模块的模数混合系统,为后续课程学习和工作打下基础。
而且实现电子琴也十分有趣,能够加深电子系统在音乐艺术领域的应用。
1.3.开发工具简介
Basys2:
该开发板是围绕着一个XilinxSpartan-3EFPGA芯片和一个AtmelAT90USBUSB控制器搭建的,它提供了完整、随时可以使用的硬件平台,并且它适合于从基本逻辑器件到复杂控制器件的各种主机电路。
Basys2板上集成了大量的I/O设备和FPGA所需的支持电路,让您能够构建无数的设计而不需要其他器件。
ISE13.1_1:
ISE是使用XILINX的FPGA的必备的设计工具,它可以完成FPGA开发的全部流程,包括设计输入、仿真、综合、布局布线、生成BIT文件、配置以及在线调试等,功能非常强大。
ISE除了我们功能完整,使用方便外,它的设计性能也非常好,拿ISE9.x来说,其设计性能比其他解决方案平均快30%,它集成的时序收敛流程整合了增强性物理综合优化,提供最佳的时钟布局、更好的封装和时序收敛映射,从而获得更高的设计性能。
先进的综合和实现算法将动态功耗降低了10%。
DigilentAdept_v2-3-0:
为XILINX公司的Digilent开发板下载程序用的软件,能够将ISE生成的.bit文件烧写至FPGA中。
2.设计目标
基本功能:
1)具有使用数字键产生“1,2,3,4,5,6,7”对应音符的电子琴功能;
2)利用BASYS2实验板上的数码管实现电子琴当前按键发音音符的显示
扩展功能:
1)利用BASYS2实验板的拨码开关实现电子琴音调、音阶和幅度的调整或者其他的控制功能;
2)外接PS2键盘,实现电子琴按键功能;
3)通过VGA输出接口实现电子琴界面。
4)特定音乐的自动播放;
5)两声道独立输出;
6)存储历史按键值,并回放。
3.硬件描述
3.1开发板
本次硬件课设采用的是XILINX的BASYS2开发板,其结构如图1所示
图1
3.2显示器
显示器通过VGA接口与BASYS2开发板连接,可显示图形化界面,如图2
图2
3.3键盘
键盘通过PS/2接口与Basys2开发板相连,用作琴键功能,如图3所示
图3
4.软件描述
4.1.系统框图
图4系统组成框图
在上述系统组成框图中,没有连线的信号都是需要分配引脚的。
Keyboard模块的k_clock信号和k_data信号需要连接到PS/2键盘接口的时钟和数据引脚。
Speaker、adc、vgactr模块的时钟信号均要连接到50MHz标准时钟。
Vgactr模块的Rst信号和automusic模块的contrl1、contrl2、contrl3、recall信号,都是控制信号,需连接到外部的拨码开关。
Vgactr模块的输出信号需连接至开发板的BASYS2开发板的VGA接口,adc模块的输出信号连接至外部IO接口,该IO口再与AD扩展模块相连。
4.2.各模块的功能描述
本项目工程共分为7个模块,它们相互联系以共同完成电子琴的功能。
顶层模块为top,其余子模块有keyboard、automusic、tone、speaker、vgactr和adc模块。
4.2.1顶层模块(top)的设计
顶层模块由乐曲自动演奏(automusic)、键盘输入(keyboard)、音调发生器(tone)和分频器(speaker),显示器(vgactr)和数模转换(adc)六个模块组成。
图3.1即是顶层的原理框图。
乐曲可有键盘的按键输入,也可以内置的乐曲自动播放。
由于本次设计了双声道输出,可独立控制它们。
可通过外部三个控制信号contrl1、contrl2和contrl3来控制两个声道的不同输出组合。
另外recall信号可以控制会放功能。
4.2.2键盘模块(keyboard)的设计
由于接的是ps/2接口的键盘,所以该模块的第一个功能就是通过ps/2接口协议来读取键盘发送的数据。
当键盘不发送数据时,k_clock时钟一直为高。
在k_clock时钟的下降沿读取数据即可得到键盘发送的数据包。
该模块的第二个功能是通过解析得到的数据包,确定键盘的哪个键被按下,并把该键对应的音符编码信息送给out_data信号输出。
4.2.3自动演奏模块(automusic)的设计
自动演奏模块的主要作用就是产生音符流的信息。
其输出又recall、contrl1、contrl2和contrl3四个信号控制,其具体控制组合如下表1所示:
表1
Recall
Contrl1
Contrl2
Contrl3
输出
1
-
-
-
键盘存储的回放
0
0
0
0
键盘输入
0
0
0
1
键盘+伴奏
0
0
1
0
键盘+原曲
0
0
1
1
原曲
0
1
0
0
伴奏
0
1
1
1
原曲+伴奏
本模块还具有存储键盘输入值得功能,在该模块内开辟了一个数组,用于存储以前输入的按键值。
然后通过recall信号的控制可以将存储在该数组内的数据输出。
4.2.4音调发生器模块(tone)的设计
音调发生器的作用是根据输入的音符获得相应音符的分频系数。
由于在分频模块(speaker)中,会对50MHz的系统标准时钟进行分频,以产生对应音符频率的输出信号,所以在本模块需要产生相应的分频数。
因为分频模块为了所得较大的驱动能力,需要在信号输出之前对其进行2分频处理,所以这里产生的分频数应该考虑到这个2分频的存在。
4.2.5数控分频模块(speaker)的设计
该模块首先根据输入的分频数对系统标准的50MHz的时钟进行初步分频,然后再进行2分频得到方波震荡输出信号,该信号用于在adc模块中控制正弦波采样值得转换速率。
4.2.6数模转换模块(adc)的设计
该模块根据由speaker模块输入的方波震荡信号,按照方波的震荡频率不断将正弦波的采样值送给ADC扩展模块,进行数模转换。
4.2.7界面显示模块(vgactr)的设计
该模块将通过VGA接口在显示器上显示电子琴的界面。
界面的主要部分显示了21个琴键对应21个音符。
VGA协议需要我们不断的给VGA接口的规定引脚送信号,显示器根据这些信号实时地刷新屏幕。
该模块依照一个声道输出的音符编码值,会给VGA接口发送不同的信号,使屏幕出现不同的画面。
这样就可以达到当输出不同的音符时,显示器的相应琴键变红。
5.硬件设计
本项目的开发平台是BASYS2开发板,该开发板的核心是FPGA芯片,它还有很多的外围扩展接口或电路。
我们在本次设计中用到的接口主要有外部晶振,PS/2接口,VGA接口,IO扩展接口,拨码开关。
外部晶振可产生50MHz的标准时钟,它用于给内部各模块提供时钟基准,使它们有序地协调合作。
PS/2接口可连接至PS/2键盘,键盘作为电子琴的琴键功能,可通过键盘上的按键为电子琴输入不同的音符。
其对应关系如表2所示
表2
键名
Q
W
E
R
T
Y
U
音符
低音1
低音2
低音3
低音4
低音5
低音6
低音7
键名
1
2
3
4
5
6
7
音符
中音1
中音2
中音3
中音4
中音5
中音6
中音7
键名
A
S
D
F
G
H
J
音符
高音1
高音2
高音3
高音4
高音5
高音6
高音7
VGA接口可连接至VGA显示器,用于显示电子琴的界面,FPGA可通过向VGA接口信号不断地输出不同的数据,来控制显示器显示不同的画面。
拨码开关用于控制电子琴,可使其在不同的工作模式下切换。
IO扩展接口可以方便地连接外部的扩展模块,如DA模块和音频放大模块,从而扩展BASYS2开发板的功能。
图5即为完整的硬件连接电路。
图5
6.软件设计
6.1.设计原理
本项目不仅包含硬件的设计,还包含软件的设计。
软件的设计是采用VHDL语言,在ISE集成开发环境下编写完成。
整个流程主要包括Edit、Synthesize、ImplementDesign和GenerateProgrammingfile四大步骤。
如果有必要也可以对设计进行仿真(Simulation),它可以帮助我们尽快查出设计中的错误,并指导我们进行修改。
生成的Programmingfile可以用DigilentAdept软件下载到开发板上,这样开发板就可以运行设计的程序了。
软件共包含7个模块,其中有一个是顶层模块,另外六个是子模块。
每个模块都被封装成一个“黑匣子”,外部只需要知道模块对外的接口特性就可以正确地调用它们。
由于各模块的主要功能已在前文描述过,因此这里直接介绍代码的具体实现。
6.2.详细设计
本人主要负责整个软件架构的设计和具体代码的编写,因此下面将逐一介绍各模块的具体代码的实现。
6.2.1.顶层模块(top)
----------------------------------------------------------------------------------
--Company:
--Engineer:
--
--CreateDate:
14:
53:
0505/20/2012
--DesignName:
--ModuleName:
top-Behavioral
--ProjectName:
--TargetDevices:
--Toolversions:
--Description:
--
--Dependencies:
--
--Revision:
--Revision0.01-FileCreated
--AdditionalComments:
--
----------------------------------------------------------------------------------
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
--Uncommentthefollowinglibrarydeclarationifusing
--arithmeticfunctionswithSignedorUnsignedvalues
--useIEEE.NUMERIC_STD.ALL;
--Uncommentthefollowinglibrarydeclarationifinstantiating
--anyXilinxprimitivesinthiscode.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entitytopis
port(
clk_50MHz:
instd_logic;--系统50MHz标准时钟输入
k_data:
instd_logic;--PS/2键盘的数据信号
k_clock:
instd_logic;--PS/2键盘的时钟信号
contrl1,contrl2,contrl3:
instd_logic;--控制信号,用于控制电子琴各模式间的切换
recall:
instd_logic;--高则回放存储的音乐
Rst:
inSTD_LOGIC;--用于VGA的复位,其为低电平则屏幕显示
Red:
outSTD_LOGIC;--VGA的红颜色线
Green:
outSTD_LOGIC;--VGA的绿颜色线
Blue:
outSTD_LOGIC;--VGA的蓝颜色线
H_Sync:
outSTD_LOGIC;--VGA行同步
V_Sync:
outSTD_LOGIC;--VGA场同步
D1:
outSTD_LOGIC;--DA模块的通道一的数据输入
D2:
outSTD_LOGIC;--DA模块的通道二的数据输入
CLK_OUT:
outSTD_LOGIC;--DA模块的时钟
nSYNC:
outSTD_LOGIC--DA模块的同步信号
);
endtop;
architectureBehavioraloftopis
componentautomusic
port(
clk_50MHz:
instd_logic;--系统50MHz标准时钟输入
key_data:
instd_logic_vector(5downto0);--键盘输入的音符代码
contrl1,contrl2,contrl3:
instd_logic;--控制信号,用于控制电子琴各模式间的切换
recall:
instd_logic;--控制存储回放的音乐
index_output1:
outstd_logic_vector(5downto0);--输出的音符代码
index_output2:
outstd_logic_vector(5downto0)--输出的音符代码
);endcomponent;
componentvgactr
Port(Clk:
inSTD_LOGIC;--系统50MHz标准时钟输入
Rst:
inSTD_LOGIC;--控制VGA复位的信号,为低屏幕才显示正常的画面
contrl:
inSTD_LOGIC_VECTOR(5downto0);--用于控制VGA显示不同图片的信号
Red:
outSTD_LOGIC;--VGA的红颜色线
Green:
outSTD_LOGIC;--VGA的绿颜色线
Blue:
outSTD_LOGIC;--VGA的蓝颜色线
H_Sync:
outSTD_LOGIC;--VGA的行同步线
V_Sync:
outSTD_LOGIC);--VGA的场同步线
endcomponent;
componentkeyboard
port(
k_data:
instd_logic;--PS/2键盘的数据信号
k_clock:
instd_logic;--PS/2键盘的时钟信号
out_data:
outstd_logic_vector(5downto0)--该模块输出的音符编码
);
endcomponent;
componenttone
port(
index1:
instd_logic_vector(5downto0);--音符输入
index2:
instd_logic_vector(5downto0);--音符输入
div1:
outintegerrange0to131072;--div表示某音符的分频系数(2分频前)
div2:
outintegerrange0to131072--div表示某音符的分频系数(2分频前)
);
endcomponent;
componentspeaker
port(
div1:
inintegerrange0to131072;--div表示某音符的分频系数(2分频前)
div2:
inintegerrange0to131072;--div表示某音符的分频系数(2分频前)
clk_50MHz:
instd_logic;--clk_50MHz表示系统的50MHz标准时钟
clk_output1:
outstd_logic;--clk_output输出给扬声器的信号
clk_output2:
outstd_logic--clk_output输出给扬声器的信号
);
endcomponent;
componentadc
Port(clk_50MHz:
inSTD_LOGIC;--系统50MHz标准时钟输入
clk_input1:
instd_logic;--通道1的方波震荡
clk_input2:
instd_logic;--通道2的方波震荡
D1:
outSTD_LOGIC;--通道1的数据输出给扩展DA模块
D2:
outSTD_LOGIC;--通道2的数据输出给扩展DA模块
CLK_OUT:
outSTD_LOGIC;--输出给扩展DA模块的时钟信号
nSYNC:
outSTD_LOGIC--输出给扩展DA模块的同步信号
);
endcomponent;
signaldiv1:
integerrange0to131072;--通道1的分频系数
signaldiv2:
integerrange0to131072;--通道1的分频系数
signalkey_data:
std_logic_vector(5downto0);
signalindex1:
std_logic_vector(5downto0);--通道1的音符编码
signalindex2:
std_logic_vector(5downto0);--通道2的音符编码
signalclk_output1:
std_logic;--通道1的方波输出给ad模块
signalclk_output2:
std_logic;--通道2的方波输出给ad模块
begin
u0:
keyboardportmap(k_data,k_clock,key_data);
u1:
automusicportmap(clk_50MHz,key_data,contrl1,contrl2,contrl3,recall,index1,index2);
u2:
toneportmap(index1,index2,div1,div2);
u3:
speakerportmap(div1,div2,clk_50MHz,clk_output1,clk_output2);
u4:
vgactrportmap(clk_50MHz,Rst,index1,Red,Green,Blue,H_Sync,V_Sync);
u5:
adcportmap(clk_50MHz,clk_output1,clk_output2,D1,D2,CLK_OUT,nSYNC);
endBehavioral;
6.2.2键盘模块(keyboard)
----------------------------------------------------------------------------------
--Company:
--Engineer:
--
--CreateDate:
14:
54:
2505/20/2012
--DesignName:
--ModuleName:
keyboard-Behavioral
--ProjectName:
--TargetDevices:
--Toolversions:
--Description:
--
--Dependencies:
--
--Revision:
--Revision0.01-FileCreated
--AdditionalComments:
--
-----------------------------------------------------------------