文档库 最新最全的文档下载
当前位置:文档库 › 北邮数字逻辑课程设计-简易电子琴

北邮数字逻辑课程设计-简易电子琴

简易电子琴实验报告

综合设计:

程序编写:

实验报告撰写:北京邮电大学计算机学院某人

一.实验目的

1.掌握较复杂逻辑的设计和调试。

2.掌握用VHDL语言设计数字逻辑电路。

3.掌握ispLEVER软件的使用方法。

4.掌握ISP器件的使用。

5.用途: 有电子琴的基本功能,可弹奏出简单的乐曲。

二.实验器材

1.在系统可编程逻辑器件1032E

2.示波器

3.逻辑测试笔

4.TEC-5实验系统

三.实验内容

设计一个简易电子琴,有两种模式,既可以音阶弹奏,也可以自动播放乐曲。要

求音阶弹奏的时候,可以弹奏高音低音一共14个不同音符,自动播放乐曲的时候,要求可以按一定节奏自动播放一首预存在系统中的乐曲。

四.实验设计原理

从试验系统外部接入一个时钟信号,对时钟信号进行分频,可以得到不同分频的脉冲信号。当这个分频值设定为一定的数值时,就可以使试验系统的喇叭发出不同的音符,从而完成音阶演奏。自动演奏时,除了对外部时钟进行分频得到不同的音符外,还需要通过时钟信号对节拍进行控制,设置该音乐最短的音符为基本单位,一步一步往后执行,根据某个音符的节拍数来确定执行时间,从而可以按照节奏将一段音乐自动演奏出来。

五.设计方案

1.一共有14个琴键,表示中音的1-7到低音的1-7,按照电子琴的排列布局来安排琴键位置。

2.根据不同音符的频率,用多模计数器对时钟信号进行分频,得到特定的脉冲信号,为了使信号稳定,需要对其进行翻转得到2分频信号再输出。

3.综合原理图

4.外部输入50kHz的时钟信号,根据下表用多模计数器对时钟信号进行分频,得到分频系数。

低音部分

高音部分

六.程序实现

*********************************实体部分*************************************

libraryieee;

use ieee.std_logic_1164.all;

useieee.std_logic_arith.all;

useieee.std_logic_unsigned.all;

entityOrgen is

port

(

moderm:instd_logic;--模式选择,0为音阶自演奏模式,1为自动播放模式

clk:instd_logic;--时钟信号

Index:instd_logic_vector(13 downto 0);--琴键选择信号,1表示选择摸个琴键,共有14个

琴键,可以选择14个音,分别是

低音1-7和中音1-7

Code:outstd_logic_vector(6 downto 0);--七段发光二极管编码,用于显示弹奏的音符high:outstd_logic;--如果是中音,小灯亮,反之不亮

tone0:inout integer range 0 to 2047;--分频系数

result:inoutstd_logic--输出音频信号

);

endOrgen;

*******************************结构体部分************************************

architecture Orgen_Player of Orgen is--程序使用的是50kHz的时钟信号

begin

Search:process(Index,clk,moderm)--Search进程,根据琴键选择信号得到不同的分频系数variablestep:integer range 0 to 2000;

variable count2:integer range 0 to 2000;

begin

***************************音阶演奏模式部分**********************************

if Moderm='0' then--手动音阶演奏模式

case Index is

when "00000000000001"=> tone0<=96;Code<="0000110";high<='0';--1

when "00000000000010"=> tone0<=85;Code<="1011011";high<='0';--2

when "00000000000100"=> tone0<=76;Code<="1001111";high<='0';--3

when "00000000001000"=> tone0<=72;Code<="1100110";high<='0';--4

when "00000000010000"=> tone0<=64;Code<="1101101";high<='0';--5

when "00000000100000"=> tone0<=57;Code<="1111101";high<='0';--6

when "00000001000000"=> tone0<=51;Code<="0000111";high<='0';--7

when "00000010000000"=> tone0<=48;Code<="0000110";high<='1';--1

when "00000100000000"=> tone0<=43;Code<="1011011";high<='1';--2

when "00001000000000"=> tone0<=38;Code<="1001111";high<='1';--3

when "00010000000000"=> tone0<=36;Code<="1100110";high<='1';--4

when "00100000000000"=> tone0<=32;Code<="1101101";high<='1';--5

when "01000000000000"=> tone0<=28;Code<="1111101";high<='1';--6

when "10000000000000"=> tone0<=25;Code<="0000111";high<='1';--7

