两只老虎EDA乐曲演奏电路设计(2)_第1页
两只老虎EDA乐曲演奏电路设计(2)_第2页
两只老虎EDA乐曲演奏电路设计(2)_第3页
两只老虎EDA乐曲演奏电路设计(2)_第4页
两只老虎EDA乐曲演奏电路设计(2)_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、乐曲演奏广泛用于自动答录装置、手机铃声、集团电话、及智能仪器仪表设 备。实现方法有许多种,随着FPGA集成度的提高、价格下降、EDA设计工具更 新换代、功能日益普及与流行,使这种方案的应用越来越多。如今的数字逻辑设 计者面临日益缩短的上市时间的压力,不得不进行上万门的设计,同时设计者不 允许以牺牲硅的效率达到保持结构的独特性。使用现今的EDA软件工具来应付这 些问题并不是一件简单的事情。FPGA预装了很多已构造好的参数化库单元LPM 器件。通过引入支持LPM的EDA软件工具设计者可以设计出结构独立而且硅片 的使用效率非常高的产品。 本课设在EDA开发平台上利用VHDL语言设计数控分频器电路利用

2、数控分 频的原理设计乐曲硬件演奏电路并定制LPM-ROM存储音乐数据以“两只老虎” 乐曲为例将音乐数据存储到LPM-ROM就达到了以纯硬件的手段来实现乐曲的 演奏效果。只要修改LPM-ROM所存储的音乐数据将其换成其他乐曲的音乐数据再重新定制LPM-ROM连接到程序中就可以实现其它乐曲的演奏。 关键词FPGA 目 录 设计要求. 1 1、方案论证与对比. 1 1.1方案一.1 1.2方案二. 1 1.3综合对比. 1 2 乐曲演奏电路原理. 2 2.1 音乐演奏电路原理 . 2 2.2 音符频率的获得 . 2 2.3 乐曲节奏的控制 . 3 2.4 乐谱发生器 . 3 2.5 乐曲演奏电路原理

3、框图 . 3 3音乐硬件演奏电路的设计实现 . 4 3.1 地址发生器模块 . 4 3.1.1 地址发生器的VHDL设计. 4 3.2 分频预置数模块 . 6 3.2.1 分频预置数模块的VHDL设计. 6 3.3 数控分频模块 . 8 3.3.1 数控分频模块的VHDL设计. 8 3.4 music模块. 10 3.4.1 音符数据文件. 10 3.5.2 LPM-ROM定制 . 12 3.6 顶层文件 . 14 4 时序仿真及下载调试过程. 16 4.1 时序仿真图 . 16 4.2 引脚锁定以及下载 . 17 4.3调试过程及结果. 17 5扩大乐曲硬件演奏电路的通用性 . 18 5.1

4、 完善分频预置数模块的功能 . 18 设计总结与心得体会. 21 参考文献. 22 一 乐曲硬件演奏电路设计 设计要求 利用FPGA,设计一个乐曲硬件演奏电路。乐曲的12平均率规定每2个八 度如简谱中的中音1与高音1之间的频率相差1倍。在2个八度音之间又 可分为12个半音每2个半音的频率比为12/2。另外音符A的频率为440HZ 音符B到C之间E到F之间为半音其余为全音。由此可以计算出简谱中从 低音l至高音1之间每个音符的频率。设计音符查找表电路模块时钟模块数 控分频器模块音乐节拍产生模块电路。 1 、方案论证与对比 1.1方案一 利用FPGA来实现乐曲硬件演奏电路。乐曲的12平均率规定每2个

5、八度 如简谱中的中音1与高音1之间的频率相差1倍。在2个八度音之间又可 分为12个半音每2个半音的频率比为12/2。另外音符A的频率为440HZ 音符B到C之间E到F之间为半音其余为全音。由此可以计算出简谱中从 低音l至高音1之间每个音符的频率。设计音符查找表电路模块时钟模块数 控分频器模块音乐节拍产生模块电路。 1.2 方案二 制作一个纯硬件电路来完成乐曲演奏。1.3综合对比 与利用微处理器来实现乐曲演奏相比以纯硬件完成乐曲演奏电路的逻辑要 复杂得多如果不借助于功能强大的EDA工具和硬件描述语言仅凭传统的数 字逻辑技术即使最简单的演奏电路也难以实现。所以选择方案一。 2 2 乐曲演奏电路原理

