背景:华中科技大学 电测综合实验

主要功能:Basys2开发板外接一个扬声器(或无源蜂鸣器也可)实现电子琴和音乐播放器的功能。其中由于开发板上只有4个按键,所以电子琴功能只做了4个音调,分别对应于4个轻触开关。音乐播放器功能需要根据挑选出来的乐谱,人工翻译为代码中对应的音调代码,然后输入到代码的状态机之中。两个功能分别采用两个不同的声道输出,因此两个功能互不干扰,可以同时进行。实现了一个符合综合实验要求的简单项目。因为没有队友,是一个人不到2天的时间赶出来的成果,所以比较简易,给需要的人做一个参考。

ISE工程文件(github链接)(包含实验报告):https://github.com/W-yt/yutian_sundry_zip/blob/master/piano%26palyer.zip

以下直接粘贴课设报告的主要内容。

如有问题欢迎指正交流。

一、实验目的

1.熟练掌握Basys2的开发流程;

2.提高FPGA综合调试的能力;

二、实验选题及设计目标

实验选题:音乐播放器+电子琴(双声道)

项目目标:本项目要设计实现一个基于BASYS2的多功能电子琴,音乐播放和电子琴各占用一个声道的双声道电子琴。计划采用两个扬声器作为双声道的输出设备,利用拨码开关实现音乐播放器的控制,利用轻触开关实现电子琴的琴键(这里由于BASYS2开发板上只有4个轻触开关,因此电子琴部分仅选用了四个音,仅用来演示电子琴的实现原理,也可以外接按键,或者矩阵键盘拓展)。另外在程序中写定一个音乐的乐谱,实现音乐播放器的演示功能,如果时间允许,会在程序中存储多段音乐,使用拨码开关选择播放曲目。

三、硬件部分

  1. 实验整体电路

2.扬声器简易驱动电路:

四、软件部分

1.系统主频

获取系统主频由开发板主频经过10分频得到:50MHz分频为5MHz

