基于BASYS2的电子琴设计.doc

上传人:laozhun 文档编号:2915650 上传时间:2023-03-03 格式:DOC 页数:72 大小:2.75MB
返回 下载 相关 举报
基于BASYS2的电子琴设计.doc_第1页
第1页 / 共72页
基于BASYS2的电子琴设计.doc_第2页
第2页 / 共72页
基于BASYS2的电子琴设计.doc_第3页
第3页 / 共72页
基于BASYS2的电子琴设计.doc_第4页
第4页 / 共72页
基于BASYS2的电子琴设计.doc_第5页
第5页 / 共72页
点击查看更多>>
资源描述

《基于BASYS2的电子琴设计.doc》由会员分享,可在线阅读,更多相关《基于BASYS2的电子琴设计.doc(72页珍藏版)》请在三一办公上搜索。

1、 硬件 课程设计实验报告课 题: 基于BASYS2的电子琴设计班 级: 电信0907作 者: 刘 睿学 号: U200913771指导老师: 龚 军课设评价:课设成绩:【摘要】本项目要求设计并实现一个基于BASYS2的电子琴,利用BASYS2实验板的拨码开关实现电子琴相应功能的控制,电子琴的输出有两个声道,可独立输出 。该电子琴可外接PS2键盘,实现电子琴按键功能,同时外接VGA显示器实现电子琴的界面。该电子琴还具有存储输入按键值并回放功能。 【关键词】:FPGA、 BASYS2、 电子琴、 PS/2、 VGAAbstract:This project is aimed at designin

2、g an electric piano based on BASYS2. The switch on the BASYS2 will control the function of the electric piano. This piano with two different audio channel, can also memory the keys which have been pressed and replay them. This piano can be connected to a PS/2 keyboard, which plays a role of keys of

3、the piano, and connected to a VGA monitor, which could display the interface of the piano. Key words:FPGA 、BASYS2、 ELECTRIC PIANO、 PS/2、 VGA目 录1.项目描述61.1.项目要求61.2.项目背景61.3.开发工具简介62.设计目标73.硬件描述73.1.开发板73.2.显示器83.3.键盘94.软件描述94.1.系统框图94.2.各模块的功能描述104.2.1.顶层模块的设计104.2.2.键盘模块的设计114.2.3.自动演奏模块的设计114.2.4.音

4、调发生器模块设计114.2.5.数控分频模块的设计114.2.6.数模转换模块的设计124.2.7.界面显示模块的设计125.硬件设计126.软件设计136.1.设计原理136.2.详细设计146.2.1.顶层模块146.2.2.键盘模块196.2.3.自动演奏模块256.2.4.音调发生器模块346.2.5.数控分频模块386.2.6.数模转换模块426.2.7.界面显示模块517.技术报告637.1.界面显示637.2.操作指南646.2.1.供电电源646.2.1.按键功能646.2.1.开关功能647.3.用户体验657.4.代码规范658.遇到的问题658.1.键盘如何实现按键弹起后

