基于FPGA的电子琴说明书.doc

上传人:h**** 文档编号:126909 上传时间:2018-07-09 格式:DOC 页数:53 大小:928.50KB
下载 相关 举报
基于FPGA的电子琴说明书.doc_第1页
第1页 / 共53页
基于FPGA的电子琴说明书.doc_第2页
第2页 / 共53页
基于FPGA的电子琴说明书.doc_第3页
第3页 / 共53页
基于FPGA的电子琴说明书.doc_第4页
第4页 / 共53页
基于FPGA的电子琴说明书.doc_第5页
第5页 / 共53页
点击查看更多>>
资源描述

1、 1 3.8 程序设计流程图 程序设计的流程图如图 4 所示。 图 4 程序设计流程图 开始 选择播放模式还是弹奏模式? 根据所按键盘按键的位置,发出相应的频率 对时钟信号进行分频得到 4 分音符的频率 通过对键盘的扫描确定按键的位置 根据乐曲的编号放出相应的乐谱的频率 等待用户输入按键 等待用户输入乐曲编号 显示乐曲编号 蜂鸣器发声 2 本设计所选用的管脚接口如图 6 所示: 图 6 管脚借口示意图 4、电子琴设计 4.1 乐曲播放功能设计 根据乐曲发声的基本原理,乐曲播放模块的设计思路是通过 50MHz 时钟分频的出 1MHz 信号,再对 1MHz 信号分频,获得音符 节拍频率,通过查表方

2、式获取音符分频数作为音符分频器模块分频的依据,将 1MHz 时钟分频获得合适的音符频率,输出至音频功放模块。电路结构框图如图 7所示。 节拍控制分频模块 乐曲选择与长度计 数器 音符分频器 乐曲存储 系统频率 4Hz 时钟 音频输出 LED 显示模块 3 图 7 乐曲播放模块结构图 乐曲播放文件外部引脚及生成的符号如图 8 所示。其中 clk 为 50MHz 系统频率, start 为乐曲播放启动信号, sel 为模块选择信号, choose 为乐曲选择信号,本设计设定档 sel 为高电平时,模块工作, out_sound1 为音频输出信号,seg6 为数码管段码输出信号 . 图 8 乐曲播放

3、模块符号 4.1.1 节拍控制分频模块 节拍控制分频模块主要用于产生乐曲的节拍,控制乐曲播放的节奏。 50MHz的系统频率经过 50 次的分频得到 1MHz 的频率,再对 1MHz 信号进行 250000 次分频,可以得到 4 分音符持续时间的频率, 作为第二个进程的时钟信号,它的目的是控制每个音阶之间的停顿时间,此处便是 1/4=0.25s, 其外部引脚及生成的符号如图 9所示 : 图 9 节拍控制分频模块符号 其主要 VHDL 代码如下所示: process(start,clk) begin if start=0then clk_1MHz= “110001“then max_50= “11

4、1101000010001111“then max_250000clk0,start=start0,choose=choose0,sel=sel0,out_sound1=g,seg6=seg60); u2:piano port map(kbcol=kbcol0,kbrow=kbrow0,clk=clk0,sel=sel0,start=start0,out_sound2=h); u3:or22 port map(a=g,b=h,c=out_sound0); end; 6、 总结 本设计利用了硬件描述语言 VHDL 实现了电子琴的自动演奏和键盘输入发音的简易功能,经过编程,综合,仿真,下 载,调试

5、,电路板制作,最终做出了成品,测试情况也良好,能够准确实现音阶的发音功能,可切换到乐曲播放存储好的乐曲,可根据需要更改程序从而实现不同乐曲的存储,也可以通过在 4*4 键盘上的按键来弹奏出不同的音调。 在设计过程,由于对音乐的知识不够熟悉,所以没有实现电子琴那么完美的音乐。在本系统设计调试过程中,软件和硬件都出现了一些小错误。例如在焊接电路时,由于不够细心,把共阳极数码管的公共端焊接到地端上了;在把外围电路板上连接芯片时,由于选错了一两个管脚,而导致结果与预期的不同,浪费了很多时间找原因。在软硬件结合调试 时,自动弹奏音乐时出现了噪音现象,经过了仔细检查所有程序,发现了问题是出现在分频模块的