代码(digital_piano.v):

     /* 10分频:50MHz到5Mhz分频 */always@(posedge inclk)                           begin   if(cnt<3'd5)cnt <= cnt + 3'b1;elsebegincnt <= 3'b0;clk_5MHz <= ~clk_5MHz;endend

2.电子琴子模块

读取输入的轻触按键的状态,决定声音频率,再通过计数器实现定频率方波的输出,作为扬声器的驱动信号。其中origin的值为根据各个音调对应的声音频率换算确定的。

代码(piano.v):

          /* piano子模块 */module piano(inclk, clk_5MHz, key_in, beep);input  inclk;                      //开发板主频input  clk_5MHz;             //系统时钟input [3:0]  key_in;         //轻触按键输入output  beep;                 //扬声器输出wire carry;reg beep_r;       assign beep = beep_r;       //输出音乐/* 按键转换音调输出 */always @ (posedge clk_5MHz)begincase (key_in[3:0])/* 消除不按时的噪声 */4'b0000: origin<=0000;4'b0001: origin<=6826;   // Hdo4'b0010: origin<=7871;   // Hre4'b0100: origin<=8798;   // Hmi4'b1000: origin<=9224;   // Hfadefault: origin<=0000;endcaseendassign carry=(count == 16383);/* 获取驱动信号 */always @(posedge clk_5MHz)begin if(key_in[3:0] == 4'b0000)beginendelseif(carry)count = origin;elsecount = count + 1;end/* 扬声器驱动 */always @(posedge carry)beginbeep_r<=~beep_r;endendmodule

3.音乐播放器子模块

音乐播放器子模块首先通过分频实现了一个低频时钟(这里采用5Hz),作为音乐的节拍器。然后调用按照程序翻译出来的曲谱函数(这里由于时间原因仅翻译了天空之城一首音乐的一部分)。

代码(song.v):

         module song(clk_5MHz, select, beep);input clk_5MHz;input select;               //音乐播放暂停选项                       output beep;              //蜂鸣器输出reg  [25:0] cnt2;     //计数器reg  clk_5Hz;wire  beep_r;wire out3;                  //曲谱的输出wire clk;assign beep = beep_r;/* 调用曲谱模块——模拟有限状态机实现 *//* 《天空之城》 */song3 m3(.clk_5MHz(clk_5MHz),.clk_4Hz(clk),.select(select),.beep(out3));assign beep_r = out3;assign clk = clk_5Hz;/* 5hz分频 */always@(posedge clk_5MHz)                  begin   //     if(select)//     beginif(cnt2<25'd400000)cnt2 <= cnt2+25'b1;elsebegincnt2<=25'b0;clk_5Hz <= ~clk_5Hz;end//     endendendmodule

4.曲谱子模块

这里对天空之城曲谱的一部分进行了翻译,由于钢琴谱比较复杂,且一般为双手谱,这里选择了一个较为简单的吉他谱,按照吉他谱中的简谱进行逐拍翻译。

曲谱如下:

代码(song3.v):

        /* 《天空之城》 */module song3(clk_5MHz,clk_4Hz,select,beep);input clk_5MHz,clk_4Hz,select;   //系统时钟,节拍时钟,播放暂停选项output beep;                                          //扬声器输出 reg  [3:0] high,med,low;reg  [15:0] origin;reg    beep_r;                                            reg  [7:0] state;                                           reg  [15:0] count;                    assign beep = beep_r;           /* 扬声器基本驱动 */always @(posedge clk_5MHz)begin/* 计数器 */count <= count + 1'b1;             If(count == origin)begin/* 计数器清零 */count <= 16'h0;                          /* 输出取反 */beep_r <= !beep_r;            endend/* 音调输出转换 */always@(posedge clk_4Hz)beginif(select)begincase({high,med,low})/*  24音转换为方波频率 */'b000000000001:origin=22900; //低1'b000000000010:origin=20408; //低2'b000000000011:origin=18181; //低3'b000000000100:origin=17142; //低4'b000000000101:origin=15267; //低5'b000000000110:origin=13605; //低6'b000000000111:origin=12121; //低7'b000000010000:origin=11472; //中1'b000000100000:origin=10216; //中2'b000000110000:origin=9101;  //中3'b000000111000:origin=8571;  //中4'b000001010000:origin=7653;  //中5'b000001100000:origin=6818;  //中6'b000010000000:origin=6060;  //中7'b000100000000:origin=5733;  //高1'b001000000000:origin=5108;  //高2'b001100000000:origin=4551;  //高3'b001010000000:origin=4294;  //高4'b010000000000:origin=3826;  //高5'b011000000000:origin=3409;  //高6'b010100000000:origin=3050;  //高7endcaseendelse/* 消除杂音 */origin=0000;end/* 《天空之城》乐谱翻译 */always @(posedge clk_4Hz)  beginif(select)begin/* 全曲总节拍数 */if(state ==193)/* 自动重放 */state = 0;else/* 节拍计数 */state = state + 1'b1;case(state)/* 按小节间隔 *//* 1 */0:                                                                       {high,med,low}='b000001100000;//中61:                                                                       {high,med,low}='b000010000000;//中7              /* 2 */2,3,4:                                                                 {high,med,low}='b000100000000;//高15:                                                                       {high,med,low}='b000010000000;//中76,7:                                                              {high,med,low}='b000100000000;//高18,9:                                                                    {high,med,low}='b001100000000;//高3    /* 3 */10,11,12,13,14,15:                                        {high,med,low}='b000010000000;//中716,17:                                                high,med,low}='b000000110000;//中3/* 4 */               18,19,20:                                                          {high,med,low}='b000001100000;//中621:                                                                   {high,med,low}='b000001010000;//中522,23:                                              {high,med,low}='b000001100000;//中624,25:                                                               {high,med,low}='b000100000000;//高1………………………………../* 25 */186,187,188,189,190,191,192,193:          {high,med,low}='b001100000000;//高3       endcaseendendendmodule

5.管脚定义

代码(digital_piano_ucf.ucf):

        NET "inclk"     LOC = "B8";                //开发板主频NET "select" LOC = "N3";                 //拨码开关作为播放器暂停选项/* 双声道输出:电子琴&音乐播放器,互不干扰NET "out_r"  LOC = "D12";              //右声道输出NET "out_l"  LOC = "C9";                  //左声道输出/* 电子琴演示琴键:轻触开关 */NET "key_in[3]" LOC = "G12";       NET "key_in[2]" LOC = "C11";NET "key_in[1]" LOC = "M4";NET "key_in[0]" LOC = "A7";NET "select" CLOCK_DEDICATED_ROUTE = FALSE;

如有问题欢迎指正交流。

——cloud over sky

——2020/1/18

基于Basys2开发板的简易电子琴和音乐播放器设计相关推荐

  1. 基于STM32的电子琴音乐播放器设计

    基于STM32的电子琴/音乐播放器设计 文章目录 基于STM32的电子琴/音乐播放器设计 @[toc] 引言 第一章 总体设计 1.1 系统功能 1.2 主要技术性能指标 第二章 系统设计 2.1 系 ...

  2. android音乐播放器ppt,基于Android音乐播放器设计与开发.ppt

    基于Android音乐播放器设计与开发 毕业设计 基于Android的音乐播放器 设计与开发 设计概述 研究背景 研究意义 研究目标 系统演示 研究背景 随着Android智能手机的普及,用户越来越能 ...

  3. python开发音乐播放器教程_python开发简易版在线音乐播放器示例代码

    在线音乐播放器,使用python的Tkinter库做了一个界面,感觉这个库使用起来还是挺方便的,音乐的数据来自网易云音乐的一个接口,通过urllib.urlopen模块打开网址,使用Json模块进行数 ...

  4. android 音乐播放器设计,基于Android音乐播放器设计的实现毕业论文.pdf

    摘要 随着手机的智能化以及网络的普及和应用,人类将进入移动互联 网的新时代.在国内,随着4G牌照的下发,三大运行商也在加紧抢 占移动互联网领域的制高点.在此过程中,人们对新一代移动互联终 端设备的功能 ...

  5. 基于单片机的音乐播放器设计

     word完整版可点击如下下载>>>>>>>> 基于单片机的音乐播放器设计-硬件开发文档类资源-CSDN下载内容包括详细设计文档word版,附带开题报告 ...

  6. java课程设计-音乐播放器,基于java的音乐播放器设计.doc

    摘要:音乐是生活的必需的,它能够缓解人们焦躁的心情,调节现代化生活的节奏,让人们能够舒缓身心.一个好的音乐播放器,能够实现个性化的功能,它能够根据个人的喜好来推荐歌曲.深流音乐播放器正是实现了此功能, ...

  7. 【毕业设计】28-基于单片机的音乐播放器简易音乐播放器设计(原理图+源代码+仿真工程+答辩PPT+答辩论文)

    typora-root-url: ./ [毕业设计]28-基于单片机的音乐播放器简易音乐播放器设计(原理图+源代码+仿真工程+答辩PPT+答辩论文) 文章目录 typora-root-url: ./ ...

  8. 树莓派云音乐c语言,基于树莓派的红外遥控版网易云音乐播放器

    基于树莓派的红外遥控版网易云音乐播放器.下面是遥控键盘示意图: CH- CH CH+ << >> || - + EQ 0 100+ 200+ 1 2 3 4 5 6 7 8 9 ...

  9. linux树莓派网易云音乐,基于树莓派的红外遥控版网易云音乐播放器

    基于树莓派的红外遥控版网易云音乐播放器.下面是遥控键盘示意图: CH- CH CH+ << >> || - + EQ 0 100+ 200+ 1 2 3 4 5 6 7 8 9 ...

最新文章

  1. 最长公共上升子序列 LCIS
  2. closeable java_【转】java.io.Closeable接口
  3. 建造者模式java_java设计模式3——建造者模式
  4. 【传智播客】JavaWeb程序设计任务教程 第四章练习答案
  5. k8s 分发证书文件 启动文件
  6. Java+Jmeter接口测试
  7. llinux c 语言延时,linux下写个C语言程序,要求有0.5微秒以下的延时,要怎样写
  8. 数据结构学习笔记之一 链表
  9. paip.提升用户体验----gcc c++ JIT-debugging 技术
  10. reporting services rdl文件如何不分页
  11. 哪几种情况可以销毁session(一般有3种)
  12. BIGEMAP地图下载器优势对比(水经注)
  13. 剪映怎么把无字幕的英文视频翻译成制作成中文字幕?(附教程+剪映字幕翻译工具免费下载)...
  14. 【基础整理】Mapping representation 机器人所用地图种类及相关介绍
  15. 我们都应该停止三种测试实践
  16. dpkg制作deb包详解
  17. HR面试,你需要注意什么?
  18. 关于怎么解决java.lang.NoClassDefFoundError错误
  19. 计算机内存不足16g内存,win10 16g内存显示内存不足怎么办_win10 16g内存显示可用7.95g如何恢复...
  20. MySQL 8.0安装教程

热门文章

  1. HTML模板 宽屏大气的企业官网网站模板
  2. excel表格怎么调整行高和列宽_在Excel中批量插入图片?这要如何操作呢
  3. 抖音的小程序怎么弄的
  4. 学习使用Postman+Newman
  5. 海康威视(HIKVISION) JAVA SDK Demo成功运行
  6. unity工具类篇 unity 计时器
  7. SpringBoot 远程调试
  8. 聪明人遇到两难选择,总有这么几个套路
  9. 微信小程序 - webview 的使用
  10. 如何在本机上利用IIS网页发布实现微信小程序与数据库之间的通信