数字逻辑课程设计之电子琴.docx_第1页
数字逻辑课程设计之电子琴.docx_第2页
数字逻辑课程设计之电子琴.docx_第3页
数字逻辑课程设计之电子琴.docx_第4页
数字逻辑课程设计之电子琴.docx_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

数字逻辑课程设计之电子琴实验内容:设计一个八音电子琴,能通过八个键进行手动控制音响,也可以通过自动控制有效自动播放一段音乐。实验设计:本实验分为四个模块:一个模块是主程序,一个模块是自动播放音乐部分,一个模块是音调发生器部分,一个模块是数控分频部分。通过接口和结构体component的定义将各个模块连接起来。本程序总的有11个输入,1个输出,2个输入为时钟脉冲,1个输入是控制电子琴自动演奏或者手动演奏的使能端,8个输入端为电子琴的八个键,1个输出为扬声器输出音乐。在音调发生器部分中,需要按照模=50000/频率的方法进行分频,但是要达到提高音量使占空比为50%的效果还需要再对信号进行二分频,因此最后得到的音调发生器进行分频预置值如下:音符 (C)1234567i频率(Hz)262294330349392440494523模9585757163565047当某位音符电平输入有效时,对应不同的分频预置值,将分频预置值输出并作为数控分频部分的输入,分频预置值控制对主频的分频。在数控分频部分,将输入的分频预置值和时钟脉冲作为输入,最后输出直接连接扬声器。这一部分一共包含了两个进程,第一个进程是根据不同音符的不同频率进行在主频下进行分频,得到音符的相应频率,第二个进程是为了提高音量使占空比为50%而进行二分频。在自动播放部分,1个时钟脉冲输入,1个自动播放的使能端输入,还有8个音符的键为输入,输出为音符对应的8位高低电平,输出连接到音调发生器的8位输入,如果自动播放的使能端(auto)无效则进行手动操作,在手动操作下,该模块的输出直接为输入。如果自动播放的使能端输入有效,则播放事先存储的一段音乐,首先将主频50进行10000分频,因此一个脉冲为.秒,每来一个脉冲进行计数并播放一个音符。直到设置的音符全部播放完毕,计数器回。源代码:主模块部分:定义了结构体和各模块函数library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity piano is port(clk0,clk1:in std_logic; auto:in std_logic; inplay:in std_logic_vector(7 downto 0); play:out std_logic); end piano;architecture run of piano is component autoplay is自动播放部分 port(A:in std_logic_vector(7 downto 0); B,C:in std_logic; D:out std_logic_vector(7 downto 0); end component; component tone is音调发生器部分 port(A:in std_logic_vector(7 downto 0); B:out integer range 0 to 170); end component; component control is数控分频部分 port(A:in std_logic; B:in integer range 0 to 170; C:out std_logic); end component; signal sw0:std_logic_vector(7 downto 0);自动播放部分的输出和音调发生器的输入,表示八个音符 signal tone0:integer range 0 to 170;音调发生器的输出和数控分频部分的输入,表示音符的频率begin 在这个进程中把各个部分连接起来 G1:autoplay port map(A=inplay,B=auto,C=clk0,D=sw0); G2:tone port map(A=sw0,B=tone0); G3:control port map(A=clk1,B=tone0,C=play);end run;自动播放模块:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity autoplay is port(A:in std_logic_vector(7 downto 0); -A=inplay,B=auto,C=clk0,D=sw0 B,C:in std_logic; D:out std_logic_vector(7 downto 0);end autoplay;architecture music of autoplay is signal clk2:std_logic; -对50脉冲进行分频得到的的脉冲信号 signal count0:integer range 0 to 62; -记录自动播放的乐曲的脉冲并控制播放 signal count3:integer range 0 to 10000;-分频时的计数 begin separate:process(C,B)分频将脉冲变为的信号 begin if B=0 then count3=0;clk2=0; elsif(Cevent and C=1) then count3=count3+1; if count3=5000 then clk2=1; elsif count3=10000 then clk2=0;count3=0; end if; end if; end process; half:process(clk2) begin if(clk2event and clk2=1) then如果脉冲个数多于自动播放的音符,则计数器回,否则记录第几个脉冲 if count0=62 then count0=0; else count0 D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D null; end case; else DBBBBBBBBB=170; end case; end process;end rtl;数控分频模块:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity control is port(A:in std_logic;时钟信号 B:in integer range 0 to 170;各音符的模值 C:out std_logic);end control;architecture abc of control is signal spk:std_logic; begintwoclock:process(A,B)将各个音符按照不同的模值分频得到各音符的频率的倍 variable count1:integer range 0 to 170; begin if(Aevent and A=1) then if count1=B then count1:=0;spk=1; else count1:=count1+1;spk=0; end if; end if; end process;reverse:process(spk)二分频使占空比为并直接输出 variable count2:std_logic; begin if(spkevent and spk=1) then count2:=not count2; if count2=1 then C=1; else C=0; end if; end if; end process;end abc;实验总结:在这次实验中,我们首先想到的是做实现手动操作的电子琴,但是在后面的电子钟实验中整点报时时需要播放一段音乐,因此想到了在电子琴的实验中实现手动操作和自动播放两种模式,,并且也遇到了很多问题。在初学VHDL语言时并没有编写复杂的程序,但是在这次课程设计中涉及到了工程、模块、分频等内容,接触了很多新的内容,也遇到了很多困难,但是通过小组的讨论和学习都得到了很好的解决。遇到的问题1、:只知道分频的含义而不知道VHDL语言中怎么实现操作。解决:通过查资料知道了分频是通过计数记录脉冲的个数,根据要求按照脉冲的个数调整输出脉冲。2、不知道怎么实现自动播放。解决:通过来脉冲信号的个数来控制每个音符的输出,每个脉冲对应每个音符。3、编译错误很多,存在各个模块之间的接口的定义不一致的情况而导致的编译错误,在自动播放模块中与主函数的定义不匹配,导致代码的变量多处不匹配

温馨提示

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

最新文档

评论

0/150

提交评论