5、不再响658.2.VGA显示需要的资源过大709.总结与建议719.1.总结719.2.建议729.3.分工说明721. 项目描述1.1. 项目要求 本项目要求设计并实现一个基于BASYS2的电子琴,利用BASYS2实验板的拨码开关实现电子琴相应功能的控制,该电子琴可外接PS2键盘,实现电子琴按键功能,同时外接VGA显示器实现电子琴的界面。该电子琴还具有存储输入按键值并回放功能,电子琴的输出有两个声道,可独立输出 。1.2. 项目背景本项目作为硬件课程设计课程的训练项目提出,在基本的设计实现基础上,将不断对已有的设计进行进一步的修改和完善,最终完成整个硬件和软件开发过程。FPGA(FieldP

6、rogrammable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。目前以硬件描述语言(Verilog或VHDL)所完成的电路设计,可以经过简单的综合和布局,快速地烧录至FPGA 上进行测试,是现代 IC 设计验证的技术主流。这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。在大多数的FPGA里面,这些可编辑的元件里也

7、包含记忆元件例如触发器(Flipflop)或者其他更加完整的记忆块。了解利用FPGA实现电子琴的基本原理,综合运用所学知识实现一个具有多个模块的模数混合系统,为后续课程学习和工作打下基础。而且实现电子琴也十分有趣,能够加深电子系统在音乐艺术领域的应用。1.3. 开发工具简介Basys2:该开发板是围绕着一个Xilinx Spartan-3E FPGA芯片和一个Atmel AT90USB USB控制器搭建的,它提供了完整、随时可以使用的硬件平台,并且它适合于从基本逻辑器件到复杂控制器件的各种主机电路。Basys2板上集成了大量的I/O设备和FPGA所需的支持电路,让您能够构建无数的设计而不需要其

8、他器件。ISE 13.1_1:ISE是使用XILINX的FPGA的必备的设计工具,它可以完成FPGA开发的全部流程,包括设计输入、仿真、综合、布局布线、生成BIT文件、配置以及在线调试等,功能非常强大。ISE除了我们功能完整,使用方便外,它的设计性能也非常好,拿ISE 9.x来说,其设计性能比其他解决方案平均快30%,它集成的时序收敛流程整合了增强性物理综合优化,提供最佳的时钟布局、更好的封装和时序收敛映射,从而获得更高的设计性能。先进的综合和实现算法将动态功耗降低了10%。Digilent Adept_v2-3-0:为XILINX公司的Digilent开发板下载程序用的软件,能够将ISE生成

9、的.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所示拨码开关电源开关VGA接口PS/2接口音

10、频放大器模块DA模块USB接口图 13.2 显示器显示器通过VGA接口与BASYS2开发板连接,可显示图形化界面,如图2VGA显示器 图 23.3 键盘键盘通过PS/2接口与Basys2开发板相连,用作琴键功能,如图3所示PS/2的键盘图 34. 软件描述4.1. 系统框图 图4 系统组成框图在上述系统组成框图中,没有连线的信号都是需要分配引脚的。Keyboard模块的k_clock信号和k_data信号需要连接到PS/2键盘接口的时钟和数据引脚。Speaker、adc、vgactr模块的时钟信号均要连接到50MHz标准时钟。Vgactr模块的Rst信号和automusic模块的contrl1

11、、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

12、),显示器(vgactr)和数模转换(adc)六个模块组成。图3.1即是顶层的原理框图。乐曲可有键盘的按键输入,也可以内置的乐曲自动播放。由于本次设计了双声道输出,可独立控制它们。可通过外部三个控制信号contrl1、contrl2和contrl3来控制两个声道的不同输出组合。另外recall信号可以控制会放功能。4.2.2键盘模块(keyboard)的设计由于接的是ps/2接口的键盘,所以该模块的第一个功能就是通过ps/2接口协议来读取键盘发送的数据。当键盘不发送数据时,k_clock时钟一直为高。在k_clock时钟的下降沿读取数据即可得到键盘发送的数据包。该模块的第二个功能是通过解析得到

13、的数据包,确定键盘的哪个键被按下,并把该键对应的音符编码信息送给out_data信号输出。4.2.3自动演奏模块(automusic)的设计自动演奏模块的主要作用就是产生音符流的信息。其输出又recall、contrl1、 contrl2 和contrl3四个信号控制,其具体控制组合如下表1所示:表1RecallContrl1Contrl2Contrl3输出1-键盘存储的回放0000键盘输入0001键盘+伴奏0010键盘+原曲0011原曲0100伴奏0111原曲+伴奏本模块还具有存储键盘输入值得功能,在该模块内开辟了一个数组,用于存储以前输入的按键值。然后通过recall信号的控制可以将存储在

14、该数组内的数据输出。4.2.4音调发生器模块(tone)的设计音调发生器的作用是根据输入的音符获得相应音符的分频系数。由于在分频模块(speaker)中,会对50MHz的系统标准时钟进行分频,以产生对应音符频率的输出信号,所以在本模块需要产生相应的分频数。因为分频模块为了所得较大的驱动能力,需要在信号输出之前对其进行2分频处理,所以这里产生的分频数应该考虑到这个2分频的存在。4.2.5数控分频模块(speaker)的设计该模块首先根据输入的分频数对系统标准的50MHz的时钟进行初步分频,然后再进行2分频得到方波震荡输出信号,该信号用于在adc模块中控制正弦波采样值得转换速率。4.2.6 数模转

