毕业论文基于fpga的电子琴说明书_第1页
毕业论文基于fpga的电子琴说明书_第2页
毕业论文基于fpga的电子琴说明书_第3页
毕业论文基于fpga的电子琴说明书_第4页
毕业论文基于fpga的电子琴说明书_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3.8程序设计流程图 程序设计的流程图如图4所示。 开始选择播放模式还是弹奏模式?对时钟信号进行分频得到4分音符的频率等待用户输入按键等待用户输入乐曲编号通过对键盘的扫描确定按键的位置显示乐曲编号根据所按键盘按键的位置,发出相应的频率根据乐曲的编号放出相应的乐谱的频率蜂鸣器发声图4 程序设计流程图 本设计所选用的管脚接口如图6所示: 图6 管脚借口示意图4、电子琴设计4.1乐曲播放功能设计 根据乐曲发声的基本原理,乐曲播放模块的设计思路是通过50MHz时钟分频的出1MHz信号,再对1MHz信号分频,获得音符节拍频率,通过查表方式获取音符分频数作为音符分频器模块分频的依据,将1MHz时钟分频获得合适的音符频率,输出至音频功放模块。电路结构框图如图7所示。音频输出 4Hz时钟系统频率节拍控制分频模块音符分频器乐曲选择与长度计数器乐曲存储 LED显示模块图7 乐曲播放模块结构图乐曲播放文件外部引脚及生成的符号如图8所示。其中clk为 50MHz系统频率,start为乐曲播放启动信号,sel为模块选择信号,choose为乐曲选择信号,本设计设定档sel为高电平时,模块工作,out_sound1为音频输出信号,seg6为数码管段码输出信号.图8 乐曲播放模块符号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=0; max_50 = 110001then max_50=000000; else max_50=max_50+1; end if; if max_50=000000then clk_1MHz=1; else clk_1MHz=0; end if; end if;end process;process(start,clk_1MHz)begin if start=0then clk_4Hz=0; max_250000 = 111101000010001111then max_250000=000000000000000000; else max_250000=max_250000+1; end if; if max_250000=000000000000000000then clk_4Hz=1; else clk_4Hzclk0,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实现了电子琴的自动演奏和键盘输入发音的简易功能,经过编程,综合,仿真,下载,调试,电路板制作,最终做出了成品,测试情况也良好,能够准确实现音阶的发音功能,可切换到乐曲播放存储好的乐曲,可根据需要更改程序从而实现不同乐曲的存储,也可以通过在4*4键盘上的按键来弹奏出不同的音调。在设计过程,由于对音乐的知识不够熟悉,所以没有实现电子琴那么完美的音乐。在本系统设计调试过程中,软件和硬件都出现了一些小错误。例如在焊接电路时,由于不够细心,把共阳极数码管的公共端焊接到地端上了;在把外围电路板上连接芯片时,由于选错了一两个管脚,而导致结果与预期的不同,浪费了很多时间找原因。在软硬件结合调试时,自动弹奏音乐时出现了噪音现象,经过了仔细检查所有程序,发现了问题是出现在分频模块的编写上,所用芯片的工作频率是50MHz,而程序中我的工作频率却设定为1MHz,于是我在播放模块中增加多一个50分频的程序,从而把问题解决了。61乐曲播放模块总结如果想要播放更多首乐曲的话,只需要增加choose的相应位数,和增加存储模块中的乐曲数。比如要播放8首乐曲,则可以设置choose:in std_logic_vector(2 downto 0),其中“000”代表第一首,“001”代表第二首,“010”代表第三首,“011”代表第五首,“100”代表第六首,“101代表第七首,“111”代表第八首。想要设置更多乐曲,可根据需要设定好合适的choose位数。另外,乐曲播放模块还可以采用查表方式来播放存储的乐曲,即在ROM中写入所要播放音乐的全部频率,通过编程来一一查找每一个频率,从而实现乐曲的播放。62乐曲弹奏模块总结除了采用4*4键盘作为按键输入外,还可以选择3*7键盘,采用3*7键盘的话,就可以设置每一个按键代表一个音符,也就是说21个音符都可以有不同的按键来弹奏,这样在弹奏乐曲时,在选择高、中、低音转换时,就不需要额外的按键,而且把按键的利用率达到100%,而在4*4键盘中,有6个按键是没用的,利用率比3*7键盘低。和4*4键盘扫描类似,3*7键盘可以采用扫描3个列检测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”读出的值为101,键盘的列选择信号以及行选择信号均为低电平有效。附录一 不工作时 播放一首乐曲时,数码管也显示1 播放第二首乐曲时,数码管也显示2 外围电路板原理图附录二程序:顶层文件: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_logic_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;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; choose: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:out std_logic);end component;signal g,h:std_logic;beginu1: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 isgeneric(mid8:integer range 1000 to 4000:= 1911;mid9:integer range 1000 to 4000:= 1703;mid10:integer range 1000 to 4000:= 1517;mid11:integer range 1000 to 4000:= 1432;mid12:integer range 1000 to 4000:= 1276;mid13:integer range 1000 to 4000:= 1137;mid14:integer range 1000 to 4000:= 1012;low1:integer range 1000 to 4000:= 3823;low2:integer range 1000 to 4000:= 3405;low3:integer range 1000 to 4000:= 3034;low4:integer range 1000 to 4000:= 2863;low5:integer range 1000 to 4000:= 2551;low6:integer range 1000 to 4000:= 2273;low7:integer range 1000 to 4000:= 2025;high15:integer range 100 to 4000:= 956;high16:integer range 100 to 4000:= 851;high17:integer range 100 to 4000:= 758;high18:integer range 100 to 4000:= 716;high19:integer range 100 to 4000:= 638;high20:integer range 100 to 4000:= 568;high21:integer range 100 to 4000:= 506);port(clk:in std_logic; start:in std_logic; out_sound1:out std_logic; sel:in std_logic; choose:in std_logic_vector(0 to 1) seg6:out std_logic_vector(0 to 6) );end music;architecture behav of music issignal clk_4Hz : std_logic;signal clk_1MHz : std_logic;signal count : integer range 0 to 4096;signal freq : integer range 0 to 4096;signal counter : integer range 0 to 150;signal max_250000 : std_logic_vector(17 downto 0);signal tmp:integer range 0 to 100;signal rset:std_logic;signal out_sound12:std_logic;signal out_sound11:std_logic;signal max_50 : std_logic_vector(5 downto 0);beginprocess(start,clk)begin if start=0then clk_1MHz=0; max_50 = 110001then max_50=000000; else max_50=max_50+1; end if; if max_50=000000then clk_1MHz=1; else clk_1MHz=0; end if; end if;end process;process(start,clk_1MHz)begin if start=0then clk_4Hz=0; max_250000 = 111101000010001111then max_250000=000000000000000000; else max_250000=max_250000+1; end if; if max_250000=000000000000000000then clk_4Hz=1; else clk_4Hz=0; end if; end if;end process; process(choose,clk) -选歌信号检测进程:variable a:std_logic_vector(0 to 1);variable b:std_logic_vector(0 to 1);variable c:std_logic_vector(0 to 1);beginif clkevent and clk=1 thenb:=a;a:=choose;c:= b - a;end if;if c=00 then rset=0;else rset=1;end if;end process; process(clk_4Hz,rset,start,choose) beginif start=0 then tmp=0;elsif rset=1 then tmp=56 then tmp=0;elsetmp counter=tmp;seg6 counter=tmp+57;seg6 counter=0;seg6freqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreq=0; end case;end process;process(clk_1MHz,start,sel)begin if sel=0then out_sound12=0; else if start=0then count=0; out_sound12=0; elsif clk_1MHzevent and clk_1MHz=1then if freq=0 then out_sound12=0; elsif count=0 then count=freq; out_sound12=1; else count=count-1; out_sound12=0; end if; end if; end if;end process;PROCESS(out_sound12) -二分颁,方波输出BEGIN IF out_sound12 EVENT AND out_sound12=1 THEN out_sound11 =NOT out_sound11; END IF; out_sound1=out_sound11;END PROCESS;end behav; 乐曲弹奏模块:Library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity piano isport (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 entity;architecture piano of piano issignal state:std_logic_vector(2 downto 0);signal clk1:std_logic;signal clk_1MHz : std_logic;signal d:std_logic_vector(4 downto 0);signal snote:std_logic_vector(4 downto 0);signal sscal:std_logic_vector(1 downto 0);signal cnt,scnt:std_logic_vector(9 downto 0);signal ctrln:std_logic_vector(2 downto 0);signal count,freq:integer range 0 to 4096;signal out_sound22:std_logic;signal out_sound21:std_logic;signal d0,d1,d2,d3,d_reg:std_logic_vector(4 downto 0);signal max_50 : std_logic_vector(5 downto 0);constant low1:integer:=3822; constant low2:integer:=3405;constant low3:integer:=3034;constant low4:integer:=2863;constant low5:integer:=2551;constant low6:integer:=2273;constant low7:integer:=2025;constant mid1:integer:=1911;constant mid2:integer:=1703;constant mid3:integer:=1517;constant mid4:integer:=1432;constant mid5:integer:=1276;constant mid6:integer:=1137;constant mid7:integer:=1012;constant high1:integer:=956;constant high2:integer:=851;constant high3:integer:=758;constant high4:integer:=716;constant high5:integer:=638;constant high6:integer:=568;constant high7:integer:=506;constant stop:integer:=0;beginprocess(start,clk)begin if start=0then clk_1MHz=0; max_50 = 110001then max_50=000000; else max_50=max_50+1; end if; if max_50=000000then clk_1MHz=1; else clk_1MHz=0; end if; end if;end process;clk1=cnt(9);process(clk_1MHz)beginif clk_1MHzevent and clk_1MHz=1thencnt=cnt+1;end if;end process;dkbrow=1110;stated0d0d0d0d0kbrow=1101;stated1d1d1d1d1kbrow=1011;stated2d2d2d2d2kbrow=0111;stated3d3d3d3d3state=000; if d=00000then d_reg=d; if scnt=100 then snote=00000; else scnt=scnt+1; end if; else scnt=0000000000; if d /= d_reg then d_reg=10001and d=10111then snote=sscal&d(2 downto 0); elsif d=11010then sscal=11; elsif d=11011then sscal=10; elsif d=11100then sscalstatefreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreqfreq=stop; end case; end process; process(clk_1MHz,sel,start)begin if sel=1or start=0then out_sound22=0; else if clk_1MHzevent and clk_1MHz=1then if freq=0 then out_sound22 =0; elsif count=0then count=freq; out_sound22=1; else count=count-1; out_sound22=0; end if; end if; end if;end process; PROCESS(out_sound22) -二分颁,方波输出BEGIN IF out_sound22 EVENT AND out_sound22=1 THEN out_sound21 =NOT out_sound21; END IF; out_sound2=out_sound21;END PROCESS;end piano; 或门模块:Library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity or22 is por

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论