6、 2.1 音乐演奏电路原理 音乐演奏电路原理音乐演奏电路原理 音乐演奏电路原理 图1 电路原理框图 该主系统由三个模块Songer顶层文件、div分频器、译码器组成。且Songer 顶层文件还包括3个子文件分别是NoteTabsToneTaba和Speakera此外我 们还需建立一个名为“music”的LPM_ROM模块与NoteTabs模块连接。 2.2 音符频率的获得 音符频率的获得音符频率的获得 音符频率的获得 多个不同频率的信号可通过对某个基准频率进行分频器获得。由于各个音 符的频率多为非整数而分频系数又不能为小数故必须将计算机得到的分频系 数四舍五入取整。若基准频率过低则分频系数过小

7、四舍五入取整后的误差较 大。若基准频率过高虽然可以减少频率的相对误差但分频结构将变大。实际 上应该综合考虑这两个方面的因素在尽量减少误差的前提下选取合适的基准 频率。本文中选取750KHz的基准频率。由于现有的高频时钟脉冲信号的频率为 12MHz故需先对其进行16分频才能获得750KHz的基准频率。对基准频率分频后的输出信号是一些脉宽极窄的尖脉冲信号占空比=1/分频系数。为提高输 出信号的驱动能力以使扬声器有足够的功率发音需要再通过一个分频器将原 来的分频器的输出脉冲均衡为对称方波占空比=1/2但这时的频率将是原来 的1/2。 由于最大分频系数是1274故分频器采用11位二进制计数器才能满足要

8、求。 32.3 乐曲节奏的控制 乐曲节奏的控制乐曲节奏的控制 乐曲节奏的控制 本课设的两只老虎乐曲最小的节拍为1/4拍若将1拍的时间定为1秒 则只需要提供一个4Hz的时钟频率即可产生1/4拍的时长0.25秒对于其它 占用时间较长的节拍必为1/4拍的整数倍则只需要将该音符连续输出相应的 次数即可。 计数时钟信号作为输出音符快慢的控制信号时钟快时输出节拍速度就快 演奏的速度也就快时钟慢时输出节拍的速度就慢演奏的速度自然降低。 2.4 乐谱发生器 本文将乐谱中的音符数据存储在LPM-ROM中如“两只老虎”乐曲中的第一 个音符为“3”此音在逻辑中停留了4个时钟节拍即1秒的时间相应地 音符“3”就要在L

9、PM-ROM中连续的四个地址上都存储。当一个4Hz的时钟来时 相应地就从LPM-ROM中输出一个音符数据。 2.5 乐曲演奏电路原理框图 我们知道组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连 续演奏所需的两个基本要素问题是如何来获取这两个要素所对应的数值以及通 过纯硬件的手段来利用这些数值实现所希望乐曲的演奏效果。图1中模块U1 类似于弹琴人的手指U2类似于琴键U3类似于琴弦或音调发声器。 音符的频率可以由图1中的SPEAKERA获得这是一个数控分频器。由 其clk端输入一具有较频率这里是12MHz的信号通过SPEAKERA分频后 由SPKOUT输出由于直接从数控分频器中出来的输出信

10、号是脉宽极窄的脉冲 式信号为了有利于驱动扬声器需另加一个D触发器以均衡其占空比但这 时的频率将是原来的1/2。SPEAKERA对clk输入信号的分频比由11位预置数 Tone10.0决定。SPKOUT的输出频率将决定每一音符的音调这样分频计数 器的预置值Tone10.0与SPKOUT的输出频率就有了对应关系。 音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定图1中模 块TONETABA的功能首先是为SPEAKERA提供决定所发音符的分频预置数 而此数在SPEAKERA输入口停留的时间即为此音符的节拍值。输向TONETABA 4中 Index3.0的值ToneIndex3.0的输出值与持续

11、的时间由模块NOTETABS决 定。在NOTETABS中设置了一个8位二进制计数器作为音符数据ROM的地 址发生器。得到乐曲演奏电路的原理框图如图1所示 图1 电路原理图 3 音乐硬件演奏电路的设计实现 音乐硬件演奏电路主要是用VHDL语言来设计并利用QuartusII软件工具来 编译、测试和仿真。根据顶层原理图共分为地址发生器模块、分频预置数模块、 数控分频模块这三个模块。而music模块是存放乐曲中的音符数据在我们的顶 层原理图中并没有显示出来地址发生器模块作为music模块中所定制的音符数 据ROM的地址发生器分频预置数模块提供分频预置数即给数控分频模块提供计 数初值。数控分频模块根据分