15、换模块(adc)的设计该模块根据由speaker模块输入的方波震荡信号,按照方波的震荡频率不断将正弦波的采样值送给ADC扩展模块,进行数模转换。4.2.7 界面显示模块(vgactr)的设计该模块将通过VGA接口在显示器上显示电子琴的界面。界面的主要部分显示了21个琴键对应21个音符。VGA协议需要我们不断的给VGA接口的规定引脚送信号,显示器根据这些信号实时地刷新屏幕。该模块依照一个声道输出的音符编码值,会给VGA接口发送不同的信号,使屏幕出现不同的画面。这样就可以达到当输出不同的音符时,显示器的相应琴键变红。5. 硬件设计本项目的开发平台是BASYS2开发板,该开发板的核心是FPGA芯片,

16、它还有很多的外围扩展接口或电路。我们在本次设计中用到的接口主要有外部晶振,PS/2接口,VGA接口,IO扩展接口,拨码开关。外部晶振可产生50MHz的标准时钟,它用于给内部各模块提供时钟基准,使它们有序地协调合作。PS/2接口可连接至PS/2键盘,键盘作为电子琴的琴键功能,可通过键盘上的按键为电子琴输入不同的音符。其对应关系如表2所示表2键名QWERTYU音符低音1低音2低音3低音4低音5低音6低音7键名1234567音符中音1中音2中音3中音4中音5中音6中音7键名ASDFGHJ音符高音1高音2高音3高音4高音5高音6高音7VGA接口可连接至VGA显示器,用于显示电子琴的界面,FPGA可通过

17、向VGA接口信号不断地输出不同的数据,来控制显示器显示不同的画面。拨码开关用于控制电子琴,可使其在不同的工作模式下切换。IO扩展接口可以方便地连接外部的扩展模块,如DA模块和音频放大模块,从而扩展BASYS2开发板的功能。图5即为完整的硬件连接电路。BASYS2开发板显示器音响键盘图 56. 软件设计6.1. 设计原理本项目不仅包含硬件的设计,还包含软件的设计。软件的设计是采用VHDL语言,在ISE集成开发环境下编写完成。整个流程主要包括Edit、Synthesize、Implement Design和Generate Programming file四大步骤。如果有必要也可以对设计进行仿真(

18、Simulation),它可以帮助我们尽快查出设计中的错误,并指导我们进行修改。生成的Programming file可以用Digilent Adept软件下载到开发板上,这样开发板就可以运行设计的程序了。软件共包含7个模块,其中有一个是顶层模块,另外六个是子模块。每个模块都被封装成一个“黑匣子”,外部只需要知道模块对外的接口特性就可以正确地调用它们。由于各模块的主要功能已在前文描述过,因此这里直接介绍代码的具体实现。6.2. 详细设计本人主要负责整个软件架构的设计和具体代码的编写,因此下面将逐一介绍各模块的具体代码的实现。6.2.1. 顶层模块(top)- Company: - Engine

19、er: - - Create Date: 14:53:05 05/20/2012 - Design Name: - Module Name: top - Behavioral - Project Name: - Target Devices: - Tool versions: - Description: - Dependencies: - Revision: - Revision 0.01 - File Created- Additional Comments: -library IEEE;use IEEE.STD_LOGIC_1164.ALL;use ieee.std_logic_unsi

20、gned.all;use ieee.std_logic_arith.all;- Uncomment the following library declaration if using- arithmetic functions with Signed or Unsigned values-use IEEE.NUMERIC_STD.ALL;- Uncomment the following library declaration if instantiating- any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VC

21、omponents.all;entity top isport(clk_50MHz : in std_logic; -系统50MHz标准时钟输入k_data : in std_logic; -PS/2键盘的数据信号k_clock : in std_logic; -PS/2键盘的时钟信号contrl1,contrl2,contrl3: in std_logic; -控制信号,用于控制电子琴各模式间的切换recall: in std_logic; -高则回放存储的音乐Rst : in STD_LOGIC; -用于VGA的复位,其为低电平则屏幕显示Red : out STD_LOGIC; -VGA的

22、红颜色线 Green : out STD_LOGIC; -VGA的绿颜色线 Blue : out STD_LOGIC; -VGA的蓝颜色线 H_Sync : out STD_LOGIC; -VGA行同步 V_Sync : out STD_LOGIC; -VGA场同步D1 : out STD_LOGIC; -DA模块的通道一的数据输入 D2 : out STD_LOGIC; -DA模块的通道二的数据输入 CLK_OUT : out STD_LOGIC; -DA模块的时钟 nSYNC : out STD_LOGIC -DA模块的同步信号);end top;architecture Behavior

