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

下载本文档

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

文档简介

1、简易电子琴的 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

2、咼音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、用8 X 8点阵显示“ 1 2 3 4 5 6 7 ”七个音符构成的电子琴键盘。其中点阵的第一列 用一个LED点亮表示音符“1”,第二列用二个LED点亮表示音符“2”,依此类推, 如下图所示。OOOOOOOO00*9 oooo ooooo* oooooo44spkoutA Rt-I u图3 顶层设计Ke

3、yplay模块设计:将输入 key6.O, mode编码为 index_key4.O。index_key4.O的高两位表示 高、中、低音,00表示低音,01表示中音、11表示高音。index_key4.0低三位 表示音调,001表示do, 010表示re,以此类推,000表示不发音。这样可以实现 对不同按键模式下的编码,而这些编码会为后续模块例如seg7, lattice所使用。1hdeK_keykeyplay :nit j de图4keyplay模块设计autoplay模块设计:把50MHz的输入时钟分频为16Hz,作为节拍。将要自动演奏的歌曲预先写为 index_auto 的格式(inde

4、x_auto格式与index_key格式相同)。以16Hz的频率将index_auto输出。这里 需要用到计数器,此计数器的长度由演奏的歌曲长度而定。In.dei_autautoplay 图5autoplay模块设计查表及显示模块table设计:(1) 输入按键button,replay用于选择模式。由于是琴键式,不能根据button本身的 值来选择模式。button为1且replay为0则把index_auto赋给内部信号index, button为0且replay为0则把index_key赋给它,button为0且replay为1则把 in dex_store 赋给它。(2) 用index

5、来查表,获得分频系数tone,输出。(3) 同时根据index获得编码表示的高、中、低音的音调,输出给数码管和点阵。Index kevIndex autnIndex storeelktabletonerep 1 nybuttontable模块设计分频模块fen pin设计:输入分频系数to neo设置内部信号i用于计数,clk_data作为分频结果。,每次elk上升沿检测i是 否等于tone,相等则把i清零,并使clk_data翻转,否则i自增1。(2)把clk_data赋给输出信号buzz,由buzz驱动扬声器发声。1B JellLbuzzP-=fenpin3-ton图7fen pin模块设

6、计seg7数码管模块设计:由button和replay进行调用选择,选择采用 index_key或index_auto或者 index_store作为对应的信号index输入。(1)index分别对应不同的数码管显示输出。IndrfjHiTc ldrsic -Tctteat扎bB d弩贏;dpsegmentnxxieseg7模块设计图8lattice数码管模块设计:由button和replay进行调用选择,选择采用 index_key或index_auto或者 index_store作为对应的信号index输入index分别对应不同的点阵输出显示IndexIndexIndex keyComla

7、tticeclrlattice模块设计lieStore存储模块设计:Store模块使用了 store1和replay控制录音和录音播放的选择。这里使用了一个 二维数组来存储输入的按键信息,然后录音播放时可以按照输入的频率进行对应 的播放。三、仿真波形及仿真分析lattice模块仿真:習 Fif Eiit VFew Projwt 里signwwnts ProcKsirq TmIs Winda# Help-j K母b Majitr Time SeriBSmi彳FioHcrJCmrft1刚就ii.a+n;Sint-Errt|r1iceirlai?ice - dbce - imuhtjon R?par

8、i - &mdd!inn XVavrTornii;era/Kl FlIi诃ASlmulfftion Repi fe+ j| Legal Notict 归 Row$umi*w |ffl How Settirg |J Simulator gQ Surnma 身露 Settings 豹 Sirrdatk I 爭_15irrdatk 身基INI U開g gW Messagfira寸日IUHOH疔冃呼7斷1LD U皿吃M L3廿ML5Lb衬LT祎LBy -.Q 3 -.2 1 -切El 13 E- T b -.S) - - - 3 - 1) IM-.T . bl - 4-.I-.DI:; 5 niXIX

