基于fpga的niosii PS2电子琴

1 概述
1.1 作品简介
本设计是基于NIOSII软核的PS2键盘电子琴,通过ps2键盘上的21个按键来控制蜂鸣器发出高音,中音与低音的(DO,RE,MI,FA,SO,LA,SI)音调,并通过三个数码管来显示相应的音调值,通过两个拨码开关控制节拍(即一个音持续的时间)。
1.2 作品目的与意义
(1) 用NIOSII软核制作一个电子琴,通过按下不同的ps2按键,电子琴能发出21种不同的音调。电子琴发出声音的频率与21种音调的频率相近,能清晰的听到这21种音调;并且可以在数码管上显示相应的音调,通过两个拨码开关控制每个音节持续的长短。
(2) 学习使用quartus II以及DE1_SOC开发板,学习建立SOPC平台上的处理器,并且用FPGA实现一些功能。

2 可行性分析
2.1 课题分析
由于音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以对不同的频率进行组合,即可构成我们所想要的音乐了。音调主要由声音的频率决定,乐音(复音)的音调更复杂些,一般可认为主要由基音的频率来决定,即一定频率的声音对应特定的乐音。因此,要实现电子琴,就应该设计能输出这21种频率的电路,通过键盘来控制输出电路的种类。
2.2需求分析
我们常见的电子琴是普及型的,或业余型的。事实上,还有专业型的电子琴。家用的电子琴属中低端的“编曲键盘”。中高端的编曲键盘在现代的流行乐队里起着重要作用。而侧重于音乐制作的电子琴类成员叫做“电子合成器”。只是由于它目前比较贵,所以还不普及。中国有关企业正在努力地研制高性能低成本的电子琴。我们也知道电子琴因其操作简单,且能模拟各种音色,而深受消费者喜爱。
根据市场的需求,设计具有集成度高、性能稳定可靠的多功能电子琴,具有很好的趣味性和实用性,我们发现这个可以具有很大的市场,而且现在的学生以及一些音乐爱好者对电子琴有种偏爱。但是国内外的电子琴要么是很好的价格太贵,让很多人望“琴”心叹,另外电子琴也可用于孩童的学前音乐教育。
2.3设计要求指标
(1) 通过PS2键盘来获取21种音调信息。
(2) 并将信息送入编写的基于NIOSII的软核内,利用C语言进行相应的译码。
(3) 通过数码管显示相应的21种音调信息。
(4) 通过设置节拍键为音调设置相应的音阶持续长短。
(5) 通过蜂鸣器播放相应的音乐。

3 设计方案
3.1设计原理
3.1.1 PS2键盘原理
PS2接口是目前最常见的键盘接口,最初是IBM公司的专利,俗称“小口”。这是一种键盘的专用接口,是一种6针的圆型接口,如下图所示。
键盘专用接口图

由于电源和地都是主机接口提供,主要用于驱动设计的管脚只有两个,data和clock,该clock时钟是键盘产生的,最大的时钟频率是33kHz 而且大多数设备工作在10到20kHz。
PS2键盘履行一种双向同步串行协议,换句话说每次数据线上发送一位数据并且每在时钟线上发一个脉冲就被读入,键盘可以发送数据到主机,而主机也可以发送数据到设备。
该同步串行协议的帧结构如下:(从键盘到主机的帧长度为11bit)注意校验位是对数据位的校验,且是奇校验,当数据位为偶数个1时该位置为1,为奇数个1时该位为0,总是保证1的个数为奇数个。
同步串行协议的帧结构表
如下图所示,从键盘发送到主机的数据在时钟信号的下降沿,当时钟从高变到低的时候被读取。从主机发送到键盘的数据在上升沿,当时钟从低变到高的时候被读取。
其发送数据的模式为:当按下按键时,键盘会向外发出通码(即下图键盘的按键编码),当按键松开的时候,键盘会向外发送断码和相应的通码。如:按下Shift键,按下G键,释放G键,释放Shift键。与这些时间相关的扫描码如下:Shift 键的通码 8’h12,G 键的通码 8’h34,G 键的断码8’hf0 8’h34, Shift 键的断码 8’hf0 8’h12,因此发送到计算机的数据应该是:8’h12 8’h34 8’hf0 8’h34 8’hf0 8’h12。

