1、总体设计电路图28六:六:结束语29 乐曲硬件演奏电路设计1、设计任务要求1、课程设计题目 设计一个乐曲演奏电路,能够自动播放编写好的音乐。要求将音乐通过实验箱上的喇叭播放出来,用发光二级管显示出乐曲的节拍。 (附加功能:本设计在题目所要求的功能全部实现的基础之上又添加了许多附加功能,所有的功能将在“工程设计总述”中阐明,特此声明。)2、设计分析 (1) 音乐硬件演奏电路基本原理 硬件电路的发声原理,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA芯片某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调
2、,实际上只要控制它输出相应音符的频率即可。乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。 (2) 音符频率的获得多个不同频率的信号可通过对某个基准频率进行分频器获得。由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。若基准频率过高,虽然可以减少频率的相对误差,但分频结构
3、将变大。实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。本设计中选取1MHz的基准频率。数控分频器采用12位二进制计数器,乐曲中的休止符,只要将分频系数设为0,即初始值=4095,此时扬声器不会发声。根据分频系数,可计算数控分频器得到的初始值。(语言已经无法描述其中的原理了,程序可以说明此问题,关于初始值的解释,请看下文给出的程序)初始值的计算公式如下:由于所设计的数控分频计采用12MHZ作为时钟源,并通过一次12分频给出频率为1MHZ的脉冲溢出信号,再对该1MHZ的溢出信号进行12位2进制码的带预置数进行计数,并给出一个频率随预置数变化的脉冲信号。由于该脉冲信
4、号不具有驱动蜂鸣器的能力,故对此脉冲信号进行2分频以推动蜂鸣器发声,故最终输出信号的频率与预置数的关系如下:其中为音阶对应的频率。 表1 简谱中的音名与频率的关系音名频率/Hz低音1261.63中音1532.25高音11046.50低音2293.67中音2587.33高音21174.66低音3329.63中音3659.25高音31318.51低音4349.23中音4698.46高音41396.92低音5391.99中音5783.99高音51567.98低音6440中音6880高音61760低音7493.88中音7987.76高音71975.52 表2 各音阶频率对应的分频值分频系数初始值764
5、45473822436919116280681013813405478612706921606721243034515715176674572724642864532714326759510230892551564012566935454536462273591811377054405041412025616610137178 (3) 乐曲节奏的控制 一般乐曲最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要输出4Hz的1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。计数时钟信号作为输出音符快慢的控制信号,时钟快时输出
6、节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低,由于最后的蜂鸣器前需加一个二分频的程序,因此计数器的时钟信号应为4Hz的2倍,即8Hz。 (4) 乐谱的发生本设计将乐谱中的音符数据存储在LPM-ROM中,若某音在逻辑中停留了4个时钟节拍,即1秒的时间,相应地,该音符就要在LPM-ROM中连续的四个地址上都存储。当一个4Hz的时钟来时,相应地就从LPM-ROM中输出一个音符数据。(5) 选择模块 选择模块将用一个4位数的控制信号控制乐谱模块数据的选择性,用vhdl语言描述比较简单,不在此详述。(6)译码器等其他模块译码器等模块在以前做实验的时候做过,且原理比较简单
7、易懂,不再这里阐述。3、工程设计总述 当一个4Hz的时钟脉冲来到时,乐谱发生器模块输出一个音符数据给分频系数模块,分频系数模块输出此音符相应的分频系数所需的初始值,将初始值送给数控分频器模块,当12MHz的时钟脉冲来到时,数控分频器就根据分频系数输出相应的频率(即此音符所对应的发生频率)给扬声器,扬声器就可发出对应音符的声音来.连续的8Hz的时钟脉冲就将乐谱发生器里所存储的音符数据一个接一个的送给了分频系数模块,再经过数控分频模块,最后扬声器一个接一个的发出音符数据所对应的声音来。曲子也就流畅的播放出来了。同时led数码管会随着音乐显示相应的乐谱,3位led灯会随着高中低的频率,相应的闪烁。当
8、乐曲一遍演奏完成后,乐曲发生器能自动从头开始循环演奏,这时用拨码开关选择播放的乐曲,拨码开关给选择器一个选择信号,即可选择相应的歌曲莫开中的数据进入数据翻译模块,播放出相应的歌曲,本工程选取了四首乐曲,以格雷码的形式编码,每次只变一位拨码开关,比较方便选择。分别为: 0001菊花台 0011世上只有妈妈好 0010一剪梅 0110隐形的翅膀 乐谱如下:、二、总体框图 该工程由是个模块构成,其中有四个为乐谱储存模块ROM,如图所示。1、分频器的功能是将芯片上提供的50MHz的时钟分频为12MHz和8Hz的时钟,分别供计数器与分频驱动器(数控分频器)使用。2、计数器完成计数功能,183进制(最长的
9、歌曲菊花台有183个字符)每个时钟沿加一。3、四个音乐模块分别记录了4首歌的乐谱。根据上一模块计数器所计的数读取相应地址里的数据传递给下一模块。4、选择器完成选择歌曲的功能。5、数据翻译模块将选择器所选择的歌曲rom里的地址的数据翻译成分频驱动器(数控分频器)分频所需的控制数据、3个led灯数据(高中低音)、以及译码器所需的数据。6、分频驱动器也就是一个数控分频器,完成分频的功能,并驱动蜂鸣器。7、译码器将乐谱数据在led数码管上显示。三、选择器件1.EP1C12Q240C8芯片2.实验箱底板电路 (包括 蜂鸣器 7段数码管 Led灯7个 )3.计算机四、功能模块1.分频器(div)将芯片上提
10、供的50MHz的时钟分频为12MHz和8Hz的时钟,分别供计数器与分频驱动器(数控分频器)使用。(1)模块图形:(2)程序如下:LIBRARY ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY div IS PORT( clk :IN STD_LOGIC; CLK12MHz,CLK8Hz: OUT std_logic);END div;ARCHITECTURE one of div isbeginnana:process(clk)variable cnt:integer range 0 to 2;va
11、riable tmp:std_logic;if(clkevent and clk=1)thenif cnt=1 thencnt:=0;tmp:=not tmp;else=cnt+1;end if;CLK12MHz=tmp;end process nana;nbnb:integer range 0 to 3125000;=3124999 thenCLK8Hzend process nbnb;end one;(3)仿真波形:(4)仿真波形分析由波形可看出ckl为输入50MHz的时钟信号,ckl12输出为平12MHz的时钟信号,clk8为8Hz的时钟信号,由于纸张有限没有打印出其全部波形。经分析该模
12、块功能完全正确。2计数器(notetabs)计数器完成计数功能,183进制(最长的歌曲菊花台有183个字符)每个时钟沿加一。用于选择rom模块中的地址。(1)模块图像:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY NOTETABS IS PORT(CLK: IN STD_LOGIC; COUNTER1 :inout STD_LOGIC_vector(7 downto 0);END NOTETABS;ARCHITECTURE a OF NOTeTABs ISBEGIN P1:PROC
13、ESS (CLK,COUNTER1) BEGIN IF COUNTER1=183 THEN COUNTER1 b= INDEX null; END CASE;由波形可看出,当输入信号a为0010时输出信号b与q3信号相同(即播放q3的音乐),输出信号index与a相同(即音乐选取显示与音乐选取按键相同)第二个波形图,当输入信号为0001时,同样可以看出这一点,因此该模块功能完全正确。4数据翻译模块(tontaba):将选择器所选择的歌曲rom里的地址的数据翻译成分频驱动器(数控分频器)分频所需的控制数据、3个led灯数据(高中低音)、以及译码器所需的数据。library ieee;entity
14、 tonetaba is port(index:in std_logic_vector (4 downto 0); code:out std_logic_vector(3 downto 0); high0:out std_logic_vector(2 downto 0); tone:out std_logic_vector(11 downto 0); end;architecture one of tonetaba issearch:process(index) case index iswhen00000=tone111111111111code0000high0null; end case
15、; end process;由波形可看出,当输入信号index为00110时high0显示1,code显示6(即 中音6),预置初值为101010111000,查询上文所列的表,可发现功能完全正确。第二个波形图,输入信号00010,输出为中音2,再查预置初值,同样可发现完全正确。因此该模块功能完全正确。5.译码器模块(deled)该模块在之前实验中做过,直接用即可,比较简单。在此,只给出该模块的程序。程序如下:use ieee.std_logic_arith.all;entity deled is port( num:in std_logic_vector(3 downto 0); led:o
16、ut std_logic_vector(6 downto 0);end deled;architecture fun of deled is -signal count:std_logic_vector(2 downto 0); led1111110 when num= else 01100001101101111100101100111011011101111111100001111111100011110111001111011110100011111101110011101100011110111011001111111010001111111 ; end fun;6.数控分频器模块(speakera) 不多说其功能,直接看程序。-音乐符数控分频电路模块ENTITY Speakera ISPORT ( clk :-音调频率信号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;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1