基于FPGA音乐硬件演奏电路设计

上传人:沈*** 文档编号:41588218 上传时间:2021-11-21 格式:DOC 页数:46 大小:435KB
返回 下载 相关 举报
基于FPGA音乐硬件演奏电路设计_第1页
第1页 / 共46页
基于FPGA音乐硬件演奏电路设计_第2页
第2页 / 共46页
基于FPGA音乐硬件演奏电路设计_第3页
第3页 / 共46页
点击查看更多>>
资源描述
基于FPGA音乐硬件演奏电路设计目 录摘 要I1 系统设计总述11.1 设计要求11.2 系统组成12 总体程序设计42.1 顶层模块设计流程图42.2 顶层电路VHDL程序设计43 单元模块程序设计63.1 音乐节拍和音调发生器模块63.2 音乐谱对应分频预置数查表电路模块73.3 音乐谱对应分频预置数查表电路模块93.4 乐曲演奏音符数据文件(妈妈的吻)113.5 定制音符数据的ROM文件124 VHDL音乐硬件演奏电路系统仿真与调试154.1 NoteTabs音乐节拍和音调发生器模块的仿真154.2 ToneTaba分频预置数查表模块的仿真154.3 Speakera音乐符数控分频模块的仿真164.4 扩大此音乐硬件演奏电路的通用性185 心得体会20参考文献21摘 要根据国家教委与专业教学委员会对教育机构的要求,为培养适应我国21世纪国民经济发展需要的电子设置人才;同时基于国家教委面向21世纪电工电子课程体系改革和电工电子工科教学基地建设两项教学改革研究成果。要求高等专科学校学生能够自己动手完成简单数字器件的设计。这不但反应了我国当前在电子电路的实验教学体系、内容和方法上的改革思路和教学水平的提高,更重要的是在加强以传统电子设计方法为基础的工程设计训练的同时,使学生能够尽快掌握现代电子设计自动化技术的新方法、新工具和新手段系统的、科学的培养了学生的实际动手能力、理论联系实际的能力、工程设计能力,创新能力,提高了学生对基础实验的兴趣。本次设计在EDA开发平台QUARTUS II 6.0上利用VHDL语言设计数控分频器电路,利用数控分频的原理设计音乐硬件演奏电路,并定制LPM-ROM存储音乐数据,以“梁祝”和“月亮代表我的心”两首乐曲为例,将音乐数据存储到LPM-ROM,就达到了以纯硬件的手段来实现乐曲的演奏效果。只要修改LPM-ROM所存储的音乐数据,将其换成其他乐曲的音乐数据,再重新定制LPM-ROM,连接到程序中就可以实现其它乐曲的演奏。本设计采用的是武汉理工大学的开放设计实验箱,FPGA目标芯片型号为Altera公司的Cyclone系列中的EP1C3T144C8N。芯片配置成功后即可进行硬件测试:选择实验电路结构图,发音输出接SPEAKER,当乐曲一遍演奏完成后,乐曲发生器能自动从头开始循环演奏。关键词: FPGA/CPLD,音乐硬件演奏电路,VHDL语言设计,QUARTUS II 6.0I1 系统设计总述1.1 设计要求这是一种运用纯硬件实现乐曲播放的电路,比运用微处理器实现乐曲播放更加复杂。它运用了强大功能的EDA工具开放设计试验箱和硬件描述语言VHDL。本课题以歌曲妈妈的吻来实现乐曲播放电路的功能。(1)顺序播放乐曲功能:当电路开始工作时,如果存储器中有多首乐曲,那么演奏电路将从头到尾顺序播放这些乐曲。(2)循环播放乐曲功能:当演奏完后一首乐曲时,将自动返回到第一首歌曲开始播放,反复不止,直到关闭电源电路停止工作为止。(3)乐曲简谱显示功能:当演奏电路播放乐曲时,能够将当前播放的音符通过一列发光二极管以二进制的形式予以显示。(4)乐曲高音显示功能:如果电路正在播放高音音符,那么将有一个发光二极管点亮来显示。(5)音量大小可调功能:运用EDA实验箱上的数字功率放大器LM386N,对数控分频器输出的音频信号予以处理,输出大小连续可调的音频信号到扬声器。1.2 系统组成(1)音乐硬件演奏电路基本原理 硬件电路的发声原理,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA芯片某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。(2)音符频率的获得多个不同频率的信号可通过对某个基准频率进行分频器获得。由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。本设计中选取750KHz的基准频率。由于现有的高频时钟脉冲信号的频率为12MHz,故需先对其进行16分频,才能获得750KHz的基准频率。对基准频率分频后的输出信号是一些脉宽极窄的尖脉冲信号(占空比=1/分频系数)。为提高输出信号的驱动能力,以使扬声器有足够的功率发音,需要再通过一个分频器将原来的分频器的输出脉冲均衡为对称方波(占空比=1/2),但这时的频率将是原来的1/2。下表中各音符的分频系数就是从750KHz的基准频率二分频得到的375KHz频率基础上计算得到的。由于最大分频系数是1274,故分频器采用11位二进制计数器能满足要求,乐曲中的休止符,只要将分频系数设为0,即初始值=211-1=2047,此时扬声器不会发声。表1 各个音符的频率及其对应的分频系数(基准频率375KHz)音符名频 率(Hz)分频系数计数初值音符名频率(Hz)分频系数计数初值休止符37500002047中音4796.1784681579低音1294.3491274773中音5882.3534251622低音2330.3961135912中音6989.4463791668低音3370.9210111036中音71136.3633301717低音4386.5989701077高音11175.5493191728低音5394.7379501197高音21353.7902771770低音6495.3767571290高音31512.0972481799低音7555.566751372高音41609.4422331814中音1588.6976371410高音51802.8842081839中音2638.845871480高音62027.0271851862中音3742.5745051542高音72272.7271651882(3)乐曲节奏的控制 本设计中的梁祝和月亮代表我的心的乐曲,最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要提供一个4Hz的时钟频率即可产生1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低。(4)乐谱发生器本文将乐谱中的音符数据存储在LPM-ROM中,如“梁祝”乐曲中的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒的时间,相应地,音符“3”就要在LPM-ROM中连续的四个地址上都存储。当一个4Hz的时钟来时,相应地就从LPM-ROM中输出一个音符数据。(5)音乐硬件演奏电路总体设计流程当一个4Hz的时钟脉冲来到时,乐谱发生器模块输出一个音符数据给分频系数模块,分频系数模块输出此音符相应的分频系数,将分频系数送给数控分频器模块,当12MHz的时钟脉冲来到时,数控分频器就根据分频系数输出相应的频率(即此音符所对应的发生频率)给扬声器,扬声器就可发出对应音符的声音来.连续的4Hz的时钟脉冲就将乐谱发生器里所存储的音符数据一个接一个的送给了分频系数模块,再经过数控分频模块,最后扬声器一个接一个的发出音符数据所对应的声音来。曲子也就流畅的播放出来了,当乐曲一遍演奏完成后,乐曲发生器能自动从头开始循环演奏,按下SEL键时播放第二首歌,按下RST键时从头开始播放歌曲。音乐硬件演奏电路主要是用VHDL语言来设计,并利用Quartus6.0软件工具来编译、测试和仿真,音乐硬件演奏电路设计总体设计方框图如下图所示。图1.1 音乐硬件演奏电路设计总体设计方框图 2 总体程序设计2.1 顶层模块设计流程图图2.1 顶层模块设计流程图2.2 顶层电路VHDL程序设计LIBRARY IEEE; - 硬件演奏电路顶层设计USE IEEE.STD_LOGIC_1164.ALL;ENTITY Songer ISPORT ( CLK12MHZ : IN STD_LOGIC; -音调频率信号 CLK8HZ : IN STD_LOGIC; -节拍频率用于控制音长(节拍)的时钟频率; SEL : IN STD_LOGIC;-音乐选择键 RST : IN STD_LOGIC;-复位键 CODE1 : OUT STD_LOGIC_VECTOR (3 DOWNTO 0);- 简谱码输出显示 HIGH1 : OUT STD_LOGIC; -高8度指示 SPKOUT : OUT STD_LOGIC );-声音输出END;ARCHITECTURE one OF Songer ISCOMPONENT NoteTabs-元件U1例换化 PORT ( clk : IN STD_LOGIC; SEL : IN STD_LOGIC; RST : IN STD_LOGIC; ToneIndex : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) );END COMPONENT;COMPONENT ToneTaba-元件U2例换化 PORT ( 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 COMPONENT;COMPONENT Speakera-元件U3例换化 PORT ( clk : IN STD_LOGIC; Tone : IN STD_LOGIC_VECTOR (10 DOWNTO 0); SpkS : OUT STD_LOGIC );END COMPONENT;SIGNAL Tone : STD_LOGIC_VECTOR (10 DOWNTO 0);SIGNAL ToneIndex : STD_LOGIC_VECTOR (3 DOWNTO 0);BEGINu1 : NoteTabs PORT MAP (clk=>CLK8HZ,RST=>RST,SEL=>SEL, ToneIndex=>ToneIndex);-参数传递映射语句u2 : ToneTaba PORT MAP(Index=>ToneIndex,Tone=>Tone,CODE=>CODE1,HIGH=>HIGH1);u3 : Speakera PORT MAP(clk=>CLK12MHZ,Tone=>Tone, SpkS=>SPKOUT);END;3 单元模块程序设计根据顶层原理图,共分为music模块、地址发生器模块、分频预置数模块、十六进制模块、数控分频模块这五个模块。music模块存放乐曲中的音符数据,地址发生器模块作为music模块中所定制的音符数据ROM的地址发生器,分频预置数模块提供分频预置数即给数控分频模块提供计数初值,十六进制模块对12MHz的时钟脉冲进行16分频,得到750KHz的频率,给数控分频模块提供时钟脉冲。数控分频模块根据分频预置数输出各个音符所对应的频率。3.1 音乐节拍和音调发生器模块图3.1 音乐节拍和音调发生器模块(1) 音乐节拍和音调发生器模块RTL电路图图3.2 音乐节拍和音调发生器模块RTL电路图 (2) 音乐节拍和音调发生器模块VHDL程序设计LIBRARY IEEE;-音乐节拍和音调发生器模块USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY NoteTabs ISPORT ( clk : IN STD_LOGIC;-音乐节拍时钟4HZ SEL : IN STD_LOGIC;-音乐选择键 RST : IN STD_LOGIC;-复位键 ToneIndex : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) );END;ARCHITECTURE one OF NoteTabs ISCOMPONENT music -音符数据ROM1PORT( address : IN STD_LOGIC_VECTOR (7 DOWNTO 0); clock : IN STD_LOGIC ; q : OUT STD_LOGIC_VECTOR (3 DOWNTO 0);END COMPONENT;SIGNAL Counter : STD_LOGIC_VECTOR (7 DOWNTO 0);-8位二进制计数器BEGINCNT8 : PROCESS(clk, Counter,sel,rst)BEGINIF (clk'EVENT AND clk = '1') and (Counter=256 or rst='0') then Counter <= "00000000"Counter <=Counter+1; end if; IF (clk'EVENT AND clk = '1') and (sel='0') THEN Counter <="10010000"Counter <=Counter+1; end if;END PROCESS;u1 : MUSIC PORT MAP(address=>Counter , q=>ToneIndex,clock=>clk);END;(2) 地址发生器模块地址发生器模块设置了一个8位二进制计数器(计数最大值为256),作为音符数据ROM的地址发生器。每来一个时钟脉冲信号(Clk),8位二进制计数器就计数一次,ROM文件中的地址也就随着递增,音符数据ROM中的音符也就一个接一个连续的取出来了。在地址发生器的VHDL设计中,这个计数器的计数频率选为4Hz,即每一计数值的停留时间为0.25秒,恰为当全音符设为1秒,四四拍的4分音符持续时间。例如,地址发生器在以下的VHDL逻辑描述中,“梁祝”乐曲的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒时间。那么相应随着程序4中的计数器按4Hz的时钟频率作加法计数时,即随地址递增时,将从音符数据ROM中将连续取出4个音符“3”通过toneindex3.0端口输向分频预置数模块。这样梁祝乐曲中的音符就一个接一个的通过toneindex3.0端口输向分频预置数模块。3.2 音乐谱对应分频预置数查表电路模块(1) 音乐谱分频预置数模块图3.3 音乐谱分频预置数模块 (2) 音乐谱对应分频预制数查表电路VHDL程序设计音乐谱分频预置数模块是乐曲简谱码对应的分频预置数查表电路。它提供了每个音符所对应的分频预置数,即给数控分频模块提供计数初值,这里以“梁祝”乐曲为例,列出了在这个乐曲中所用到的13个音符的分频预置数。在这个模块的VHDL逻辑描述中设置了四四拍乐曲中全部音符所对应的分频预置数,共13个,每一音符的停留时间由音乐节拍和地址发生器模块的时钟(Clk)的输入频率决定,在此为4Hz。这13个值的输出由程序3的4位输入值index3.0确定。输向程序4中index3.0的值又由地址发生器模块的输出toneindex3.0的输出值和持续时间决定。模块的功能是输出各个音符所对应的分频预置数,即当index是“0000”,tone输出为2047,即休止符的分频预置数;当index是“0101”时, tone输出为1197即低音5的分频预置数;当index是“1111”时, tone输出为1728即高音1的分频预置数等等其它状态时,tone分别输出相应音符的分频预置数。分频预置数模块的VHDL设计程序如下:LIBRARY IEEE;-音乐谱对应分频预制数查表电路模块USE IEEE.STD_LOGIC_1164.ALL;ENTITY ToneTaba ISPORT ( Index : IN STD_LOGIC_VECTOR (3 DOWNTO 0) ;-4位预制数查表 CODE : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ; HIGH : OUT STD_LOGIC;-音乐高8度指示 Tone : OUT STD_LOGIC_VECTOR (10 DOWNTO 0) );-音乐符对应分频11位END;ARCHITECTURE one OF ToneTaba ISBEGINSearch : PROCESS(Index)BEGINCASE Index IS - 译码电路,查表方式,控制音调的预置数13组频率WHEN "0000" => Tone<="11111111111" ; CODE<="0000" HIGH <='0'- 2047WHEN "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 <='1'-1410;WHEN "1001" => Tone<="10111001000" ; CODE<="0010" HIGH <='1'-1480;WHEN "1010" => Tone<="11000000110" ; CODE<="0011" HIGH <='1'-1542;WHEN "1100" => Tone<="11001010110" ; CODE<="0101" HIGH <='1'-1622;WHEN "1101" => Tone<="11010000100" ; CODE<="0110" HIGH <='1'-1668;WHEN "1111" => Tone<="11011000000" ; CODE<="0001" HIGH <='1'-1728;WHEN OTHERS => NULL;END CASE;END PROCESS;END;3.3 音乐符数控11分频电路模块3.3 音乐谱对应分频预置数查表电路模块(1) 音乐符数控11分频电路模块图3.4音乐符数控11分频电路模块(2) 音乐符数控11分频电路模块RTL电路图图3.4音乐符数控11分频电路模块RTL电路图 (3) 音乐符数控11分频模块电路VHDL程序设计音符的频率由数控分频模块获得,这是一个数控分频电路。它是由一个初值可变的加法计数器构成。该计数器的模为2047,当计数器记满时,计数器产生一个溢出信号FULL,此溢出信号就是用作发音的频率信号。在计数器的输入端给定不同的初值,而此预置数就是表1中的计数初值,就可得到不同音符的发音频率信号。它计满时所需要的计数初值可由下式来表示。计数初值(Tone)=2047-分频系数而分频系数又可有下式来求:分频系数=基准频率/音符的发生频率低音时Tone值小,分频系数大,溢出信号周期长,扬声器发出的声音低,Tone随音乐的乐谱变化大,自动控制分频比,实现了数控分频,发生信号的频率与音调Tone成正比。这就是利用数控分频器自动演奏音乐的原理。时钟(Clk)端输入的是在十六进制模块里对12MHz的信号进行16分频得到的750KHz,750KHz的信号根据分频预置数模块中所提供的计数初值,分别得出相应音符频率的两倍值。此时从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,这时的频率就变为原来的1/2,刚好就是相应音符的频率。数控分频模块中对Clk输入信号的分频比由11位预置数tone10.0决定。Fout的输出频率将决定每一个音符的音调,这样,分频计数器的预置值tone10.0与Fout的输出频率就有了对应关系。例如在分频预置数模块中若取tone10.0=1036,将发出音符为“3”音的信号频率。音符的频率由数控分频模块VHDL程序如下:LIBRARY IEEE;-音乐符数控分频电路模块USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY Speakera ISPORT ( clk : IN STD_LOGIC;-音调频率信号12MHZ Tone : IN STD_LOGIC_VECTOR (10 DOWNTO 0);-音乐符对应分频11位 SpkS : OUT STD_LOGIC );-声音输出END;ARCHITECTURE one OF Speakera IS SIGNAL PreCLK, FullSpkS : STD_LOGIC;BEGINDivideCLK : PROCESS(clk) VARIABLE Count4 : STD_LOGIC_VECTOR (3 DOWNTO 0) ; BEGIN PreCLK <= '0' - 将CLK进行16分频,PreCLK为CLK的16分频 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)- 11位可预置计数器 VARIABLE Count11 : STD_LOGIC_VECTOR (10 DOWNTO 0); BEGIN IF PreCLK'EVENT AND PreCLK = '1' THEN IF Count11 = 16#7FF# THEN Count11 := Tone ; FullSpkS <= '1' ELSE Count11 := Count11 + 1; FullSpkS <= '0' END IF; END IF;END PROCESS;DelaySpkS : PROCESS(FullSpkS)-将输出再2分频,展宽脉冲,使扬声器有足够功率发音 VARIABLE Count2 : STD_LOGIC; BEGIN IF 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;3.4 乐曲演奏音符数据文件(梁祝、月亮代表我的心)WIDTH = 4 ;-乐曲演奏数据DEPTH = 256 ;Address_radix = dec;Data_radix = dec;CONTENT BEGIN3333555688896855121212151312101299999990999107766555688993388656855555555101010127799685555553503356796666665688891212121099109886533338888686535685555555500000000051351735050671665500321113211123211623 2162320005267121003532157006711123200051351735567166550321113211123026712其中WIDTH=4,表示数据输出为宽为4;DEPTH=256,表示共有256个4位数据点;ADDRESS-RADIX=DEC,表示地址信号用十进制;DATA-RADIX=DEC,表示输出数据是十进制数。形成ROM中的配置数据(初始化数据)文件的方法如下:在QUARTUS|中编辑.mif文件。首先在File菜单下的New菜单上选择Text Editor File命令,进入文本编辑器,然后输入以上格式的数据文件。文件中的关键词WIDTH设置ROM的数据宽度;DEPTH设置ROM数据的深度,即4位数据的数量,文件中设置的256等效于8位地址线宽度;ADDRESS-RADIX=DEC和DATA-RADIX=DEC表示设置地址和数据的表达式格式都是十进制;地址/数据表以CONTENT BEGIN开始,以END结束;其中的地址/数据表达方式是冒号左边写ROM地址值,冒号右边写对应此地址放置的十进制数据,如46:9,表示46为地址,9为该地址中的数据。这样每读到一个地址,即可输出其相应的数据。文件编辑好后,保存时取文件名为“singer.mif”,存盘的路径为“g:music singer”。3.5 定制音符数据的ROM文件1.定制的基本步骤如下:(1) 进入QUARTUS|,选菜单 TOOL->megawizard plug-in manager,选择“creat a new”,然后按“next”键,选择LPM-ROM;最后在browse下的栏中键入路径与输出文件名,注意后缀vhd小写。(2) 单击“next”键,选择ROM数据位宽度为4,地址线宽为256,即设置此ROM能存储4位二进制数据共256个。(3) 通过“browse” 钮,找到ROM中的加载文件路径和文件名:注意ROM元件的inclock是地址锁存时钟。(4) 打开已定制的ROM文件,将它设置为工程,并确定目标器件,进行测试仿真波形,按照定制步骤对音符数据文件进行ROM定制。定制好的ROM文件VHDL程序如下:LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY music IS    PORT    (          address         : IN STD_LOGIC_VECTOR (7 DOWNTO 0);          inclock          : IN STD_LOGIC ;          q            : OUT STD_LOGIC_VECTOR (3 DOWNTO 0);END music;ARCHITECTURE SYN  OF  music IS   SIGNAL sub_wire0    : STD_LOGIC_VECTOR (3 DOWNTO 0);   COMPONENT lpm_rom   GENERIC (          lpm_width           : NATURAL;          lpm_widthad         : NATURAL;          lpm_address_control : STRING;          lpm_outdata         : STRING;          lpm_file         : STRING);   PORT (                 address  : IN STD_LOGIC_VECTOR (7 DOWNTO 0);                 inclock   : IN STD_LOGIC ;                 q     : OUT STD_LOGIC_VECTOR (3 DOWNTO 0);   END COMPONENT;BEGIN     q    <= sub_wire0(3 DOWNTO 0);lpm_rom_component : lpm_rom   GENERIC MAP (          LPM_WIDTH => 4,          LPM_WIDTHAD => 8,          LPM_ADDRESS_CONTROL => "REGISTERED",          LPM_OUTDATA => "UNREGISTERED",          LPM_FILE => "G:/MUSIC/SINGER/SINGER.mif")   PORT MAP (          address => address,          inclock => inclock,          q => sub_wire0);END SYN;4 VHDL音乐硬件演奏电路系统仿真与调试4.1 NoteTabs音乐节拍和音调发生器模块的仿真(1) 波形仿真将所编写的音乐节拍和音调模块NoteTabs的程序设为工程,选用Altera公司的Cyclone系列中的EPIC12Q240C8为目标芯片进行仿真。仿真结果如下图:图4.1音乐节拍和音调模块NoteTabs波形仿真4.2 ToneTaba分频预置数查表模块的仿真(1) 波形仿真将所编写的分频预置数查表模块ToneTaba的程序设为工程,选用Altera公司的Cyclone系列中的EPIC12Q240C8为目标芯片进行仿真。仿真结果如下图:图4.2 分频预置数查表模块ToneTaba波形仿真(2) 模块功能分析与调试ToneTaba分频预置数模块的功能是输出各个音符所对应的分频预置数,由上面的仿真波形图可看到若当index是“0000”,tone输出为2047,即休止符的分频预置数;当index是“0101”时,tone输出为1197即低音5的分频预置数;当index是“1111”时, tone输出为1728即高音1的分频预置数等等其它状态时,tone分别输出相应音符的分频预置数,仿真波形图证明了程序实现了模块的功能。4.3 Speakera音乐符数控分频模块的仿真(1) 波形仿真将所编写的音乐符数控分频模块Speakera的程序设为工程,选用Altera公司的Cyclone系列中的EPIC12Q240C8为目标芯片进行仿真。仿真结果如下图:图4.3 Speakera音乐符数控分频模块波形仿真(2) 模块功能分析与调试Speakera 音乐符数控分频此模块的功能是根据初始值Tone的值,对输入时钟信号Clk的频率进行分频,得到想要的音符的发声频率其时钟(Clk)端输入的是在十六进制模块里对12MHz的信号进行16分频得到的750KHz,750KHz的信号根据分频预置数模块中所提供的计数初值,分别得出相应音符频率的两倍值。此时从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,这时的频率就变为原来的1/2,刚好就是相应音符的频率。在clk端输入一具有较高频率的信号(这里是12MHz)的信号,通过分频后由cout输出。这里是对12MHz的信号进行16分频得到750KHz的信号。750KHz的时钟脉冲信号是给数控分频模块提供时钟信号。数控分频模块中对Clk输入信号的分频比由11位预置数tone10.0决定。spkout的输出频率将决定每一个音符的音调,这样,分频计数器的预置tone10.0与Fout的输出频率就有了对应关系。若在分频预置数模块中若取 tone10.0=1036,将发出音符为“3”音的信号频率。在这个仿真波形图中,Tone的值可设为6c0(即高音1的分频预置数1728),Clk的频率为750KHz,spkout输出的脉冲信号的周期为849.9291us(即1176.568Hz),接近高音1的发声频率。由表中可知高音1的分频系数为319,即对输入时钟Clk进行319次分频就可得高音1的发声频率,因此这个程序实现了模块的功能。4.4 扩大此音乐硬件演奏电路的通用性前面所设计的电路只能演奏“梁祝”曲子,但是在实际应用中,若能将电路实用于各种曲子的演奏,它的实用性和应用范围就会扩大许多。这里主要通过修改分频预置数模块的程序,使其实用于各种曲子的演奏。另外要使更改乐曲方便,主要通过重新设置音符数据文件,再对其进行LPM-ROM定制。在前面的VHDL设计中,我们只能通过程序输出“梁祝”曲子中的13个音符的分频预置数(即计数初值),但是在其它的乐曲中可能会用到另外的那些音符,因此对程序进行修改完善它的功能,使其能输出另外那些音符的分频预置数。把修改的程序代替原来此模块的程序连入顶层文件后,要使所设计的音乐硬件演奏电路可随意更改曲子,只要修改音符数据文件,在那些连续的地址上存储曲子中相应的音符,再对音符数据文件进行ROM定制,最后连接到整个电路中即可实现。程序修改如下:Library ieee;Use ieee.std_logic_1164.all;Entity tonetaba is   Port(  index : in std_logic_vector(4 downto 0);-5位预制数查表码code : out std_logic_vector(4 downto 0);         high : out std_logic;         tone : out std_logic_vector(10 downto 0);-音乐符对应分频11位End;Architecture one of tonetaba isBegin   Search : process(index)   Begin     Case index is When "00000"=>tone<="11111111111"code<="00000"high<='0'-2047,休止符 When "00001"=>tone<="01100000101"code<="00001"high<='0'-773,低音1 When "00010"=>tone<="01110010000"code<="00010"high<='0'-912,低音2 When "00011"=>tone<="10000001100"code<="00011"high<='0'-1036,低音3 When "00100"=>tone<="10000110101"code<="00100"high<='0'-1077,低音4 When "00101"=>tone<="10010101101"code<="00101"high<='0'-1197,低音5 When "00110"=>tone<="10100001010"code<="00110"high<='0'-1290,低音6 When "00111"=>tone<="10101011100"code<="00111"high<='0'-1372,低音7 When "01000"=>tone<="10110000010"code<="01000"high<='1'-1410,中音1 When "01001"=>tone<="10111001000"code<="01001"high<='1'-1480,中音2 When "01010"=>tone<="11000000110"code<="01010"high<='1'-1542,中音3 When "01011"=>tone<="11000101000"code<="01011"high<='1'-1576,中音4 When "01100"=>tone<="11001010110"code<="01100"high<='1'-1622,中音5 When "01101"=>tone<="11010000100"code<="01101"high<='1'-1668,中音6 When "01110"=>tone<="11010110101"code<="01110"high<='1'-1717,中音7 When "01111"=>tone<="11011000000"code<="10001"high<='1'-1728,高音1 When "10000"=>tone<="11011101010"code<="10010"high<='1'-1770,高音2 When "10001"=>tone<="11100000111"code<="10011"high<='1'-1799,高音3 When "10010"=>tone<="11100010110"code<="10100"high<='1'-1814,高音4 When "10011"=>tone<="11100101111"code<="10101"high<='1'-1839,高音5 When "10100"=>tone<="11101000110"code<="10110"high<='1'-1862,高音6 When "10101"=>tone<="11101011010"code<="10111"high<='1'-1882,高音7 When others => null;   End case;   End process;End;5 心得体会课程设计是针对某一理论课程的要求,对学生进行综合性实践训练的实践教学环节,可以提高学生运用课程中所学的理论知识与实践紧密结合,独立地解决实际问题的能力。在这次课程设计过程中使我从中学到许多以前在课本和课堂上所无法学到的,特别是在课程设计过程中查找资料的过程中从中学到许多以前在课本和课堂上所无法学到的并从中体会到许多的乐趣,从而丰富了自己,使自己无论是上课时还是在课余都感到很充实。在本次课程设计的过程中,曾得到过老师与几位同学的悉心指导与帮助,才使得我们的设计非常圆满的完成,在此对他们表示我们最衷心的感谢,谢谢你们!因学习知识的能力和时间有限,并且此次EDA课程设计对于我们来说还只是初体验,因此在本次的课程设计过程中,难免存在错误,恳请老师给以批评指正,并再次感谢曾帮助过我们的老师和几位同学。 参考文献1 潘松EDA技术实用教程北京:科学教育出版社.20062 Quartus Semiconductor data books. Quartus Semiconductor Corporation. 20013 杭州康芯电子有限公司GW48-PK3实验系统说明书杭州康芯电子有限公司2006附录1 音乐演奏电路VHDL源程序程序1:4Hz时钟发生器模块程序CLK4Hzlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity CLK4Hz is port(clk0 :in std_logic; clkout :out std_logic);-speaks :out std_logic);end CLK4Hz;architecture beha of CLK4Hz issignal q2 :std_logic_vector (21 downto 0);signal speaks:std_logic;beginprocess(clk0) -首先将试验箱中的20MHz输出频率进行54分频,得到750KHz的频-率。但是这是一些脉宽极窄的尖脉冲信号(占空比=1/54)。begin if (clk0'event and clk0='1') then if (q2=2500000) then-5000000,2500000,1250000 q2<=(others=>'0'); else q2<=q2+1; end if; end if;speaks<=q2(21); end process;delayspks:process(speaks) -将输再2分频,展宽脉冲(占空比变为50%),使扬声器有足-够功率发音,且其频率为375KHz variable count2:std_logic; begin if speaks'event and speaks='1' then count2:=not count2; if count2='1' then clkout<='1' else clkout<='0' end if; end if; end process;end beha;程序2:音符数据文件MusicDataWidth=4;-妈妈的吻(程琳版)乐曲演奏数据Depth=1024;-2009年12月05日12:10分终于发现原来是Depth一直设为256,没有及时改为512,唉!Address_radix=dec;Data_radix=dec;Content begin00:2;01:2;02:2;03:3;04:5;05:5;06:10;07:10;08:9;09:9;10:7;11:7;12:7;13:7;14:7;15:7;16:7;17:3;18:3;19:2;20:2;21:2;22:3;23:5;24:5;25:10;26:10;27:9;28:9;29:6;30:6;31:6;32:6;33:6;34:6;35:6;36:6;37:2;38:2;39:2;40:3;41:5;42:5;43:10;44:10;45:9;46:9;47:7;48:7;49:7;50:6;51:6;52:6;53:4;54:4;55:3;56:3;57:1;58:1;59:1;60:2;61:3;62:3;63:4;64:4;65:3;66:3;67:2;68:2;69:2;70:2;71:2;72:2;73:2;74:2;-第一段75:5;76:5;77:5;78:6;79:7;80:7;81:7;82:6;83:5;84:5;85:5;86:3;87:2;88:2;89:2;90:2;-村91:5;92:5;93:5;94:6;95:7;96:7;97:6;98:5;99:6;100:6;101:6;102:6;103:6;104:6;105:6;106:6;-小呀小山村107:5;108:5;109:5;110:6;111:7;112:7;113:7;114:6;115:6;116:6;117:6;118:5;119:3;120:3;121:3;122
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!