当前位置:文档之家› 乐器硬件演奏电路

乐器硬件演奏电路

EDA技术课程大作业设计题目:乐器硬件演奏电路院系:电子信息与电气工程学院学生姓名:学号:200902070018专业班级:2010 年12 月 4 日乐曲硬件演奏电路1. 设计背景和设计方案1.1设计背景目前,各领域的激烈竞争迫使人们不得不对办事效率格外重视,同时,这也是方便、高效的社会发展趋势之必要。

随着科技发展及电子方面的成熟。

数控分频器它成为这方面当之无愧的选择。

本设计正是关于分频器在乐器硬件演奏电路系统的应用。

与传统的纯硬件相比,简单有效,此设计可以适应多家可编程逻辑器件,便于组织大规模的系统设计;便于设计的复用继承和升级,具有广阔的应用前景。

1.2设计方案该系统主要由NOTETABS,TONETABA,SPEAKERA三个模块组成,与利用微处理器CPU,MCU来实现乐曲演奏相比,以纯硬件完成乐曲演奏电路的逻辑要复杂的多,仅凭借传统的数字逻辑技术是难以实现的,因此,这里我们借助强大的EDA工具和VHDL硬件描述语言来完成。

模块SPEAKERA是数控分频器计数输出模块为一个11位的可预置数计数器。

通过NOTETABS得到预置数,并对这些进行计数。

由SPEAKERA的CLK端输入一具有较高的频率的信号,通过SPEAKERA分频后由SPKOUT输出,模块TONETABA的功能首先是为SPEAKERA提供决定所发音符的分频预置数,而此数在SPEAKERA输入口停留的时间即为此音符的节拍值。

每一个音符的停留时间又由音乐节拍和音调发生器模块NOTETABS的CLK的输入频率决定,输出由对应于TONETABA的4位输入值INDEX[3..0]确定。

输向TONETABA中INDEX[3..0]的输出值与持续的时间由模块NOTETABS决定。

在NOTETABS中设置了一个8为二进制计数器作为音符数据ROM的地址发生器。

这个计数器的计数频率选为4HZ,随着NOTETABS中的计数器按4HZ的时钟速率做加法计数时,即随地址值递增时,音符数据ROM中的音符数据将从ROM中通过TONEINDEX[3..0]端口输向TONETABA模块,乐曲就开始连续自然地演奏起来了。

2. 方案实施2.1 实现原理及算法的描述首先,编写数控分频器计数输出模块SPEAKERA,其输入为clk, Tone ,输出为Spks,运行之后生成模块器件。

该模块主体为一个11位的可预置数计数器。

通过NOTETABS得到预置数,并对这些进行计数。

由其CLK端输入一具有较高的频率的信号,通过SPEAKERA 分频后由SPKOUT输出,由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,但这时的频率是原来的一半。

SPEAKERA对CLK输入信号的分频比由11位预置数TONE[10..O]决定。

Library ieee;Library ieee;Use ieee.std_logic_1164.allUse ieee.std_logic_unsigned.all;Entity speakera isPort(clk:in std_logic;Tone:in std_logic_vector(10 downto 0);Spks:out std_logic);End;Architecture one of speaker isSignal preclk,fullspks:std_logic;BeginDivideclk:process(clk)Variable count4:std_logic_vector (3 downto 0);BeginPreclk<=’0’;If count4>11 then preclk<=’1’;count4:=”0000”;Elsif clk’event and clk=’1’then count4:=count4+1;End if;End process;Genspks:process(preclk,tone)Variable count11:std_logic_vector(10 downto 0);BeginIf preclk’event and preclk=’1’thenIf count11=16#7ff# then count11:=tone;fullspks<=’1’;Else count11:=count11+1;fullspks<=’0’;en if;End if;End process;Delayspks:process(fullspks)Variable count2:std_logic;BeginIf fullspks’event and fullspks=’1’then count2:=not count2;If count2=’1’then spks<=’1’;Else spks<=’0’;End if;End if;End process;End;其次,编辑的是乐曲简谱码对应的分频预置数查表电路TONETABA模块,其输入为index,输出为code,high,tone;音符的持续时间需根据乐曲的速度及每个音符的节拍数来确定,模块TONETABA的功能首先是为SPEAKERA提供决定所发音符的分频预置数,而此数在SPEAKERA输入口停留的时间即为此音符的节拍值。

模块TONETABA是乐曲简谱码对应的分频预置数查表电路,每一个音符的停留时间又由音乐节拍和音调发生器模块NOTETABS的CLK的输入频率决定,输出由对应于TONETABA的4位输入值INDEX[3..0]确定。

输向TONETABA中INDEX[3..0]的输出值与持续的时间由模块NOTETABS决定。

程序运行之后生成模块器件。

Library ieee;Use ieee.std_logic_1164.all;Entity tonetaba isPort(index:in std_logic_vector(3 downto 0);code:out std_logic_vector(3 downto 0);high:out std_logic;tone:out std_logic_vector(10 downto 0));end;architecture one of tonetaba isbeginsearch:process(index)begincase index iswhen “0000”=>tone<=”11111111111”;code<=”0000”;high<=’0’;--2047 when “0001”=>tone<=”01100000101”;code<=”0001”;high<=’0’;--773;when “0010”=>tone<=”01110010000”;code<=”0010”;high<=’0’;--912;when “0011”=>tone<=”10000001100”;code<=”0011”;high<=’0’;--1036;when “0101”=>tone<=”10010101101”;code<=”0101”;high<=’0’;--1197;when “0110”=>tone<=”10100001010”;code<=”0110”;high<=’0’;--1290;when “0111”=>tone<=”10101011100”;code<=”0111”;high<=’0’;--1372;when “1000”=>tone<=”10110000010”;code<=”0001”;high<=’0’;--1410;when “1001”=>tone<=”10111001000”;code<=”0010”;high<=’0’;--1480;when “1010”=>tone<=”11000000110”;code<=”0011”;high<=’0’;--1542;when “1100”=>tone<=”11001010110”;code<=”0101”;high<=’0’;--1622;when “1101”=>tone<=”11010000100”;code<=”0110”;high<=’0’;--1668;when “1111”=>tone<=”11011000000”;code<=”0001”;high<=’0’;--1728;when others=>null;end case;end process;end;最后,是NOTETABS模块,在NOTETABS中设置了一个8为二进制计数器作为音符数据ROM的地址发生器。

这个计数器的计数频率选为4HZ,随着NOTETABS中的计数器按4HZ的时钟速率做加法计数时,即随地址值递增时,音符数据ROM中的音符数据将从ROM中通过TONEINDEX[3..0]端口输向TONETABA模块,乐曲就开始连续自然地演奏起来了。

此模块的输入为clk,输出为Toneindex。

此模块的程序为:Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity notetabs isPort(clk:in std_logic;Toneindex:out std_logic_vector(3 downto 0));End;Architecture one of notetabs isComponent musicPort(address:in std_logic_vector97 downto 0);Inclock:in std_loic;Q:out std_logic_vector(3 downto 0));End component;Signal counter:std_logic_vector(7 downto 0);BeginCnt8:process(clk,counter)BeginIf counter=138 then counter<=”00000000”;Elsif(clk’event and clk=’1’)then counter<=counter+1;end if;End process;U1:music port map(address=>counter,q=>toneindex,inclock=>clk);End;2.2 电路设计原理图将以上三个模块器件连接到一起形成的BLOCK文件如下图所示:2.3 仿真结果3.结果和结论在设计乐曲硬件演奏电路的时候,首先是程序的编程,编程中会出现VHDL语言的描述错误,经过反复的修改才成功。

相关主题