《「数字逻辑课程设计之电子琴」.pdf》由会员分享,可在线阅读,更多相关《「数字逻辑课程设计之电子琴」.pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、数字逻辑课程设计之电子琴 实验内容:设计一个八音电子琴,能通过八个键进行手动控制音响,也可以通过自动控制有效自动播放一段音乐。实验设计:本实验分为四个模块:一个模块是主程序,一个模块是自动播放音乐部分,一个模块是音调发生器部分,一个模块是数控分频部分。通过接口和结构体 compnnt 的定义将各个模块连接起来。本程序总的有 1个输入,1 个输出,2 个输入为时钟脉冲,1 个输入是控制电子琴自动演奏或者手动演奏的使能端,8 个输入端为电子琴的八个键,1 个输出为扬声器输出音乐。在音调发生器部分中,需要按照模=50000/频率的方法进行分频,但是要达到提高音量使占空比为 5%的效果还需要再对信号进
2、行二分频,因此最后得到的音调发生器进行分频预置值如下:音符(C)1 2 3 4 5 6 7 频率()22 330 3 32 44 44 523 模 95 85 71 6 56 50 47 当某位音符电平输入有效时,对应不同的分频预置值,将分频预置值输出并作为数控分频部分的输入,分频预置值控制对主频的分频。在数控分频部分,将输入的分频预置值和时钟脉冲作为输入,最后输出直接连接扬声器。这一部分一共包含了两个进程,第一个进程是根据不同音符的不同频率进行在主频下进行分频,得到音符的相应频率,第二个进程是为了提高音量使占空比为 5%而进行二分频。在自动播放部分,1 个时钟脉冲输入,1 个自动播放的使能端
3、输入,还有 8 个音符的键为输入,输出为音符对应的 8 位高低电平,输出连接到音调发生器的 8 位输入,如果自动播放的使能端(auto)无效则进行手动操作,在手动操作下,该模块的输出直接为输入。如果自动播放的使能端输入有效,则播放事先存储的一段音乐,首先将主频50Z 进行 10000 分频,因此一个脉冲为 0秒,每来一个脉冲进行计数并播放一个音符。直到设置的音符全部播放完毕,计数器回。源代码:主模块部分:定义了结构体和各模块函数 librr iee;use ieee.std_og_164all;ue iee._logc_rth.al;use ieee.std_lgc_nsin.all;etit
4、y iano s por(lk0,clk1:n std_loi;uo:i st_logic;nply:in td_loic_vecr(7 dono 0);play:ot d_li);end piano;achtectur un of p is cmponn autoplay is -自动播放部分 por(A:i std_gic_etor(7 owto 0);B,C:n std_loic;D:u td_logi_ector(7 dont);end cmponent;cmoent ton -音调发生器部分 port(A:in std_logic_ecto(7 donto 0);B:ot integ
5、er range 0 o 0);nd cmponet;cmonen coro i -数控分频部分 ort(A:in td_ic;B:n iteger rane to 0;C:ou std_loic);end omponen;snal 0:st_logi_vecto(dwno 0);自动播放部分的输出和音调发生器的输入,表示八个音符 signal tone0:itege rane t 17;-音调发生器的输出和数控分频部分的输入,表示音符的频率 begin 在这个进程中把各个部分连接起来 G:atolay port map(A=inplay,B=auo,C=clk0,D=0);2:ot mp(A
6、=w0,=toe0);G3:contrl ot map(A=clk1,Bte,=play);end run;自动播放模块:ibrry ieee;ue ieee.stdlgc_116.all;use ieee.std_lgic_rhall;use iee.std_ogc_unsignd.a;eity auoplay is port(A:n td_logi_vector(7 dwno 0);-Aipay,=auo,C=clk0,sw0 B,C:in std_lgi;D:ou std_logic_vetor(7 donto));nd autpa;rchteure musc o utoplay sga
7、l clk:sd_loc;-对 50脉冲进行分频得到的 5H的脉冲信号 gnal count0:integer rae t 62;-记录自动播放的乐曲的脉冲并控制播放 sigal cun3:itegr rag 0 to 0000;分频时的计数 ein separae:rocess(,B)分频将脉冲变为 5HZ 的信号 bgin i B=0 thn cont3=0;clk0;esif(Cevet and C=)the cou3=coun+;if cout3=5000 the clk2=;elsif count3=10000 then cl=0;ot3=;end i;end if;end oes;
8、hlf:proces(lk2)bgi if(cl2et and clk21)hen 如果脉冲个数多于自动播放的音符,则计数器回 0,否则记录第几个脉冲 if cout0=62 tn cout0=;els count D D D D D=00001;hen 9=D=0000010;wen 10 D D=00100;whn =D=0010000;we 3 D D D D D D D D D=00010000;hen 26=D D D D00010;when 33=D D=0000;whn 35=00000;hen 36=D D D00000;when =000000;when 4 D D=000000;when 43=D D=0000100;when 45=000100;whn 6=D D D D=000000;when 1=D D D D=00010;whe 55=D D0001;hen 57=D D D null;end cse;ele DA;-如果不进行自动播放,则将输入 8 位音符直接输出,并且不执行前两个进程的操作 n if;e proces;nd usic;音调发生器模块:irary eee;se ieee.std_lgc_1164.l;se ieee.stdlogica.all;