现在的位置: 首页 > 实战项目 > 正文
基于小脚丫FPGA开发板和按键、蜂鸣器的小钢琴设计
2016年12月10日
浏览 1,521 次
硬禾实战营

应用1

1、设计要求

基于小脚丫FPGA开发板和按键、蜂鸣器的小钢琴设计,要求:

  • 采用FPGA+按键+无缘蜂鸣器实现小钢琴功能;
  • 7个按键,分别对应7个音符,按下时蜂鸣器发出对应音调;
  • 设计一个音乐自动播放功能,根据存入的乐谱进行循环播放;

2、硬件连接

FPGA的系统时钟来自于小脚丫FPGA开发板配置的25MHz时钟晶振,连接FPGA的C1引脚。

本设计用到7个按键,底板上的KEY1、KEY2、KEY3、KEY4、KEY5和FPGA开发板上的KEY1、KEY2,硬件设计如图1所示,两个按键分别连接到FPGA的A2和B7引脚。

1111

图1、按键硬件设计

 

设计中需要蜂鸣器作为输出,蜂鸣器位于底板,与小脚丫FPGA开发板之间的连接关系如图2所示,对应的管脚为开发板上的GPIO13。

1112

图2、蜂鸣器硬件连接

3、工作原理

  • 检测各个按键的状态,如果有按键按下,给计数器设定一个最大值;
  • 如果有按键按下设定计数最大值,并打开响铃开关;
  • 响铃开关打开后,每当计数到最大值反转一次蜂鸣器管脚,蜂鸣器发出声音;
  • 音乐盒的播放列表存放在数组中,初始化部分将乐谱存入数组;
  • 根据设定的节拍,每当节拍计数器满时数组下标加一;
  • 根据数组下标设定计数最大值,并打开响铃开关;
  • 由于连续响不能分辨连续相同的音调,所以在音调之间加空闲时间PAUSE_TIME;
  • 响铃开关打开后,每当计数到最大值反转一次蜂鸣器管脚,蜂鸣器发出声音。

4、代码设计

为了实现所需要的功能,我们将整个设计划分不同的模块,一个小钢琴模块piano,一个音乐盒模块player。

4.1 piano模块

Piano模块主要实现小钢琴的功能。

  • 第一个always块用于检测按键状态,如果有按键按下,去设定一个计数最大值countmax,并将响铃开关alarm打开;
  • 第二个always块是在alarm打开后每当计数到countmax时翻转蜂鸣器电平,驱动蜂鸣器产生对应音调。

1113图3、小钢琴部分代码

4.2 player模块

Player模块实现音乐盒的功能:

  • 第一个always块产生音乐的节拍,根据PACE参数的值,此处PACE=12.5M,对于1/2节拍;
  • 第二个always块用于对乐谱数组下标进行循环控制,每个节拍加一;
  • 第三个always块根据当前数组元素值去设定计数最大值和设定响铃开关;
  • 第四个always块是在alarm打开后每当计数到countmax时翻转蜂鸣器电平,驱动蜂鸣器产生对应音调。

1114

115

图4、音乐盒部分代码

5、系统运行

系统运行如前面描述,小钢琴可以正常弹奏;音乐盒循环播放小星星。

6、资源报告

资源 数量 比例 说明
LUTs 171 13%
寄存器 90 6%
存储器 0 0%
IO管脚 13
时钟频率 25MHz

7、知识点

  • 时钟计数分频
  • 数组的运用
  • 控制标志的运用
  • 蜂鸣器的运用