23、al of top iscomponent automusicport(clk_50MHz: in std_logic; -系统50MHz标准时钟输入key_data : in std_logic_vector(5 downto 0); -键盘输入的音符代码contrl1,contrl2,contrl3: in std_logic; -控制信号,用于控制电子琴各模式间的切换recall: in std_logic; -控制存储回放的音乐index_output1:out std_logic_vector(5 downto 0);-输出的音符代码index_output2:out std_log

24、ic_vector(5 downto 0)-输出的音符代码);end component;component vgactrPort ( Clk : in STD_LOGIC; -系统50MHz标准时钟输入 Rst : in STD_LOGIC; -控制VGA复位的信号,为低屏幕才显示正常的画面contrl: in STD_LOGIC_VECTOR(5 downto 0); -用于控制VGA显示不同图片的信号 Red : out STD_LOGIC; -VGA的红颜色线 Green : out STD_LOGIC; -VGA的绿颜色线 Blue : out STD_LOGIC; -VGA的蓝颜色

25、线 H_Sync : out STD_LOGIC; -VGA的行同步线 V_Sync : out STD_LOGIC); -VGA的场同步线end component;component keyboardport(k_data : in std_logic; -PS/2键盘的数据信号k_clock: in std_logic; -PS/2键盘的时钟信号out_data : out std_logic_vector(5 downto 0) -该模块输出的音符编码);end component;component toneport(index1 : in std_logic_vector(5 do

26、wnto 0); -音符输入index2 : in std_logic_vector(5 downto 0); -音符输入div1: out integer range 0 to 131072;-div表示某音符的分频系数(2分频前)div2: out integer range 0 to 131072-div表示某音符的分频系数(2分频前));end component;component speaker port(div1: in integer range 0 to 131072; -div表示某音符的分频系数(2分频前)div2: in integer range 0 to 13107

27、2; -div表示某音符的分频系数(2分频前)clk_50MHz : in std_logic;-clk_50MHz表示系统的50MHz标准时钟clk_output1: out std_logic;-clk_output输出给扬声器的信号clk_output2: out std_logic-clk_output输出给扬声器的信号);end component;component adcPort ( clk_50MHz : in STD_LOGIC; -系统50MHz标准时钟输入 clk_input1: in std_logic; -通道1的方波震荡 clk_input2: in std_log

28、ic; -通道2的方波震荡 D1 : out STD_LOGIC; -通道1的数据输出给扩展DA模块 D2 : out STD_LOGIC; -通道2的数据输出给扩展DA模块 CLK_OUT : out STD_LOGIC; -输出给扩展DA模块的时钟信号 nSYNC : out STD_LOGIC -输出给扩展DA模块的同步信号 ); end component;signal div1: integer range 0 to 131072; -通道1的分频系数signal div2: integer range 0 to 131072;-通道1的分频系数signal key_data : s

29、td_logic_vector(5 downto 0); signal index1 : std_logic_vector(5 downto 0); -通道1的音符编码signal index2 : std_logic_vector(5 downto 0);-通道2的音符编码signal clk_output1 : std_logic; -通道1的方波输出给ad模块signal clk_output2 : std_logic;-通道2的方波输出给ad模块beginu0: keyboard port map(k_data,k_clock,key_data);u1: automusic port

30、map(clk_50MHz,key_data,contrl1,contrl2,contrl3,recall,index1,index2);u2: tone port map(index1,index2,div1,div2);u3: speaker port map(div1,div2, clk_50MHz,clk_output1,clk_output2);u4: vgactr port map(clk_50MHz,Rst,index1,Red,Green,Blue,H_Sync,V_Sync);u5: adc port map(clk_50MHz,clk_output1,clk_output2

31、,D1,D2,CLK_OUT,nSYNC);end Behavioral;6.2.2 键盘模块(keyboard)- Company: - Engineer: - - Create Date: 14:54:25 05/20/2012 - Design Name: - Module Name: keyboard - Behavioral - Project Name: - Target Devices: - Tool versions: - Description: - Dependencies: - Revision: - Revision 0.01 - File Created- Addit

