华中科技大学电子与信息工程系
华中科技大学电子与信息工程系
硬件课程设计总结报告
项目名称: 电子琴音乐游戏机设计
团队成员: 通信中英0901 班 段圣宇
指导教师: 龚军
月
电子琴音乐游戏机设计
摘 要:如今市面上有许许多多的音乐类游戏,玩法非常简单,即在对应音符出现的同时,按下对应音符按键,但这些游戏现在都只出现在电脑或游戏机上。我们设计并制作一款基于BASYS2的拥有游戏功能的电子琴,它除了能实现基本的电子琴功能外,还配有可视化的游戏界面,让不懂音乐的人也能在娱乐的同时演奏出动人的旋律。
关键词:游戏 BASYS2 可视化界面 电子琴
Abstract: There are many music games, whose gameplay is very simple-in the corresponding notes at the same time, press the corresponding note buttons. However, these games now only appear on the computer or video game console. We have designed and made a keyboard piano with the game features, which in addition to basic keyboard functions, comes with a visualization of the game interface, which make then people who do not understand music at all can also have fun and play melody.
Key Words: game Basys2 visualization
keyboard
图1 电子琴实物图
目录
一 概述 ………………………………………………………………..4
二 设计目标……………………………………………………………..4
三 团队组成与任务分工………………………………………………..6
四 系统总体设计………………………………………………………..6
1 总体设计思路……………………………………………………..6 2 主要器件及连接…………………………………………………..7 3 软件模块划分及整合……………………………………………..9 4 各模块实现方法及参数计算……………………………………10 4.1发声模块…………………………………………………....10 4.2 PS2键盘驱动……………………………………………….12 1)PS2接口介绍…………………………………………...12 2)PS2接口引脚…………………………………………...12 3)设计思路及原理………………………………………..13 4.3 VGA信号发生器…………………………………………...14
五 软件仿真及硬件测试结果………………………………………....15
1 PS2键盘软件仿真……………………………………………......15 2 硬件测试结果……………………………………………………17
六 心得体会及项目总结………………………………………………17
七 致谢………………………………………………………………....18
八 参考文献……………………………………………………………18
九 附录…………………………………………………………………19
一. 概述
几乎所有的人对于音乐都有一种自然而然的喜好,音乐使人愉悦。但对于一个不懂音乐的人来说,要使用电子琴熟练的演奏一首歌曲是一件比较困难的事情。而通过这款具有游戏功能的电子琴,不论是有没有真正学过音乐的人都可以演奏出动听的音乐,使用者只需对着显示屏上根据每个节奏跳出的与音符按键对应的图标按下按键就可以通过扬声器或者耳机发出相应旋律。
本系统以Xilinx FPGA为开发平台,以Digilent Basys2开发板为核心硬件来实现。大体可分为电子琴基本功能模块与音乐游戏模块两个部分,每个部分均包含了按键输入、音频输出及VGA显示等基本模块。
二. 设计目标
基本功能:
1). 键盘通过PS/2端口与BASYS2开发板连接,键盘上按键A、S、D、F、J、K、L分别对应DO、RE、MI、FA、SO、LA、SI七个音,在发出声音的同时,开发板上对应LED指示灯亮;
2). 按键G、空格、H选择音调,共三个八度,G键选择最低音,空格选择中音,H键为低音。按下音调控制按键的同时,开发板会将此时的音调以数字形式显示在七段数码管上:“1”代表低音,“2”为中音,“3”表示高音;
3). 歌曲自动播放功能。特定音乐的自动播放,同时能通过开发板上的按键开关来升高和降低播放音乐的音调;
4). 通过开发板滑动开关来选择电子琴当前工作模式,包括Free-Play自由演奏模式及Auto-Play自动播放模式。当模式选择错误时,开发板上所有LED闪烁,并会发出报警音;
5). 通过VGA接口在LCD显示屏上根据当前工作模式显示特定界面。未选择任何模式时,显示一个动态的开机画面;Free-Play模式及Auto-Play模式下,在显示屏上显示模拟真实电子琴键盘的界面,当对应键按下输出对应音符时,界面上的琴键同步发生变化,如下图所示:
图2 电子琴基本功能界面
扩展功能(游戏功能):
1). 游戏模式下,界面除了上述的电子琴键盘,其对应按键上还有一条用以显示当前该音符状态的状态条。通过各状态条位置的改变,确定当前应输出的音符;通过状态条颜色的不同,确定当前输出音符的音调。如下图所示:
图3 电子琴游戏模式界面
2). 开发板数码管显示玩家至此时演奏的正确音符数。
* 由于Basys2开发板FPGA内部资源较少,而游戏模式下其逻辑又较复杂,多重IF嵌套,导致基本功能与扩展功能不能在同一工程下,故制作了两个工程,分别生成基本功能及游戏功能的比特流文件烧录进开发板。
三. 团队组成与任务分工
团队组成:
任务分工:
段圣宇:主要负责VGA显示的设计与编写。其中包括VGA信号发生器的编写,开
机画面及其他界面设计与实现,特定歌曲在不同模式下的实时显示等; 曹煜:主要负责PS2键盘输入功能的编写,编写PS2键盘驱动程序。同时进行资
料搜集、报告撰写等工作;
许晗杰:主要负责电子琴发声功能模块的编写。
其中包括通过不同分频系数的分
频器实现不同音符、音调的输出,特定音乐的代码转换。同时负责演示
视频的录制及剪辑工作。
四. 系统总体设计
1. 总体设计思路
1.首先得到各音符标称的频率值,如下表所示,由程序调控,使开发板能通过一个扩展口输出指定频率的信号,经由音频放大器,从而输出对应音阶的音频信号;
通过对各个音符频率的加倍及减半,可以得到不同音调的音阶。同时设定一个停止按键,使输出的持续频率波停止,从而终止该音符的发声;
2.编写PS2键盘驱动程序,并建立键入字符与输出频率之间的映射表,从而实现PS2按键控制输出音符及选择音调的功能;
3.编写特定歌曲的程序代码,通过按键控制该歌曲的自动播放,音调调节等功能;
4.编写开发板上LED指示灯及数码管的显示功能程序。实现输出特定音阶的同时,特定LED指示灯亮的功能,同时使用数码管,显示此时输出音符的音调。同时设置开发板上各按键的功能,从而选择三种不同模式:正常演奏模式、自动播放模式及游戏模式;
5.编写VGA信号产生器模块,在正常演奏模式及自动播放模式下,实时显示当前按键的状态,显示模拟真实电子琴键盘的界面;游戏模式下,稍微超前并短暂的将音符状态显示出来,以供玩家进行反应并按下对应按键;
6.游戏模式中歌曲演奏结束时,将玩家演奏正确的按键数转化成分数,显示在数码管上。
其具体的系统框图及各模块逻辑关系如下图所示:
图4 系统框图及逻辑关系
2. 主要器件清单及连接
1)
获得途径:项目申请;
用途:作为核心器件,提供开发平台及各种接口、开关;
2) LCD显示器
获得途径:借用实验室器材;
用途:通过VGA接口连接线与开发板相连,实现可视化界面的功能;
3) Pmod耳机放大器扩展模块Pmod AMP1
获得途径:项目申请;
用途:作为开发板及外放间的器件,实现外放的发声功能;
4) 耳机及音箱
获得途径:自行购买;
用途:作为外放,输入音频信号;
5) PS/2键盘
获得途径:自行购买;
用途:作为输入设备,充当电子琴琴键的功能。
各器件间的连接情况如下图所示:
图5 主要器件连接图
3. 软件模块划分及整合
1) 开机画面模块
利用VGA信号发生器的原理,实现一个动态的开机画面显示,基本功能和游 戏功能又不一样的开机画面,其对应的VHDL Module文件分别是“begins”和“begins2”;
2) 发声模块
通过分频器得到不同音调音符的频率,是工程中最底层的模块。其VHDL Module文件分别为“fredivn_top”,“fredivn1”,“fredivn2”(基本功能模块中低中高音的分频),“gfredivn_top”,“gfredivn1”,“gfredivn2”(游戏功能模块中低中高音的分频);
3) 基本功能显示模块
该模块在基本功能下实现模拟电子琴琴键的显示,并实时的显示当前状态下 的音调及按键情况,其文件名为“VGA”;
4) 游戏功能显示模块
该模块在游戏模式功能下实现模拟电子琴琴键的显示,并实时的显示当前状 态下的音调、按键情况以及当前需输出的音符,其文件名为“gamevga”;
5) 自由演奏模式子程序
该模块是自由演奏模式的顶层文件,用来调用底层的显示模块及发声模块等, 并包括了PS2键盘的驱动,实现电子琴自由演奏的功能,其文件为“keyboard_top”;
6) 自动播放模式子程序
该模块是自动播放模式的顶层文件,用来调用底层的显示模块及发声模块等, 并包括了用代码编写的因特尔公司的广告音乐,实现电子琴自动播放的功能,其文件名为“pirate”;
7)其他模块
其他模块主要是各种分频器,这些模块被其他各种模块调用,实现特定功能,如为了实现警报灯和警报音,调用了一个10HZ的分频器。
基本功能主程序“piano”和游戏模式主程序“game”均有调用上述的模块,其调用模块的情况如下图所示:
图6 基本功能模块调用情况
图7 游戏功能模块调用情况
4. 各模块实现方法及参数计算
4.1 发声模块
首先得到各音符标称的频率值,如下表所示,由程序调控,使开发板能通过一个扩展口输出指定频率的信号,经由音频放大器,从而输出对应音阶的音频信号;
通过对各个音符频率的加倍及减半,可以得到不同音调的音阶;假设上表中所得的频率对应的音调为中音,则通过将其加倍,则可得到高音;将其减半,则可得到低音。
实现这些频率,我们采用对分频的方法,模板代码如下:
if (clk'event and clk='1') then
if count=N+N-1 then count
其中代码中的N为分频系数,要得到不同频率的波形,则需要不同的分频系数,如用BASYS2开发板上的50Mhz的时钟,则通过计算可以得到各音调音符对应的分频系数,如下表所示:
4.2 PS2键盘驱动
1) PS2接口介绍
随着计算机工业的发展,作为计算机最常用输入设备的键盘也不断发展.1981年IBM推出了IBMPC/XT键盘及其接口标准.该标准定义了83键,采用5脚DIN连接器和简单的串行协议。实际上,第一套键盘扫描码并没有主机到键盘的命令。为此,1984年IBM推出了IBMAT键盘接口标准.该标准定义了84~101键,采用5脚DIN连接器和双向串行通信协议,此协议依照第二套键盘扫描码设有8个主机到键盘的命令.到了1987年,IB,又推出了PS/2键盘接口标准.该标准依旧定义了84~101键,但是采用6脚mini-DIN连接器,该连接器在封装上更小巧,已然采用双向串行通信协议并且提供有可选择的第三套键盘扫描码集,同时支持17个主机到键盘的命令。现在,市面上的键盘都和PS/2及AT键盘兼容,只是功能不同而已。
2) PS2接口引脚
一般具有5脚连接器的键盘成为AT键盘,而具有6脚的mini-DIN连接器的键盘则称为PS/2键盘.实际上这两种连接器都只有4个脚有意义.它们分别是clock(时钟脚),data(数据脚),5V(电源脚)和Ground(电源地).在PS/2键盘与PC的物理连接上只要保证这4根线一一对应就可以了.PS/2键盘靠主设备的PS/2端口提供5V电源,另外两个引脚clock(时钟脚)和data(数据脚)都是集电极开路的,所以必须接大阻值的上拉电阻.它们平时保持高电平,有输出时才被拉倒低电平,之后自动上浮到高电平,现在比较常用的连接器如下图。
图8 PS2键盘连接器
PS/2通信协议是一种双向同步串行通信协议.通信的两端通过clock(时钟脚)同步,并通过data(数据脚)交换数据.任何一方如果想抑制另外一方通信时,只需要把clock(时钟脚)拉到低电平.如果是PC和PS/2键盘间的通信,则PC必须做主机,也就是说,PC可以抑制PS/2键盘发送数据,而PS/2键盘则不会抑制PC发送数据.一般设备间传输数据的最大时钟频率是33khz,大多数PS/2设备工作在10~20khz.推荐值在15khz左右,也就是说,clock(时钟脚)高,低电平的持续时间都为40μs。每一数据帧包含11~12个位,具体含义如下。
1) 1个起始位总是逻辑0
2) 8个数据位(LSB)低位在前
3) 1个奇偶校验位奇校验
4) 1个停止位总是逻辑1
5) 1个应答位仅用在主机对设备的通信中
如果数据位中1的个数为偶数,检验位就为1;如果数据位中1的个数为奇数,校验位就为0;总之,数据位中1的个数加上校验位中1的个数总为奇数,总是进行奇校验。
在上述讨论中传输的数据是对特定键盘的编码或者对特定命令的编码.一般采用第二套扫描码所规定的码值来编码.其中键盘码分为通码(make)和断码(break).通码通常是按键接通时所发送的编码,用两位十六进制数来表示,断码通常是按键断开时所发送的编码,用4位十六进制数来表示。
3) 设计思路与原理
FPGA接收PS/2键盘发送一个字节可按照下面的步骤进行。
1) 时钟线电平,如果时钟线由高变为低,则表示时钟线的下降沿到来.
2) 检测数据线在时钟线的下降沿时是否为低,如果是则表示PS/2键盘有数据发
送.
3) 在下8个时钟线下降沿从低位到高位接收数据.
4) 在第10时钟线下降沿接收奇校验位
5) 在第11时钟线的下降沿.如果数据线为高表示停止位,一帧数据接收结束。 时序图如下图所示。
图9 PS2键盘时序图
由于第二套扫描码每个按键值由通码与断码组成,由第二套扫描码表分析可知,一个按键被按下PS/2键盘发送通码数据,该按键被释放PS/2键盘发送断码数据.通码数据由8位的按键,或是扩展类别E0与键值组成,断码由F0与通码数据表组成.因此FPGA需要对PS/2键盘发送的数据进行判断,提取值数据输出。
其具体代码在此处不单独给出,如有需要,可参考附件中的项目相关文档中的VHDL Module文件“keyboard_top”。
4.3 VGA信号发生器
显示器采用光栅扫描方式,即轰击荧光屏的电子束在CRT屏幕上从左到右(受水平同步信号HSYNC控制),从上到下(受垂直同步信号VSYNC控制)做有规律的移动.电子束采用光栅扫描方式,从屏幕左上角开始,向右逐点进行扫描,形成一条水平线;到达最右端后,又回到下一条水平线的左端,重复上面的过程;当电子束完成右下角一点的扫描后,形成一帧.此后,电子束又回到左上方起点,开始下一帧的扫描.完成一行扫描所需时间称为水平扫描时间,其倒数称为行频率;完成一帧(整屏)扫描所需的时间称为垂直扫描时间,其倒数为垂直扫描频率,又称刷新频率,即刷新一屏的频率.常见的有60Hz,75Hz等,标准VGA显示的场频为60Hz,行频为31.5kHz。
在VGA中,水平同步脉冲在光栅扫描线需要回到水平开始位置也就是屏幕的左边的时候插入,垂直同步脉冲在光栅扫描线需要回到垂直开始位置也就是屏幕的上方的时候插入.复合同步脉冲是水平同步脉冲与垂直同步信号的组合.RGB为像素数据,在没有图像投射到屏幕时插入消隐信号,当消隐有效时,RGB信号无效。
在水平时序中,包括以下几个时序参数:水平同步,脉冲Ta宽度为96个时钟
周期;行消隐后沿Tb宽度为48个时钟周期;视频数据Tc宽度为640个时钟周期;行消隐前沿Td宽度为16个时钟周期.一整行Te宽度为以上4项相加为800,如下图所示.当时钟频率不是25MHz,以上参数可以按比例进行适当调整。
图10 行扫描时序
垂直时序与水平时序类似,包括以下几个不同的时序参数:垂直同步脉冲Ta宽度为2个时钟周期;列消隐后沿Tb宽度为32个时钟周期;视频数据Tc宽度为480个时钟周期;列消隐前沿宽度为11个时钟周期.一整场视频Te宽度为524个时钟周期,如下图所示.当时钟频率不是25MHz,以上参数可以按比例进行适当调整。
图11 列扫描时序
其具体代码在此处也不单独给出,如有需要,可参考附件中的项目相关文档中的VHDL Module文件“VGA”及“gamevga”。
五. 软件仿真及硬件测试结果
1. PS2键盘驱动软件仿真
在仿真代码中,分别将kbdata,即键入的ASCII码设为“00011100”,“ 01000000”, “00011001”,分别对应十六进制的1C,1B,34,这三个ASCII码值对应着键盘上的A,S,G键。按照我们的设计目标,按下A键时,输出音符do,并且第一个LED灯亮,数码管上显示音调的值应与之前的值相同;当按下S
键时,输出音符re,并且第二个LED灯亮,数码管上显示音调的值应与之前的值相同;当按下G键时,无音符输出,并且所有LED灯均不亮,但数码管上显示音调的值应变为“3”。其仿真结果如下图所示:
图12 PS2键盘仿真结果1
从仿真结果可以看出,当按下按键“A”时,由于“A”的通码是十六进制1C,即二进制00011100,这一点由kbdata的波形可以看出。输出led结果为二进制10000000,即对应的开发板上第一个led指示灯亮;数码管数字为十六进制25,对应到数码管上显示默认值“2”。
图13 PS2键盘仿真结果2
从仿真结果可以看出,当按下按键“S”时,由于“S”的通码是十六进制1B,即二进制01000000,这一点由kbdata的波形可以看出。输出led结果为二进制01000000,即对应的开发板上第二个led指示灯亮;数码管数字仍为十六进制25,对应到数码管上显示默认值“2”。与预想状况相同。
图14 PS2键盘仿真结果3
从仿真结果可以看出,当按下按键“G”时,由于“G”的通码是十六进制34,即二进制00110100,这一点由kbdata的波形可以看出。输出led结果为二进制00000000,即Y一个LED灯都不亮;数码管数字仍为十六进制29,对应到数码管上显示“3”。与预想状况也相同。
从仿真结果可以看出,PS2键盘软件仿真结果与实际预想的结果均相同,说明设计并编写的PS2键盘驱动没有问题。
2. 硬件测试结果
由于输出结果为音频信号或图片的动态显示,故在此无法直接给出测试结果。如有需要,可查看附件中的“电子琴音乐游戏机演示视频”,或登陆http://i.youku.com/u/UNDM2Mjk0NTgw/videos查看演示视频。
六. 心得体会及项目总结
此次我们的项目是制作电子琴音乐游戏机,开始觉得这个项目实现起来应该
比较简单,但实际制作时才发现比之前想象中的要困难得多。困难来自于多方面。第一,对于Xilinx FPGA以及其对应的开发软件ISE不甚了解,使得耗费了大量的时间去熟悉这个开发平台;第二,此次使用的VHDL语言在之前的课程中均从未学习过,导致编程事倍功半,再者,VHDL是一种十分规范严格的语言,所以在编写代码时常常遇到问题;第三,网上关于BASYS2开发板的资料相对较少,无相似的demo可以参考,故使用此开发板实现一些功能也就不那么容易了。
好在最终我们都按时按量的完成了工作,虽然仍然存在一些小问题,如未能解决FPGA资源不够用的问题,音色不那么好听等,但90%以上的问题我们已经都能解决,并且对于Xilinx FPGA,VHDL这些原本了解甚少的东西,现在已经能够熟练的运用了。这都要感谢此次硬件课程设计,同时也要感谢依元素公司能提供这次参赛的机会,让我们能学到如此之多的东西。
七. 致谢
此次我们的硬件课程设计能顺利完成,除了我们自身的努力外,我们也要感谢那些帮助过我们的人。首先要感谢我们的指导老师龚军老师,在此项目中给予了我们很多的支持与帮助,帮我们申请器材,解答问题。可以说如果没有龚军老师的知道,我们可能没法完成此次的项目。另外也要感谢班上一些对VHDL有一定了解的同学,在他们的帮助下我们才能到现在熟练地运用这种硬件语言。同时也要感谢小组内的所有成员,是所有人的努力和坚持,才铸就了现在这个项目的完成。
最后感谢学校,感谢依元素公司举办这次比赛,让我们的成果能得到更多的关注。
八. 参考文献
[1] 刘福奇.FPGA嵌入式项目开发实战.北京:电子工业出版社,2009.4
[2] 陈耀和.VHDL语言设计技术.北京:电子工业出版社,2004.3
[3] 刘岚,黄秋元,陈适.FPGA应用技术基础教程.北京:电子工业出版社,2009.5
九. 附录
附件清单:
硬件课程设计项目答辩PPT
电子琴音乐游戏机使用手册
项目相关文档(包含所有的VHDL Module)
电子琴音乐游戏机演示视频
演示视频网络链接