1、乐曲硬件演奏电路设计 江西理工大学应用学院SOPC/EDA综合课程设计报告 设计题目: 乐曲硬件演奏电路设计 设 计 者: 学 号: 班 级: 指导老师: 王忠锋 完成时间: 2012年1月4日设计报告综合测试总评格式(10)内容(40)图表(10)答辩(20)平时(20)乐曲硬件演奏电路设计 -梁祝引言: 20世纪90年代,国际上电子和计算机技术较先进的国家,一直在积极探索新的电子电路设计方法,并在设计方法、工具等方面进行了彻底的变革,取得了巨大成功。在电子技术设计领域,可编程逻辑器件(如CPLD、FPGA)的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵活性。这些器件可以通
2、过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了EDA技术的迅速发展。 EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言VHDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。 利用EDA工具,电子设计师可以从概念、算法、协议等开始设计电子系统,大量工作可以通过计算机完成,并可以将电子产
3、品从电路设计、性能分析到设计出IC版图或PCB版图的整个过程的计算机上自动处理完成。现在对EDA的概念或范畴用得很宽。包括在机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域,都有EDA的应用。目前EDA技术已在各大公司、企事业单位和科研教学部门广泛使用。例如在飞机制造过程中,从设计、性能测试及特性分析直到飞行模拟,都可能涉及到EDA技术。 乐曲演奏原理:由于组成乐曲的每个音符的频率值(音调)及其持续时间(音长)是乐曲演奏的2个基本数据,因此需要控制到扬声器的激励信号的频率高低和该频率信号持续的时间。频率高低决定了音调的高低,所有不同频率的信号都是从统一基准频率分频出来的。随着
4、FPGA集成度的提高,价格下降,EDA设计工具更新换代,功能日益普及与流行,使这种方案的应用越来越多。如今的数字逻辑设计者面临日益缩短的上市时间的压力,不得不进行上万门的设计,同时设计者不允许以牺牲硅的效率达到保持结构的独特性。使用现今的EDA软件工具来应付这些问题,并不是一件简单的事情。FPGA预装了很多已构造好的参数化库单元LPM器件。通过引入支持LPM的EDA1软件工具,设计者可以设计出结构独立而且硅片的使用效率非常高的产品。一;设计功能 利用数控分频的原理设计音乐硬件演奏电路,能够很好的演奏出“梁祝”的谱子,就达到了以纯硬件的手段来实现乐曲的演奏效果;如果将其换成其他乐曲的音乐数据,就
5、可以演奏其他的歌曲谱子。二;设计原理 ,先介绍一下硬件电路的发声原理。声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。 ,多个不同频率的信号可
6、通过对某个基准频率进行分频器获得。由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。本文中选取750KHz的基准频率。由于现有的高频时钟脉冲信号的频率为12MHz,故需先对其进行16分频,才能获得750KHz的基准频率。对基准频率分频后的输出信号是一些脉宽极窄的尖脉冲信号(占空比=1/分频系数)。为提高输出信号的驱动能力,以使扬声器有足够的功率发音,需
7、要再通过一个分频器将原来的分频器的输出脉冲均衡为对称方波(占空比=1/2),但这时的频率将是原来的1/2。表1中各音符的分频系数就是从750KHz的基准频率二分频得到的375KHz频率基础上计算得到的。 在NOTETABS模块中设置了一个8位二进制计数器(计数最大值为256),作为音符数据ROM的地址发生器。这个计数器的计数频率选为4 Hz,即每一计数值的停留时间为025s,恰为当全音符设为1s时,四四拍的4分音符持续时间。例如,梁祝乐曲的第一个音符低音3(1拍),停留的时间需用4个计数时钟节拍,即1s。相应地,所对应的低音3音符分频预置值为1036,其值在SPKS输出端停留了1s。随着NON
8、ETABS模块中的计数器按4Hz的时钟速率作加法计数时,乐曲就开始连续自然地演奏起来了。三;设计具体内容【1】源程序 这个计数器的计数频率选为4Hz,即每一计数值的停留时间为0.25秒,恰为当全音符设为1秒,四四拍的4分音符持续时间。例如,地址发生器在以下的VHDL逻辑描述中,“梁祝”乐曲的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒时间。那么相应随着程序4中的计数器按4Hz的时钟频率作加法计数时,即随地址递增时,将从音符数据ROM中将连续取出4个音符“3”通过toneindex3.0端口输向分频预置数模块。这样梁祝乐曲中的音符就一个接一个的通过toneindex3.0端口输向分
9、频预置数模块。程序如下LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; -指明所使用的库中的STD_LOGIC_1164程序包ENTITY Songer IS -实体 PORT ( CLK12MHZ : IN STD_LOGIC; -音调频率信号 CLK8HZ : IN STD_LOGIC; -节拍频率信号 key : IN STD_LOGIC; -选择播放模式 key1 : IN STD_LOGIC; -手动模式下歌曲的选择 CODE1 : OUT STD_LOGIC_VECTOR (3 DOWNTO 0);- 简谱码输出显示 HIGH1 : OUT ST
10、D_LOGIC; -高8度指示 SPKOUT : OUT STD_LOGIC );-声音输出 END;ARCHITECTURE one OF Songer IS COMPONENT NoteTabs -对调用的NoteTabs元件做声明 PORT ( clk : IN STD_LOGIC; ToneIndex : OUT STD_LOGIC_VECTOR (3 DOWNTO 0); key : IN STD_LOGIC; key1 : IN STD_LOGIC); END COMPONENT; COMPONENT ToneTaba -对调用的NoneTaba元件做声明 PORT ( Index
11、 : 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 COMPONENT; COMPONENT Speakera -对调用的Speakera元件做声明 PORT ( clk : IN STD_LOGIC; Tone : IN STD_LOGIC_VECTOR (10 DOWNTO 0); SpkS : OUT STD_LOGIC ); END COM
12、PONENT; COMPONENT mux21a -对调用的mux21a元件做声明 PORT ( a,b:IN STD_LOGIC_VECTOR( 7 DOWNTO 0); s: IN STD_LOGIC; y: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);END COMPONENT; COMPONENT mux21a_1 -对调用的mux21a_1元件做声明 PORT ( a1,b1:IN STD_LOGIC_VECTOR( 7 DOWNTO 0); s1: IN STD_LOGIC; y1: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);END
13、 COMPONENT; SIGNAL Tone : STD_LOGIC_VECTOR (10 DOWNTO 0); -定义标准逻辑位矢数据类型 SIGNAL ToneIndex : STD_LOGIC_VECTOR (3 DOWNTO 0); BEGIN -元件与实体中元件间及端口的连接说明u1 : NoteTabs PORT MAP (clk=CLK8HZ, ToneIndex=ToneIndex,key=key,key1=key1);u2 : ToneTaba PORT MAP (Index=ToneIndex,Tone=Tone,CODE=CODE1,HIGH=HIGH1);u3 : S
14、peakera PORT MAP(clk=CLK12MHZ,Tone=Tone, SpkS=SPKOUT );END;-SPEAKERA模块LIBRARY IEEE;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; -使用的库中的STD_LOGIC_1164程序包USE IEEE.STD_LOGIC_UNSIGNED.ALL; -使用STD_LOGIC_UNSIGNED程序包ENTITY Speakera IS -实体PORT ( clk : IN STD_LOGIC; Tone : IN STD_LOGIC_VECTOR (10 DOWNTO 0); Spk
15、S : OUT STD_LOGIC );END;ARCHITECTURE one OF Speakera IS -结构体 SIGNAL PreCLK, FullSpkS : STD_LOGIC;BEGIN DivideCLK : PROCESS(clk) -以clk为输入信号的进程 VARIABLE Count4 : STD_LOGIC_VECTOR (3 DOWNTO 0) ; BEGIN PreCLK 11 THEN PreCLK = 1; Count4 := 0000; ELSIF clkEVENT AND clk = 1 THEN Count4 := Count4 + 1; END I
16、F; END PROCESS; -以PreCLK, Tone为输入信号的进程 GenSpkS : PROCESS(PreCLK, Tone)- 11位可预置计数器 VARIABLE Count11 : STD_LOGIC_VECTOR (10 DOWNTO 0);BEGIN IF PreCLKEVENT AND PreCLK = 1 THEN IF Count11 = 16#7FF# THEN Count11 := Tone ; FullSpkS = 1; ELSE Count11 := Count11 + 1; FullSpkS = 0; END IF; END IF; END PROCES
17、S; -以FullSpkS为输入信号的进程 DelaySpkS : PROCESS(FullSpkS)-将输出再2分频,展宽脉冲,使扬声器有足够功率发音 VARIABLE Count2 : STD_LOGIC;BEGIN IF FullSpkSEVENT AND FullSpkS = 1 THEN Count2 := NOT Count2; IF Count2 = 1 THEN SpkS = 1; ELSE SpkS TONE=11111111111;CODE=00000;HIGHTONE=01100000101;CODE=00001;HIGHTONE=01110010000;CODE=000
18、10;HIGHTONE=10000001100;CODE=00011;HIGHTONE=10000110101;CODE=00100;HIGHTONE=10010101101;CODE=00101;HIGHTONE=10100001010;CODE=00110;HIGHTONE=10101011100;CODE=00111;HIGHTONE=10110000010;CODE=01000;HIGHTONE=10111001000;CODE=01001;HIGHTONE=11000000110;CODE=01010;HIGHTONE=11000101000;CODE=01011;HIGHTONE=
19、11001010110;CODE=01100;HIGHTONE=11010000100;CODE=01101;HIGHTONE=11010110101;CODE=01110;HIGHTONE=11011000000;CODE=10001;HIGHTONE=11011101010;CODE=10010;HIGHTONE=11100000111;CODE=10011;HIGHTONE=11100010110;CODE=10100;HIGHTONE=11100101111;CODE=10101;HIGHTONE=11101000110;CODE=10110;HIGHTONE=11101011010;
20、CODE=10111;HIGH NULL; END CASE; END PROCESS;END;-NOTETABS模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; -使用的库中的STD_LOGIC_1164程序包USE IEEE.STD_LOGIC_UNSIGNED.ALL; -使用STD_LOGIC_UNSIGNED程序包ENTITY NoteTabs IS -实体 PORT ( clk : IN STD_LOGIC; ToneIndex : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); key : IN STD_LOGIC; ke
21、y1 : IN STD_LOGIC); END;ARCHITECTURE one OF NoteTabs IS -结构体 COMPONENT MUSIC -对音符数据ROM元件调用声明PORT ( address : IN STD_LOGIC_VECTOR (7 DOWNTO 0); inclock: IN STD_LOGIC; q: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END COMPONENT;COMPONENT mux21a -对调用的mux21a元件做声明PORT ( a,b:IN STD_LOGIC_VECTOR( 7 DOWNTO 0); s: IN
22、STD_LOGIC; y: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);END COMPONENT;COMPONENT mux21a_1 -对调用的mux21a_1元件做声明PORT ( a1,b1:IN STD_LOGIC_VECTOR( 7 DOWNTO 0); s1: IN STD_LOGIC; y1: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);END COMPONENT;SIGNAL Counter : STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL Counter1 : STD_LOGIC_VECTOR(7 D
23、OWNTO 0);SIGNAL Counter2 : STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL yy : STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL yy1 : STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN CNT8 : PROCESS (clk, Counter,Counter1,Counter2) BEGIN IF Counter=232 THEN Counter =00000000; -自动循环播放ELSIF (clkEVENT AND clk=1) THEN Counter =Counter+1; END
24、 IF; IF Counter1=138 THEN Counter1 =00000000; -第一首歌曲循环播放ELSIF (clkEVENT AND clk=1)THEN Counter1 =Counter1+1; END IF; IF Counter2=232 THEN Counter2 =00000000; -第二首歌曲循环播放ELSIF (clkEVENT AND clk=1) THEN Counter2 =10010000;Counter2 key,a= Counter,b=yy1,y=yy); U2: mux21a_1 PORT MAP (s1=key1,a1=Counter1,b
25、1=Counter2,y1=yy1);U3: MUSIC PORT MAP (address=yy, q=ToneIndex,inclock=clk); END;-mux21aLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; -使用的库中的STD_LOGIC_1164程序包ENTITY mux21a is -实体 PORT (a,b:IN STD_LOGIC_VECTOR( 7 DOWNTO 0); s: IN STD_LOGIC; y: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);END ENTITY mux21a;ARCHITECT
26、URE one OF mux21a IS -结构体 BEGIN y=a WHEN s=0 ELSE b;END ARCHITECTURE one;-mux21a_1LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; -使用的库中的STD_LOGIC_1164程序包ENTITY mux21a_1 is -实体 PORT ( a1,b1:IN STD_LOGIC_VECTOR( 7 DOWNTO 0); s1: IN STD_LOGIC; y1: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);END ENTITY mux21a_1;ARCHITECTURE one OF mux21a_1 IS -结构体 BEGIN y1=a1 WHEN s1=0 ELSE b1;END ARCHITECTURE one;-音符数据ROM
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1