32、ional Comments: - Uncomment the following library declaration if using- arithmetic functions with Signed or Unsigned values-use IEEE.NUMERIC_STD.ALL;- Uncomment the following library declaration if instantiating- any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;- Compan

33、y: - Engineer: - - Create Date: 18:43:04 05/19/2012 - Design Name: - Module Name: top - Behavioral - Project Name: - Target Devices: - Tool versions: - Description: - Dependencies: - Revision: - Revision 0.01 - File Created- Additional Comments: -library IEEE;use IEEE.STD_LOGIC_1164.ALL;use ieee.std

34、_logic_unsigned.all;use ieee.std_logic_arith.all;- Uncomment the following library declaration if using- arithmetic functions with Signed or Unsigned values-use IEEE.NUMERIC_STD.ALL;- Uncomment the following library declaration if instantiating- any Xilinx primitives in this code.-library UNISIM;-us

35、e UNISIM.VComponents.all;entity keyboard isport(k_data : in std_logic; -PS/2键盘的数据信号k_clock: in std_logic; -PS/2键盘的时钟信号out_data : out std_logic_vector(5 downto 0) -输出的音符编码);end keyboard;architecture Behavioral of keyboard issignal tempdata : std_logic_vector(11 downto 0) :=000000000000; -tempdata用于暂存

36、从键盘接收到的每帧数据包signal count,count1 : integer range 0 to 11 :=0; -两个计数信号signal datascan,previous_data: std_logic_vector(7 downto 0); -datascan为从键盘接收到的8位通码或断码,previous_data为前一次从键盘接收到的8位通码或断码signal out_data_temp: std_logic_vector(5 downto 0); -输出音符编码的缓存信号signal chang_clk: std_logic :=0; -在该信号的上升沿执行判断并确定输出

37、的编码值begin out_data=out_data_temp; -将输出缓存信号赋给该模块的输出信号process(k_clock)beginif(k_clock event and k_clock=0) then -在PS/2时钟信号的下降沿将连续从PS/2数据信号接收到得每帧数据包的11位数据寄-存缓存至tempdata信号if(count=10) then -count=0;datascan=tempdata(8 downto 1); -在count=10,即接收完一帧数据时,将8位数据有用的数据给datascanelse count=count+1;tempdata(count)=

38、k_data;end if;end if;-if(k_clock event and k_clock=1) then -在PS/2时钟信号的上升沿,将count1计数信号从0开始不断加1if(count1=10) then -当计数到每帧数据包的最后一个上升沿时,将datascan的值赋给previous_datacount1=0; -并在此时制造一个chang_clk的上升沿previous_data=datascan; chang_clk=1;else count1=count1+1;chang_clk=0;end if;end if;end process;process(chang_c

39、lk)beginif(chang_clk event and chang_clk=1) then -在chang_clk的上升沿出现时执行下面的判断if (not (datascan=previous_data) and (datascan=11110000)or (previous_data=11110000) then-PS/2键盘按键弹起时会发送一个断码再加上一个通码,断码的值永远是0xF0。当datascan-和previous_data不相等时,只可能出现在两种情况中-一种是在键盘弹起时,因为会出现断码,所以这个该键的断码和前后发送的该键的通码都-不同。另一种情况是当按下一个键并弹起

40、后再按下另一个键时会出现该-后面一个键的第一个通码与前面一个键发送的最后一次通码不同。-由于我们只希望在按键弹起的那种情况下使out_data_temp变为0,即不发出任何声音。-所以我们在判断时加上了另外的条件- (datascan=11110000)or (previous_data=11110000)这个条件对应按键弹起会发出-断码的情况:当datascan为0xF0时,说明正在接收的数据包为断码数据包;当-previous_data为0xF0时,说明前一个接收的数据包为断码,这都对应于一个按键-弹起时,PS/2协议所规定的行为。out_data_temp out_data_temp out_data_temp out_data_temp out_data_temp out_data_temp=000101; -键盘按下字符T表示低音5when

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

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号