简易电子琴的VHDL仿真与实现.doc_第1页
简易电子琴的VHDL仿真与实现.doc_第2页
简易电子琴的VHDL仿真与实现.doc_第3页
简易电子琴的VHDL仿真与实现.doc_第4页
简易电子琴的VHDL仿真与实现.doc_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

简易电子琴的vhdl设计与实现 一.设计课题与任务要求:设计制作一个简易电子琴演奏器。原理概述:根据声乐知识,产生音乐的两个因素是音乐频率的持续时间,音乐的十二平均率规定,每两个八音度之间的频率相差一倍,在两个八音度之间,又可分为12个半音。每两个半音的频率比为4。另外,音名a(乐谱中的低音6)的频率为440hz,音名b到c之间,e到f之间为半音,其余为全音。由此可以计算出乐谱中从低音1到高音1之间每个音名的频率如下表所示。表1 简谱中的音名与频率的关系音名频率(hz)音名频率(hz)音名频率(hz)低音1261.63中音1523.25高音11046.50低音2293.67中音2587.33高音21174.66低音3329.63中音3659.25高音31318.51低音4349.23中音4698.46高音41396.92低音5391.99中音5783.99高音51567.98低音6440中音6880高音61760低音7493.88中音7987.76高音71975.52基本要求:1、 用88点阵显示“1 2 3 4 5 6 7”七个音符构成的电子琴键盘。其中点阵的第一列用一个led点亮表示音符“1”,第二列用二个led点亮表示音符“2”,依此类推,如下图所示。1 2 3 4 5 6 7图1 点阵显示的电子琴键盘2、 用btn1btn7七个按键模拟电子琴手动演奏时的“1 2 3 4 5 6 7”七个音符。当某个按键按下时,数码管显示相应的音符,点阵上与之对应的音符显示列全灭,同时蜂鸣器演奏相应的声音;当按键弹开时数码管显示的音符灭掉,点阵显示恢复,蜂鸣器停止声音的输出。下图所示为按下btn3按键时点阵的显示情况。1 2 3 4 5 6 7图2 按键按下后的点阵显示3、 由拨码开关切换选择高、中、低音,并用数码管进行相应的显示。4、 通过按键btn0进行复位,控制点阵显示图1的初始状态。提高要求:1、 可通过一个拨码开关进行手动/自动演奏的切换,并与点阵显示配合增加自动演奏乐曲的功能。2、 增加手动演奏的音符存储、播放功能。二系统设计(包括设计思路、总体框图、分块设计)1.设计思路说明:电子琴的设计包括七个模块:弹奏模块keyplay、自动演奏模块autoplay、查表及显示模块table、分频模块fenpin、存储模块store、七段数码管显示模块seg7和点阵的显示模块lattice。 弹奏模块keyplay根据按键动作key,和高中低模式选择mode产生指示音调的index_key。自动演奏模块autoplay接收50mhz的时钟信号,输出index_auto。 存储录音模块store根据store1选择录音,用数组存储index_key,并将其传输给index_store,作为录音存储的数据。 查表及显示模块table根据按键button,replay选择采用index_key或index_auto或者index_store来查分频系数表,输出分频系数tone。对于tone的编码,采用了五位编码方式,高2位存储高中低音对应的11、01、00编码,低3位存储相应输入音调对应的二进制编码。 分频模块fenpin接收table输出的分频系数 tone,并据此分频,将对应频率的信号buzz输出给扬声器供其发声。七段数码管显示模块seg7根据对应的按键button,replay选择采用index_key或index_auto或者index_store,分别对应不同的数码管显示输出。点阵的显示模块lattice根据对应的按键button,replay选择采用index_key或index_auto或者index_store,分别对应不同的数码管显示输出。这样可以保证在不同的模式下点阵以及数码管都可以对应显示输出。2.总体框图与流程图 图1 系统实现流程图 图2 系统设计框图3.分块设计系统总体设计: 图3 顶层设计keyplay模块设计:将输入key6.0,mode编码为index_key4.0。index_key4.0的高两位表示高、中、低音,00表示低音,01表示中音、11表示高音。index_key4.0低三位表示音调,001表示do,010表示re,以此类推,000表示不发音。这样可以实现对不同按键模式下的编码,而这些编码会为后续模块例如seg7,lattice所使用。 图4 keyplay模块设计autoplay模块设计:把50mhz的输入时钟分频为16hz,作为节拍。将要自动演奏的歌曲预先写为index_auto的格式(index_auto格式与index_key格式相同)。以16hz 的频率将index_auto输出。这里需要用到计数器,此计数器的长度由演奏的歌曲长度而定。 图5 autoplay模块设计查表及显示模块table设计:(1)输入按键button,replay用于选择模式。由于是琴键式,不能根据button本身的值来选择模式。button为1且replay为0则把index_auto赋给内部信号index,button为0且replay为0则把index_key 赋给它,button为0且replay为1则把index_store 赋给它。(2)用index来查表,获得分频系数tone,输出。(3)同时根据index获得编码表示的高、中、低音的音调,输出给数码管和点阵。 图6 table模块设计分频模块fenpin设计:输入分频系数 tone。(1)设置内部信号i用于计数,clk_data作为分频结果。,每次clk上升沿检测i是否等于tone,相等则把i清零,并使clk_data翻转,否则i自增1。(2)把clk_data赋给输出信号buzz,由buzz驱动扬声器发声。 图7 fenpin模块设计seg7数码管模块设计:(1)由button和replay进行调用选择,选择采用index_key或index_auto或者index_store作为对应的信号index输入。(1)index分别对应不同的数码管显示输出。 图8 seg7模块设计lattice数码管模块设计:(1)由button和replay进行调用选择,选择采用index_key或index_auto或者index_store作为对应的信号index输入。(1)index分别对应不同的点阵输出显示 图9 lattice模块设计store存储模块设计:store模块使用了store1和replay控制录音和录音播放的选择。这里使用了一个二维数组来存储输入的按键信息,然后录音播放时可以按照输入的频率进行对应的播放。 图10 store模块设计三、仿真波形及仿真分析lattice模块仿真:波形分析:这里我只选择性地选取了键盘输入的对应点阵显示,首先键盘输入时button信号为低电平,所以可以从仿真图中看到button信号为低电平,且此时的复位信号无效,为低电平,此时key输入信号有效。在对应的时钟时钟信号输入下,当键盘输入信号key对应相应的输入时,点阵的行列也会有对应的输出。由于行的输出是扫描信号,所以对应时钟输入,点阵的行信号在对应的时钟分频下,分别对应一行输出低电平有效,表示扫描至该行,下一个时钟分频对应下一行的低电平输出。而对应列扫描,根据key输入的情况,分别对应列扫描的电平输出。如图,例如输入do时,有lie 11011111,row 01100000。fenpin模块仿真:可以看到,2(tone+1)代表的是分频系数,所以对应仿真如上图有,当tone为0时,为2分频,所以buzz对应着时钟的二分频,即分频系数与tone的关系为 分频系数=2(tone+1)。所以在计算每个音调对应的频率时,使用f=2(tone+1)。keyplay模块仿真:如图,对应着不同的key输入和mode选择,会译码为不同的index_key。比如mode=00,key=0000001时,有index_key译码为00001,mode=00,key=0001000时,有对应index_key译码为00100。仿真结果与预期要求相符。autoplay模块仿真:如图,对应时钟输入产生一定的节拍,在对应的节拍播放我预先设定的乐曲音调,可以看出,对应前三个节拍的为音调mi,接下来有一拍的停顿,接下来又是三个节拍的mi,和预先编写的jungle bells的乐曲对应auto-play输出一致。store模块仿真:如图,对应时钟上升沿若有按键,则记录;replay有效后,可以看到index_store有对应的赋值,表示有效的按键信息已经被存储。可以看到根据手动录入的index-key情况,对应replay时的index_store输出分别为10001,10110,01011seg7模块仿真:如图所示,对应的cat输出为时钟扫描信号,所着时钟变化,cat0,cat1,cat2, cat3,cat4,cat5依次出现低电平,表示对应的选通管有效,而a,b,c,d,e,f,g,dp则根据输入的key而变,可以看到,对应mi的输入的时候,数码管a,b,c,d,e,f,g,dp分别对应1,1,1,1,0,0,1,0,恰好可以显示数码管上的3字样。四、源程序(要有注释)electrorgan.vhl -顶层文件library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity electrorgan is -作为顶层文件,它包含实现功能用到的所有端口port ( clk :in std_logic; key:in std_logic_vector(6 downto 0); mode:in std_logic_vector(1 downto 0); cat:out std_logic_vector(5 downto 0); clr:in std_logic; button:in std_logic; replay:in std_logic; spkout :out std_logic; store1: in std_logic; atop:out std_logic; btop:out std_logic; ctop:out std_logic; dtop:out std_logic; etop:out std_logic; ftop:out std_logic; gtop:out std_logic; dptop:out std_logic; lietop:out std_logic_vector(7 downto 0); -列 comtop:out std_logic_vector(7 downto 0);-行 end electrorgan;architecture behave of electrorgan iscomponent autoplay -这里声明了顶层文件中包含的各模块port ( clk: in std_logic; clr:in std_logic; index_auto : out std_logic_vector(4 downto 0);end component;component store isport(index_key : in std_logic_vector(4 downto 0); clk : in std_logic; clr : in std_logic; store1: in std_logic; replay:in std_logic; index_store : out std_logic_vector(4 downto 0);end component;component fenpinport(clk:in std_logic; tone:in integer range 0 to 100000; buzz:out std_logic);end component;component lattice port(clk:in std_logic; lie:out std_logic_vector(7 downto 0); -列 com:out std_logic_vector(7 downto 0);-行 index_auto : in std_logic_vector(4 downto 0); index_key : in std_logic_vector(4 downto 0); clr:in std_logic; replay:in std_logic; index_store : in std_logic_vector(4 downto 0); button :in std_logic);end component;component tableport(index_auto:in std_logic_vector(4 downto 0); index_key:in std_logic_vector(4 downto 0); button :in std_logic; clr:in std_logic; replay:in std_logic; index_store : in std_logic_vector(4 downto 0); tone:out integer range 0 to 100000 );end component;component keyplayport(key:in std_logic_vector(6 downto 0); mode:in std_logic_vector(1 downto 0); index_key:out std_logic_vector(4 downto 0) );end component;component seg7 port( mode:in std_logic_vector(1 downto 0); cat:out std_logic_vector(5 downto 0); index_key:in std_logic_vector(4 downto 0); index_auto:in std_logic_vector(4 downto 0); replay:in std_logic; index_store : in std_logic_vector(4 downto 0); button :in std_logic; clk:in std_logic; a:out std_logic; b:out std_logic; c:out std_logic; d:out std_logic; e:out std_logic; f:out std_logic; g:out std_logic; dp:out std_logic );end component;signal index_auto_top :std_logic_vector(4 downto 0);signal index_key_top :std_logic_vector(4 downto 0);signal index_store_top :std_logic_vector(4 downto 0);signal tone_top :integer range 0 to 100000;begin -这里声明了各模块的端口与顶层端口的映射关系u1:autoplay port map(clk=clk,clr=clr,index_auto=index_auto_top);u2:fenpin port map(clk=clk,tone=tone_top,buzz=spkout);u3:table port map(replay=replay,index_store=index_store_top,index_auto=index_auto_top,clr=clr,index_key=index_key_top,tone=tone_top,button=button);u4:keyplay port map(key=key,index_key=index_key_top,mode=mode);u5:seg7 port map(replay=replay,index_key=index_key_top,cat=cat,index_store=index_store_top, clk=clk,button=button,mode=mode,index_auto=index_auto_top,a=atop,b=btop,c=ctop,d=dtop,e=etop,f=ftop,g=gtop,dp=dptop);u6:lattice port map(replay=replay,index_auto=index_auto_top,index_store=index_store_top,clr=clr,index_key=index_key_top,button=button,lie=lietop,com=comtop,clk=clk);u7:store port map(index_key=index_key_top,clr=clr,clk=clk,index_store=index_store_top, store1=store1,replay=replay);end behave;autoplay.vhl -自动播放模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity autoplay isport (clk: in std_logic; clr:in std_logic; -这里声明了一个复位端口 index_auto : out std_logic_vector(4 downto 0);end;architecture behave of autoplay issignal count :integer range 0 to 136; -可根据乐曲长度改变signaljiepai: std_logic;signalj: integer range 0 to 1562500;beginjiepai1:process(clk) -分频产生16hz的节拍beginif clk event and clk = 1 thenif j = 1562500thenj = 0;jiepai = not jiepai;elsej = j+1;end if;end if;end process jiepai1;process(jiepai,clr)beginif(clr=0) then if jiepaievent and jiepai=1 then -这里相当于一个计数器 if count=136 then count=0; -可根据乐曲长度改变 else count=count+1; end if; end if;else count index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_autoindex_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_autoindex_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto index_auto null;end case;end process;end behave;table.vhl -查表模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith;use ieee.std_logic_unsigned.all;entity table isport(index_key:in std_logic_vector(4 downto 0); -这里是对键盘输入音符的编码index_auto:in std_logic_vector(4 downto 0); -这里是对自动播放音符的编码button :in std_logic;clr:in std_logic;replay:in std_logic;index_store : in std_logic_vector(4 downto 0); -这里是对录入存储音符的编码tone:out integer range 0 to 100000);end;architecture search of table issignal index: std_logic_vector(4 downto 0); beginp1:process(button,replay) -选择使用哪种播放模式的音符输入beginif (button = 1and replay = 0 )then index= index_auto; elsif (button = 0 and replay= 0 )then index= index_key;elsif (button = 0 and replay= 1) then index tone tone tone tone tone tone tone tone tone tone tone tone tone tone tone tone tone tone tone tone tone tone=0;end case;elsif(clr=1) then tone=0; -复位后,没有声音输出end if;end process p2 ;end search;keyplay.vhl -键盘输入模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith;use ieee.std_logic_unsigned.all;entity keyplay isport(mode:in std_logic_vector(1 downto 0); -代表高中低音的选择key:in std_logic_vector(6 downto 0); index_key:out std_logic_vector(4 downto 0);end;architecture behave of keyplay issignal md:std_logic_vector(8 downto 0);begin md index_key index_key index_key index_key index_key index_key index_key index_key index_key index_key index_key index_key index_key index_key index_key index_key index_key index_key index_key index_key index_key index_key=00000;end case;end process ;end behave;fenpin.vhl -分频模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use iee

温馨提示

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

评论

0/150

提交评论