9、IIIXIAlII11t厂邸帅烦邮功审旧:馬B:xinniJ:ir厂可闻厂冏伽(ri序订r厂辟何任獅厂回:(,rLrJ11l iJi-L11J11n_1_J LL1rii rL111111L11_I1.:.1l_ .11.1L01)嗣Y圄51】i HE I-加胡1X 创K【】m J腳】53 t:羽Ll 】KT 1 歸 If【旳【叩】sr1L1rLDJK CEi: Ml )( i X 22 J: 0:;;饵 J( 3I -n Jt Po)L * XrjlK jHKsage: Ddlll* llraifJ匾捉1jFbr He. pr卿 Fl*d rNUM波形分析:这里我只选择性地选取了键盘输入的对

10、应点阵显示, 首先键盘输入时button 信号为低电平,所以可以从仿真图中看到button信号为低电平,且此时的复位信 号无效,为低电平,此时key输入信号有效。在对应的时钟时钟信号输入下,当键盘输入信号key对应相应的输入时,点阵的行列也会有对应的输出。由于行的 输出是扫描信号,所以对应时钟输入,点阵的行信号在对应的时钟分频下,分别对应一行输出低电平有效,表示扫描至该行,下一个时钟分频对应下一行的低电 平输出。而对应列扫描,根据key输入的情况,分别对应列扫描的电平输出。如图,例如输入 do 时,有 lie 11011111, row 01100000。fenpin模块仿真:爭 臼 E* 里

11、凶甲T AMKrmvrta Dcnaip Toah WF-dowff ND CS L 口 at/攀零越 4*气耸疏時彎 叭1 也I u)| 毋 Swdaliwi- sUunWnSuM31M ktU4C driita TlftlEkCR 加eT祕曲Illrri土和换 IMIM血I14214mSik |E械誉乓*;略乳VIEEriUX h-4 .M:L_l U U U U L_l U U LIlln n rjirULW-inrutnrtrrirLrLWLWuLnrtnnrLmnRTinrLnrLrTirLmjiRWuLnnrnrLrjuirLuirLinrULnrLrvuirLU1|r)I( 1对

12、(ii| g |舒35;3|)r;( T| 、;議 |1 T|ht|斜工ClSlyai切li.3XI-.2li11II-.0liisirrelA0”,4】ki-.3ii-.!Ai IAiitVtlu15 LTJ血删1咄伽伽啊顺伽伽血伽mwnnimrmmHfflm_-Lr_rLr_-L-_rLr_rLrLrLr_rLrLrLrLrLr_-L-LrLr_rLLTLr_rLrLrL-1L3L9JJ如图,对应时钟上升沿若有按键,则记录;replay有效后,可以看到index_store 有对应的赋值,表示有效的按键信息已经被存储。可以看到根据手动录入的index-key 情况,对应 replay 时的

13、 index_store输出分别为 10001,10110,01011Seg7模块仿真:脣丄也血mJlOSutHeiwi*.的炖SlwlEnd |如图所示,对应的 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字样。四、源程序(要有注释)electrorga n. vhl-顶层文件library IEEE;us

14、e 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:i n std_logic_vector(1 dow nto 0);cat:out std_logic_vector(5 downto 0);clr:in std_logic;butt on:i n stdo

15、 gic;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 downt

16、o 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 is port(index_key : in std_logic_vector(4 downto 0);clk : in std_logic; clr : in st

17、d_logic; store1: in std_logic; replay:in std_logic;index_store : out std_logic_vector(4 downto 0); end component;component fenpin port(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);

18、-列 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_v

19、ector(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(

20、1 downto 0); index_key:out std_logic_vector(4 downto 0) );end component;component seg7PORT(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

21、_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_vecto

22、r(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

23、=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_a

24、uto=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)Ju7:store port map(index_key=index_key_top,clr=clr,clk=c

25、lk,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

26、 downto 0);end;architecture behave of autoplay issignal count :integer range 0 to 136;- 可根据乐曲长度改变signal jiepai: std_logic;signal j: integer range 0 to 1562500;beginjiepai1: process(clk)-分频产生 16Hz 的节拍begin if clk event and clk = 1 then if j = 1562500 then j = 0;jiepai = not jiepai; elsej = j+1;end if

27、;end if;end process jiepai1;process(jiepai,clr)begin if(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_au

28、toindex_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 in

29、dex_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

30、_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 ind

温馨提示

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

最新文档

评论

0/150

提交评论