数据的传输和时序图

通码图
3.1.2 NIOSII简介
Altera NiosII处理器是世界上最通用的处理器,也是 FPGA 业界应用最广泛的软核处理器。Nios II处理器非常灵活,满足了低成本、实时、ASIC 优化和应用处理需求。Nios II 处理器支持所有 AlteraSoC 和 FPGA 系列。
能够满足任何应用32位嵌入式微处理器的需要,客户可以将第一代Nios处理器设计移植到某种NiosⅡ处理器上,Altera将长期支持现有FPGA系列上的第一代Nios处理器。另外,Altera提供了一键式移植选项,可以升级至Nios Ⅱ系列。
NiosⅡ处理器具有完善的软件开发套件,包括编译器、集成开发环境(IDE)、JTAG调试器、实时操作系统(RTOS)和TCP/IP协议栈。设计者能够用Altera QuartusⅡ开发软件中的开发工具很容易地创建专用的处理器系统,并能够根据系统的需求添加Nios Ⅱ处理器核的数量。
使用NiosⅡ软件开发工具能够为NiosⅡ系统构建软件,即一键式自动生成适用于系统硬件的专用C/C++运行环境。NiosⅡ集成开发环境(IDE)提供了许多软件模板,简化了项目设置。
在FPGA中使用软核处理器比硬核的优势在于,硬核实现没有灵活性,通常无法使用最新的技术。随着系统日益先进,基于标准处理器的方案会被淘汰,而基于NiosⅡ处理器的方案是基于HDL源码构建的,能够修改以满足新的系统需求,避免了被淘汰的命运。将处理器实现为HDL的IP核,开发者能够完全定制CPU和外设,获得恰好满足需求的处理器。
3.1.3 电子琴播放模块原理
电子琴演奏的原理是这样的:每个音符的频率值(音调)及其持续的时间(音长)是演奏所需的两个基本数据,因此只要控制输出到扬声器的激励信号频率的高低和持续的时间,就可以使扬声器发出连续的乐曲声。频率的高低决定了音调的高低。音乐的十二平均率规定:每两个8度音(如简谱中的中音1与高音1)之间的频率相差一倍。在两个8度音之间,又可分为12个半音,每两个半音的频率比为12√2。 另外,音名A(简谱中的低音6)的频率为440Hz,音名B到C之间、E到F之间为半音,其余为全音。由此可以计算出简谱中从低音1至高音1之间每个音名对应的频率,如下所示:
音名 频率/Hz 音名 频率/Hz 音名 频率/Hz
低音1 261.6 中音1 523.3 高音1 1046.5
低音2 293.7 中音2 587.3 高音2 1174.7
低音3 329.6 中音3 659.3 高音3 1318.5
低音4 349.2 中音4 698.5 高音4 1396.9
低音5 392 中音5 784 高音5 1568
低音6 440 中音6 880 高音6 1760
低音7 493.9 中音7 987.8 高音7 1975.5
简谱中的音名与频率的关系
3.2设计框图
3.2.1 设计过程

电路设计过程

  如上图电路设计过程所示,要实现电子琴首先要获取PS2键盘通码信息,通过不同的通码信息来控制不同的音调,其次建立软核处理器,用NIOSII处理通码信息并得出相应音调值和对应数码管的值,最后通过硬件电路用音调控制分频信号大小并通过蜂鸣器播放,数码管显示相应的音调。

3.2.2 设计思路
基于fpga的niosii PS2电子琴_第1张图片
基于fpga的niosii PS2电子琴_第2张图片
基于fpga的niosii PS2电子琴_第3张图片
电路设计过程

如上图电路设计思路所示,由PS2键盘产生的数据信号与时钟信号,之后通过硬件电路来获取相应的通码信息,通过建立的NIOSII处理器来处理通码信息,获取相应的音调信息,音调信息由相应的硬件电路识别,通过音调信息控制数码管的显示与蜂鸣器的播放。