6、编写上,所用芯片的工作频率是 50MHz,而程序中我的工作频率却设定为1MHz,于是我在播放模块中增加多一个 50 分频的程序,从而把问题解决了。 6 1 乐曲播放模块总结 如果想要播放更多首乐曲的话,只需要增加 choose 的相应位数,和增加存储模块中的乐曲数。比如要播放 8 首乐曲,则可以设置 choose: in std_logic_vector(2 downto 0),其中“ 000”代表第一首,“ 001”代表第二首,7 “ 010”代表 第三首,“ 011”代表第五首,“ 100”代表第六首,“ 101 代表第七首,“ 111”代表第八首。想要设置更多乐曲,可根据需要设定好合适的

7、 choose 位数。 另外,乐曲播放模块还可以采用查表方式来播放存储的乐曲,即在 ROM 中写入所要播放音乐的全部频率,通过编程来一一查找每一个频率,从而实现乐曲的播放。 6 2 乐曲弹奏模块总结 除了采用 4*4 键盘作为按键输入外,还可以选择 3*7 键盘,采用 3*7 键盘的话,就可以设置每一个按键代表一个音符,也就是说 21 个音符都可以有不同的按键来弹奏,这样在弹奏乐曲时,在选择高、中、低 音转换时,就不需要额外的按键,而且把按键的利用率达到 100%,而在 4*4 键盘中,有 6个按键是没用的,利用率比 3*7 键盘低。和 4*4 键盘扫描类似, 3*7 键盘可以采用扫描 3个列

8、检测7个行,也可以采用扫描 7 个列检测 3 个行,这两种只是编程方式不同,道理一样。如果采用扫描 7个列检测 3个行的话,列扫描信号由列引脚“列 1列 2 列 3列 4 列 5列 6列 7”进入键盘,以 1111110、 1111101、 1111011、 1110111、 1101111、1011111、 0111111 的顺序每次扫描其中的一列,然后读取行引脚的电平信号就可以 判断是哪个按键被按下。例如,当扫描信号为 1111110 时表示正在扫描列 7,如果该列没按键按下,则由行信号读出的值为 1111111;反之,当第二行有按键按下,则由行信号“行 1行 2 行 3”读出的值为 10

9、1,键盘的列选择信号以及行选择信号均为低电平有效。 附录一 不工作时 8 播放一首乐曲时,数码管也显示 1 播放第二首乐曲时,数码管也显示 2 9 外围电路板原理图 附录二 程序: 顶层文件 : Library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity top is port (clk0:in std_logic; start0:in std_logic; sel0:in std_logic; kbcol0:in std_log

10、ic_vector(0 to 3); kbrow0:out std_logic_vector(0 to 3); out_sound0:out std_logic; seg60:out std_logic_vector(0 to 6); choose0:in std_logic_vector(0 to 1) ); end; 10 architecture one of top is component music port(clk:in std_logic; start:in std_logic; out_sound1:out std_logic; sel:in std_logic; choos

11、e:in std_logic_vector(0 to 1); seg6:out std_logic_vector(0 to 6) ); end component; component piano port (clk,start:in std_logic; kbcol:in std_logic_vector(0 to 3); kbrow:out std_logic_vector(0 to 3); out_sound2:out std_logic; sel:in std_logic ); end component; component or22 port(a,b:in std_logic; c

12、:out std_logic); end component; signal g,h:std_logic; begin u1:music port map(clk=clk0,start=start0,choose=choose0,sel=sel0,out_sound1=g,seg6=seg60); u2:piano port map(kbcol=kbcol0,kbrow=kbrow0,clk=clk0,sel=sel0,start=start0,out_sound2=h); u3:or22 port map(a=g,b=h,c=out_sound0); end; 乐曲播放模块: Library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity music is generic( mid8:integer range 1000 to 4000:= 1911; mid9:integer range 1000 to 4000:= 1703; mid10:integer range 1000 to 4000:= 1517;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文资料库 > 毕业论文

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。