12、频预置数输出各个音符所对应的频率。 3.1 地址发生器模块 地址发生器模块地址发生器模块 地址发生器模块 地址发生器模块设置了一个8位二进制计数器(计数最大值为138)作为音 符数据ROM的地址发生器。每来一个时钟脉冲信号(Clk)8位二进制计数器就 计数一次ROM文件中的地址也就随着递增音符数据ROM中的音符也就一个接 一个连续的取出来了。 3.1.1 地址发生器的VHDL设计 这个计数器的计数频率选为4Hz即每一计数值的停留时间为0.25秒恰 为当全音符设为1秒四四拍的4分音符持续时间。例如地址发生器在以下的 5VHDL逻辑描述中“两只老虎”乐曲的第一个音符为“3”此音在逻辑中停留 了4个

13、时钟节拍即1秒时间。那么相应随着程序中的计数器按4Hz的时钟频率 作加法计数时即随地址递增时将从音符数据ROM中将连续取出4个音符“3” 通过toneindex3.0端口输向分频预置数模块。这样两只老虎乐曲中的音符就 一个接一个的通过toneindex3.0端口输向分频预置数模块。程序如下 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY NoteTabs IS PORT (clk: IN STD_LOGIC; ToneIndex:OUT STD_LOGIC_VECTOR (3

14、DOWNTO 0); END; ARCHITECTURE one OF NoteTabs IS COMPONENT MUSIC PORT (address: IN STD_LOGIC_VECTOR(7 DOWNTO 0); inclock: IN STD_LOGIC; q: OUT STD_LOGIC_VECTOR (3 DOWNTO 0); END COMPONENT; SIGNAL Counter: STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN CNT8: PROCESS(clk,Counter) BEGIN IF Counter=138 THEN Counte

15、r=00000000; ELSIF (clkEVENT AND clk=1) THEN CounterCounter,q=ToneIndex,inclock=clk); END one; 程序的功能是每来一个时钟,地址值递增1并将这个地址上所存储的音符 数据输出。当Clk来了一个时钟脉冲,输出相应地址上的音符3地址值递增1 接下来的三个时钟脉冲来时输出也是音符3地址连续递增3次再下一个脉 冲来时输出为音符5等等都符合模块中的音符数据文件中的地址/数据表。 3.2 分频预置数模块 分频预置数模块是乐曲简谱码对应的分频预置数查表电路。它提供了每个 音符所对应的分频预置数即给数控分频模块提供计数初值

16、以”两只老虎”乐 曲为例列出了在这个乐曲中所用到的13个音符的分频预置数。 3.2.1 分频预置数模块的VHDL设计 在这个模块的VHDL逻辑描述中设置了“两只老虎”乐曲中全部音符所对应 的分频预置数共13个每一音符的停留时间由音乐节拍和地址发生器模块的 时钟Clk的输入频率决定在此为4Hz。这13个值的输出由程序的4位输入 值index3.0确定。输向程序4中index3.0的值又由地址发生器模块的输 出toneindex3.0的输出值和持续时间决定。程序如下 library ieee; use ieee.std_logic_1164.all; entity tonetaba is port

17、(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); 7end entity tonetaba; architecture one of tonetaba is begin search:process(index) begin case index is when0000=tone=11111111111;code=0000;hightone=0110000010

18、1;code=0001;hightone=01110010000;code=0010;hightone=10000001100;code=0011;hightone=10010101101;code=0101;hightone=10100001010;code=0110;hightone=10101011100;code=0111;hightone=10110000010;code=0001;hightone=10111001000;code=0010;hightone=11000000110;code=0011;hightone=11001010110;code=0101;hightone=

19、11010000100;code=0110;hightone=11011000000;code=0001;highnull; end case; end process; end one; 模块的功能是输出各个音符所对应的分频预置数当index是“0000” 8tone输出为2047即休止符的分频预置数当index是“0101”时 tone输 出为1197即低音5的分频预置数当index是“1111”时 tone输出为1728 即高音1的分频预置数等等其它状态时tone分别输出相应音符的分频预置数。 3.3 数控分频模块 数控分频模块数控分频模块 数控分频模块 音符的频率由数控分频模块获得这是

20、一个数控分频电路。它是由一个初值 可变的加法计数器构成。该计数器的模为2047当计数器记满时计数器产生 一个溢出信号FULL此溢出信号就是用作发音的频率信号。在计数器的输入端 给定不同的初值而此预置数就是表1中的计数初值就可得到不同音符的发音 频率信号。它计满时所需要的计数初值可由下式来表示。计数初值Tone=2047 分频系数而分频系数又可有下式来求分频系数=基准频率/音符的发生频率 低音时Tone值小分频系数大溢出信号周期长扬声器发出的声音低Tone 随音乐的乐谱变化大自动控制分频比实现了数控分频发生信号的频率与音 调Tone成正比。这就是利用数控分频器自动演奏音乐的原理。 3.3.1 数

21、控分频模块的 数控分频模块的数控分频模块的 数控分频模块的VHDL设计 设计设计 设计 其时钟Clk端输入的是12MHz的信号从数控分频器中出来的输出信号 是脉宽极窄的脉冲式信号为了有利于驱动扬声器需另加一个D触发器以均衡 其占空比这时的频率就变为原来的1/2刚好就是相应音符的频率。数控分频 模块中对Clk输入信号的分频比由11位预置数tone10.0决定。Fout的输出 频率将决定每一个音符的音调这样分频计数器的预置值tone10.0与Fout 的输出频率就有了对应关系。例如在分频预置数模块中若取tone10.0=1036 将发出音符为“3”音的信号频率。程序如下 use ieee.std_

22、logic_1164.all; use ieee.std_logic_unsigned.all; entity speakera is port(clk: in std_logic; tone: in std_logic_vector(10 downto 0); 9 spks: out std_logic); end entity speakera; architecture one of speakera is signal preclk,fullspks: std_logic; begin divideclk: process(clk) variable count4: std_logic

23、_vector(3 downto 0); begin preclk11 then preclk=1;count4:=0000; elsif clkevent 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 preclkevent and preclk=1then if count11=16#7ff#then count11:=tone;fullspks=1

24、; else count11:=count11+1;fullspks=0;end if; end if; end process; delayspks: process(fullspks) variable count2: std_logic; begin 10 if fullspksevent and fullspks=1 then count2:=not count2; if count2=1 then spks=1; else spksmegawizard plug-in manager选择 “creat a new”然后按“next”键进入图2所示界面。选择LPM-ROM 最后在bro

25、wse下的栏中键入路径与输出文件名“D:mucic.vhd”注意后缀 vhd小写。 图3 选择路径 (2)单击“next”键将出现图3所示的界面选择ROM数据位宽度为4地 址线宽为8即设置此ROM能存储8位二进制数据共64个然后进入图4所示 的窗口。 3通过在图4所示窗口的“browse”钮找ROM中的加载文件路径和文件 名“D:alteraQuartusIImusic.mif”注意ROM元件的inclock文件名 “D:alteraQuartusIImusic.mif”注意ROM元件的inclock是地址锁存钟。 13此模块的功能是输出相应地址上所存储的音符数据当address是0、1、2、

26、 3时q的输出是3当address是4、5、6时q的输出是5当address是7 时q的输出是6等等都符合模块中的音符数据文件中的地址/数据表。这里必 须选择AUTO和Dual clockused separate input and outputClocks 选项 图4 芯片的选择 (4)单击“next”键将出现图5所示的界面选择允许在线编程地址线宽 为8即设置此ROM能存储8位二进制数据共64个通过在图4所示窗口的 “browse”钮找ROM中的加载文件路径和文件名 “D:alteraQuartusIImusic.mif”注意ROM元件的inclock文件名“D:alteraQuartus

27、IImusic.mif”注意ROM元件的inclock是地址锁存钟。 13此模块的功能是输出相应地址上所存储的音符数据当address是0、1、2、 3时q的输出是3当address是4、5、6时q的输出是5当address是7 时q的输出是6等等都符合模块中的音符数据文件中的地址/数据表。这里必 须选择AUTO和Dual clockused separate input and outputClocks 选项 图4 芯片的选择 (4)单击“next”键将出现图5所示的界面选择允许在线编程地址线宽 为8即设置此ROM能存储8位二进制数据共64个通过在图4所示窗口的 “browse”钮找ROM中

28、的加载文件路径和文件名 “D:alteraQuartusIImusic.mif”注意ROM元件的inclock文件名 “D:alteraQuartusIImusic.mif”注意ROM元件的inclock是地址锁存钟 然后单击Next完成LPM_ROM的定制。 14如下图所示: 图5 选择是否在线编程 3.6 顶层文件 程序如下 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY Songer IS PORT (CLK12MHZ: IN STD_LOGIC; CLK8HZ: IN STD_LOGIC; CODE1: OUT STD_LOGIC_V

29、ECTOR (3DOWNTO 0); HIGH1: OUT STD_LOGIC; SPKOUT: OUT STD_LOGIC); 15END ENTITY Songer; ARCHITECTURE one OF Songer IS COMPONENT NoteTabs PORT (clk: IN STD_LOGIC; ToneIndex: OUT STD_LOGIC_VECTOR (3 DOWNTO 0); END COMPONENT; COMPONENT ToneTaba PORT (Index: IN STD_LOGIC_VECTOR (3 DOWNTO 0); CODE: OUT STD

30、_LOGIC_VECTOR (3 DOWNTO 0); HIGH: OUT STD_LOGIC; Tone: OUT STD_LOGIC_VECTOR (10 DOWNTO 0); END COMPONENT; COMPONENT Speakera PORT (clk: IN STD_LOGIC; Tone: OUT STD_LOGIC_VECTOR (10 DOWNTO 0); SpkS: out STD_LOGIC); END COMPONENT; SIGNAL Tone: STD_LOGIC_VECTOR (10 DOWNTO 0); SIGNAL ToneIndex: STD_LOGI

31、C_VECTOR (3 DOWNTO 0); BEGIN u1: NoteTabs PORT MAP(clk=CLK8HZ,ToneIndex=ToneIndex); u2:ToneTabaPORTMAP(Index=ToneIndex,Tone=Tone,CODE=CODE1,HIGH=HIGH 1); u3:SpeakeraPORTMAP(clk=CLK12MHZ,Tone=TONE,SpkS=SPKOUT); 16END one; 将所编写的顶层文件程序设为当前工程通过对程序进行编译仿真确定 工程没有错误后经过引脚锁定就可以下载到EDA试验箱中了。通过试验箱上的蜂 鸣器我们可以听到“两只

32、老虎”的乐曲。 4时序仿真及下载调试过程 关于乐曲演奏电路设计的实现关键是要实现它的时序仿真下面就是各部分 的仿真图示。 4.1 时序仿真图 时序仿真图时序仿真图 时序仿真图 图6 Notetabas的时序仿真图 图7 Tonetaba的时序仿真 17 图8 Speakerea的时序仿真 图9 Songer的时序仿真 4.2 引脚锁定以及下载 为实现所设计的功能管脚锁定时选用实验箱的模式 5。 锁定管脚如下 图 10 引脚锁定 4.3调试过程及结果 这个乐曲硬件演奏电路的设计是仿照EDA实验例子设计的。一开 始我们仔细研究书本例子后按照书上的例子建立工程并在实验 箱上下载测试实现两只老虎乐曲可

33、以播放实验成功。接下来根 据设计要求我们就选了两只老虎这首歌曲把它翻译成需要的 音符数据并把它和前一首曲子放在一个数据ROM里。然后通过地 址的选择实现手动和自动播放歌曲。详见前面实验原理最后下载 18在实验箱上进行硬件测试。 5 扩大乐曲硬件演奏电路的通用性 前面所设计的电路只能演奏”两只老虎”曲子但是在实际应用中,若能将 电路实用于各种曲子的演奏它的实用性和应用范围就会扩大许多。这里主要通 过修改分频预置数模块的程序使其实用于各种曲子的演奏。另外要使更改乐曲 方便主要通过重新设置音符数据文件再对其进行LPM-ROM定制。 5.1 完善分频预置数模块的功能 在前面的VHDL设计中我们只能通过

34、程序输出”两只老虎”曲子中的13 个音符的分频预置数即计数初值但是在其它的乐曲中可能会用到另外的那 些音符因此对程序进行修改完善它的功能使其能输出另外那些音符的分频预 置数。程序修改如下 Library ieee; Use ieee.std_logic_1164.all; Entity tonetaba is Port( index : in std_logic_vector(4 downto 0); code : out std_logic_vector(4 downto 0); high : out std_logic; tone : out std_logic_vector(10 dow

35、nto 0); End; Architecture one of tonetaba is Begin Search : process(index) Begin 19 Case index is When 00000=tone=11111111111;code=00000;hightone=01100000101;code=00001;hightone=01110010000;code=00010;hightone=10000001100;code=00011;hightone=10000110101;code=00100;hightone=10010101101;code=00101;hig

36、htone=10100001010;code=00110;hightone=10101011100;code=00111;hightone=10110000010;code=01000;hightone=10111001000;code=01001;hightone=11000000110;code=01010;hightone=11000101000;code=01011;hightone=11001010110;code=01100;hightone=11010000100;code=01101;hightone=11010110101;code=01110;hightone=11011000000;code=10001;hightone=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论