基于BASYS2的电子琴设计.docx

上传人:b****5 文档编号:11978247 上传时间:2023-04-16 格式:DOCX 页数:76 大小:544.90KB
下载 相关 举报
基于BASYS2的电子琴设计.docx_第1页
第1页 / 共76页
基于BASYS2的电子琴设计.docx_第2页
第2页 / 共76页
基于BASYS2的电子琴设计.docx_第3页
第3页 / 共76页
基于BASYS2的电子琴设计.docx_第4页
第4页 / 共76页
基于BASYS2的电子琴设计.docx_第5页
第5页 / 共76页
点击查看更多>>
下载资源
资源描述

基于BASYS2的电子琴设计.docx

《基于BASYS2的电子琴设计.docx》由会员分享,可在线阅读,更多相关《基于BASYS2的电子琴设计.docx(76页珍藏版)》请在冰豆网上搜索。

基于BASYS2的电子琴设计.docx

基于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:

--

-----------------------------------------------------------------

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 英语考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1