4 详细电路设计
4.1 PS2键盘设计

                           边沿检测电路

在键盘时钟信号的下降沿,键盘发送数据,当时钟从高变到低的时候数据需要读取。该时钟为异步时钟,我们需要通过边沿检测的方式来检测其下降沿,以便根据下降沿的到来读取数据。

读取数据电路
如上图所示,通过状态机将八位数据写入寄存器temp_data,但是不能确定写入的数据为通码还是断码,所以需要下图所示的通码识别电路来进行识别。

通码识别电路
4.2 NIOSII设计

SOPC的建立

获取通码后的解码
如上图所示,用QSYS来建立基于NIOSII的SOPC,之后通过上图的软件来解码相应的通码,最后实现了通码到音调的转变,并且直接将音调值赋予相应的数码管硬件电路,由其来显示。
4.3音调的播放电路
不同频率的脉冲通过蜂鸣器的音调不一样,只要处理好频率和音符之间的对应关系就可以产生21个音符,在网上找到以50兆为时钟对应的不同分频系数之后进行分频,就可以产生21个不同音符。

不同音调的分频系数

分频电路

节拍的实现
因为每首歌的感觉不一样,音调有长有短,所以在音调之间有节拍的长短,有力节拍才可以实现想要的乐曲。
5 硬件实现
5.1设计调试
基于fpga的niosii PS2电子琴_第4张图片
软核处理器的调用
如上图所示,将niosii处理器的软核进行调用,完成的处理器与外围电路的连接,之后将生成的电路下载到DE1板子上,最后在相应的软件上将写好的C语言程序进行编译(核对SOPC的地址信息)并运行程序。
5.2结果分析比较
最后的电路实现了电子琴的功能,通过PS2键盘获取了21种音调信息,并且将信息送入编写的基于NIOSII的软核内进行处理,并通过数码管显示相应的21种音调信息,而且通过节拍键为音调设置相应的音阶长短,最后通过蜂鸣器播放相应的音乐。

6 设计总结
6.1设计中遇到的困难:
(1)由于第一次用NIOSII实现复杂的程序,所以对软件不是很熟悉,常遇到的问题有在设计SOPC时,常常忘记双击输出来设置端口;在运行程序时常常在QUARTUS中找不到相应的问题,解决方法是先在MODELSIM运行检错修改之后再在QUARTUS中运行;在PIN PLANNER设计RST复位键时,不能用switch开关,必须用key,就会遇到如下图所示问题。
基于fpga的niosii PS2电子琴_第5张图片
(2)在设计电路过程中遇到的问题有对PS2键盘数据提取过程不熟悉,之后在查阅资料后了解了其使用方法和按键对应的数据通码;对蜂鸣器的使用不是很了解,由于板子上没有地线,不知道蜂鸣器如何连接,最后在设置音乐输出端口之后设置一个端口恒为零,实现了地线的设置。
6.2解决的方法和启示
在遇到软件操作方面的问题时,我常常咨询同学和老师,在没有完全解决情况下会在互联网上查询相关信息,特别是遇到上图所示的问题,第一次遇到这个问题时我重新建立了一个工程,之后问题解决,第二次遇到时,无论我如何重建工程还是解决不了,于是在网上寻找解决思路,发现引发这个问题有很多因素,如SOPC中memory部分设置太小,基于NIOSII建立时的SOPC程序与电路不符合,软件中的地址设置不正确等。经过不断的改正,不停的实验,最终解决了这个问题,发现是由于前面所提的复位端口设置不正确。
通过这次实验,让我更加清楚的了解了FPGA的强大,不光可以实现硬件电路,而且可以直接构造一些处理器,实现CPU的内部电路和外围电路。而且通过对简单的NIOSII的设计,让我对数据的传送和地址作用有了更直观的了解。
总之,通过这次实验让我收获很多,不光有自己亲手实现程序完成电路的成就感,还有自己通过努力完成电路的信心。

这是我完成的一部分报告,有很多图所以只粘贴了部分图

这是代码http://download.csdn.net/detail/baidu_37472307/9767993

你可能感兴趣的:(verilog)