when others=> tone0<=0;Code<="0000000";high<='0';--根据不同的琴

键信号,分配

了不同的分频

系数,为不同

音名的发光二

极管编码,同

时调整高低音

显示信号

end case;

end if;

******************************自动演奏部分************************************

if (moderm='1') and (clk'event and clk='1') then--自动演奏模式

--tone0<=0;--从手动音阶模式切换到自动演奏模式,首先将tone0变为0,防

止影响

if count2<50000 then

count2:=count2+1;--1秒输出1拍

else

count2:=0;

case step is

when 0=>

tone0<=57;

step:=step+1;

when 1=>

tone0<=57;

step:=step+1;

when 2=>

tone0<=38;

step:=step+1;

when 3=>

tone0<=38; step:=step+1;

when 4=>

tone0<=36; step:=step+1;

when 5=>

tone0<=36; step:=step+1;

when 6=>

tone0<=38; step:=step+1;

when 7=>

tone0<=38; step:=step+1;

when 8=>

tone0<=43; step:=step+1;

when 9=>

tone0<=43; step:=step+1;

when 10=>

tone0<=48;

step:=step+1;

when 11=>

tone0<=48;

step:=step+1;

when 12=>

tone0<=51;

step:=step+1;

when 13=>

tone0<=51;

step:=step+1;

when 14=>

tone0<=57;

step:=step+1;

when 15=>

tone0<=57;

step:=step+1;--step不同,表示乐曲演奏到不同的位置,赋予不

同的分频系数,然后step+1

end case;

end if;

end if;

end process;

**************************发生进程,控制喇叭发声******************************

Made_Code:process(clk)--发声进程,发出不同的音频

variable count1:integer range 0 to 2000;

begin

ifclk'event and clk='1' then

if count1

count1:=count1+1;--事先查好每个音名的频率,根据音频系数进行分频,

得到是正确频率两倍的音

else

count1:=0;

result<=not result;--对得到的音频再进行2分频,得到稳定的正确的音频

信号

end if;

end if;

end process;

endOrgen_Player;

七.基于QuartusII9.0的仿真实现

1.仿真电路图

2.仿真波形图

八.基于TEC-5试验系统的实现效果

1.音阶模式下,可以根据琴键的输入演奏低音1-7和中音1-7一共14个音符。

2.自动演奏模式下,可以自动演奏事先存入的一段音乐《闪烁小星星》的片段。

3.演奏不同的音符时,数码显示管会显示不同的音符,同时用一个信号等表示

是中音还是低音。

九.实验中出现的问题以及解决方法

1.由于分频信号采用tone0表示,当模式在手动音阶演奏模式和自动演奏模式之间切换时,由tone0的影响,有时会导致自动演奏不成功或者音阶演奏出现杂音,这是一个相对比较难处理的问题。后来经过多次尝试,加了一个判断的标志位,当在不同模式之间切换的时候,首先对原先的tone0清零,消除原先模式带来的影响。最后取得了不错的切换效果。

2.刚开始调试硬件的时候,琴键并不灵敏,有时候在高电平的时候发声有时候却在低电平的时候发声,出现了很大的逻辑错误。原先以为是程序的逻辑有问题,但是在Quartus上作了仿真却没有发现太大的问题。经过讨论,觉得是硬件的接触问题,将逻辑输入信号改由脉冲同步输入,使输入信号更加稳定,使演奏信号稳定下来。

3.调试硬件的时候,演奏到中音的时候,小灯泡却始终不亮,首先检查了代码,没发现有太明显的逻辑不合理现象。于是用逻辑笔去测试输入输出管脚的电平,发现无论什么时候管脚都是输出低电平,可能是芯片内部出了问题。于是我们重新固定好管脚,重新将程序烧入,终于使小灯泡在中音演奏的时候发光。

十.实验收获与总结

1.简易电子琴虽然看起来比较简单,但是要真正实现还是要花一番功夫,计算分频系数,连线等都是细致的工作,这更加考验人的耐心和细心。

2.由于数字逻辑这门课是在大二上学期开设的,已经半年没有用VHDL来编程序,而VHDL又和我们平时习惯的C++,Java等程序的语法不太一样,导致经常

出现语法错误。这就要求在写程序之前一定要熟悉该门语言,了解语法特点,否则会带来很多不必要的麻烦。

3.通过这个实验,基本上熟悉了isp系统的使用,更加深入的了解了硬件描述语言在实际中的运用,加深了实践的体会。

2012年6月26日星期二

相关文档
相关文档 最新文档