数字逻辑课程设计之电子琴

上传人:ji****72 文档编号:27376164 上传时间:2018-01-09 格式:DOCX 页数:8 大小:25.54KB
返回 下载 相关 举报
数字逻辑课程设计之电子琴_第1页
第1页 / 共8页
数字逻辑课程设计之电子琴_第2页
第2页 / 共8页
数字逻辑课程设计之电子琴_第3页
第3页 / 共8页
数字逻辑课程设计之电子琴_第4页
第4页 / 共8页
数字逻辑课程设计之电子琴_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《数字逻辑课程设计之电子琴》由会员分享,可在线阅读,更多相关《数字逻辑课程设计之电子琴(8页珍藏版)》请在金锄头文库上搜索。

1、数字逻辑课程设计之电子琴实验内容:设计一个八音电子琴,能通过八个键进行手动控制音响,也可以通过自动控制有效自动播放一段音乐。实验设计:本实验分为四个模块:一个模块是主程序,一个模块是自动播放音乐部分,一个模块是音调发生器部分,一个模块是数控分频部分。通过接口和结构体 component 的定义将各个模块连接起来。本程序总的有 11 个输入, 1 个输出,2 个输入为时钟脉冲,1个输入是控制电子琴自动演奏或者手动演奏的使能端,8 个输入端为电子琴的八个键,1 个输出为扬声器输出音乐。在音调发生器部分中,需要按照模=50000/频率的方法进行分频,但是要达到提高音量使占空比为 50%的效果还需要再

2、对信号进行二分频,因此最后得到的音调发生器进行分频预置值如下:音符 (C) 1 2 3 4 5 6 7 i频率(Hz) 262 294 330 349 392 440 494 523模 95 85 75 71 63 56 50 47当某位音符电平输入有效时,对应不同的分频预置值,将分频预置值输出并作为数控分频部分的输入,分频预置值控制对主频的分频。在数控分频部分,将输入的分频预置值和时钟脉冲作为输入,最后输出直接连接扬声器。这一部分一共包含了两个进程,第一个进程是根据不同音符的不同频率进行在主频下进行分频,得到音符的相应频率,第二个进程是为了提高音量使占空比为 50%而进行二分频。在自动播放部

3、分,1 个时钟脉冲输入, 1 个自动播放的使能端输入,还有 8 个音符的键为输入,输出为音符对应的 8 位高低电平,输出连接到音调发生器的 8 位输入,如果自动播放的使能端(auto )无效则进行手动操作,在手动操作下,该模块的输出直接为输入。如果自动播放的使能端输入有效,则播放事先存储的一段音乐,首先将主频 50进行 10000 分频,因此一个脉冲为 .秒,每来一个脉冲进行计数并播放一个音符。直到设置的音符全部播放完毕,计数器回。源代码:主模块部分:定义了结构体和各模块函数library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_

4、arith.all;use ieee.std_logic_unsigned.all;entity piano isport(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 iscomponent autoplay is自动播放部分port(A:in std_logic_vector(7 downto 0);B,C:in std_logic;D:out std_logic_v

5、ector(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);自动播放部分的输出和音调发生

6、器的输入,表示八个音符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

7、.all;use ieee.std_logic_unsigned.all;entity autoplay isport(A:in std_logic_vector(7 downto 0); -A=inplay,B=auto,C=clk0,D=sw0B,C:in std_logic;D:out std_logic_vector(7 downto 0);end autoplay;architecture music of autoplay issignal clk2:std_logic; -对 50脉冲进行分频得到的的脉冲信号signal count0:integer range 0 to 62;

8、 -记录自动播放的乐曲的脉冲并控制播放signal count3:integer range 0 to 10000;-分频时的计数beginseparate:process(C,B)分频将脉冲变为的信号beginif B=0 then count3 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 pr

9、ocess;end rtl;数控分频模块:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity control isport(A:in std_logic; 时钟信号B:in integer range 0 to 170;各音符的模值C:out std_logic);end control;architecture abc of control issignal spk:std_logic;begintwoclock:process

10、(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;beginif(spkevent and spk=1) then count2:=not count2;if

11、count2=1 then C=1;else C=0;end if;end if;end process;end abc;实验总结:在这次实验中,我们首先想到的是做实现手动操作的电子琴,但是在后面的电子钟实验中整点报时时需要播放一段音乐,因此想到了在电子琴的实验中实现手动操作和自动播放两种模式,,并且也遇到了很多问题。在初学 VHDL 语言时并没有编写复杂的程序,但是在这次课程设计中涉及到了工程、模块、分频等内容, ,接触了很多新的内容,也遇到了很多困难,但是通过小组的讨论和学习都得到了很好的解决。遇到的问题 1、:只知道分频的含义而不知道 VHDL 语言中怎么实现操作。解决:通过查资料知道了

12、分频是通过计数记录脉冲的个数,根据要求按照脉冲的个数调整输出脉冲。2、不知道怎么实现自动播放。解决:通过来脉冲信号的个数来控制每个音符的输出,每个脉冲对应每个音符。3、编译错误很多,存在各个模块之间的接口的定义不一致的情况而导致的编译错误,在自动播放模块中与主函数的定义不匹配,导致代码的变量多处不匹配。而且在自动播放模块与音调发生器模块的连接接口也有不匹配的情况,所以在编译器的提示下将这些问题一一解决了。在自动播放部分,在进程中定义了一个 variable 变量 count0 但是对它赋值的语句也不能通过编译,在改为 signal 变量并在进程外定义时编译通过了。4、在进行自动播放时由于没有对频率进行调整因此播放出来的音乐是不正确的,因此调整了频率,并进行分频操作,使得两个音符之间间隔为 0.2 秒。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号