收藏 分享(赏)

EDA乐曲硬件演奏电路设计_课程设计.doc

上传人:精品资料 文档编号:10628153 上传时间:2019-12-10 格式:DOC 页数:24 大小:667.09KB
下载 相关 举报
EDA乐曲硬件演奏电路设计_课程设计.doc_第1页
第1页 / 共24页
EDA乐曲硬件演奏电路设计_课程设计.doc_第2页
第2页 / 共24页
EDA乐曲硬件演奏电路设计_课程设计.doc_第3页
第3页 / 共24页
EDA乐曲硬件演奏电路设计_课程设计.doc_第4页
第4页 / 共24页
EDA乐曲硬件演奏电路设计_课程设计.doc_第5页
第5页 / 共24页
点击查看更多>>
资源描述

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

2、语言设计数控分频器电路,利用数控分频的原理设计乐曲硬件演奏电路,并定制 LPM-ROM 存储音乐数据,以“两只老虎”乐曲为例,将音乐数据存储到 LPM-ROM,就达到了以纯硬件的手段来实现乐曲的演奏效果。只要修改 LPM-ROM 所存储的音乐数据,将其换成其他乐曲的音乐数据,再重新定制 LPM-ROM,连接到程序中就可以实现其它乐曲的演奏。关键词:FPGA;EDA;VHDL;音乐目 录设计要求 11、方案论证与对比 .11.1 方案一 .11.2 方案二 .11.3 综合对比 .12 乐曲演奏电路原理 22.1 音乐演奏电路原理 22.2 音符频率的获得 22.3 乐曲节奏的控制 32.4 乐

3、谱发生器 32.5 乐曲演奏电路原理框图 33 音乐硬件演奏电路的设计实现 43.1 地址发生器模块 43.1.1 地址发生器的 VHDL 设计 43.2 分频预置数模块 63.2.1 分频预置数模块的 VHDL 设计 63.3 数控分频模块 83.3.1 数控分频模块的 VHDL 设计 83.4 music 模块 103.4.1 音符数据文件 103.5.2 LPM-ROM 定制 123.6 顶层文件 .144 时序仿真及下载调试过程 .164.1 时序仿真图 164.2 引脚锁定以及下载 .174.3 调试过程及结果 175 扩大乐曲硬件演奏电路的通用性 .185.1 完善分频预置数模块的

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

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

6、述语言,仅凭传统的数字逻辑技术,即使最简单的演奏电路也难以实现。所以选择方案一。12 乐曲演奏电路原理2.1 音乐演奏电路原理图 1 电路原理框图该主系统由三个模块:Songer 顶层文件、div 分频器、译码器组成。且Songer 顶层文件还包括 3 个子文件分别是 NoteTabs,ToneTaba 和 Speakera,此外,我们还需建立一个名为“music”的 LPM_ROM 模块与 NoteTabs 模块连接。2.2 音符频率的获得多个不同频率的信号可通过对某个基准频率进行分频器获得。由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。若基

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

8、大分频系数是 1274,故分频器采用 11 位二进制计数器才能满足要求。2.3 乐曲节奏的控制本课设的两只老虎乐曲,最小的节拍为 1/4 拍,若将 1 拍的时间定为 1 秒,则只需要提供一个 4Hz 的时钟频率即可产生 1/4 拍的时长(0.25 秒) ,对于其它占用时间较长的节拍(必为 1/4 拍的整数倍)则只需要将该音符连续输出相应的次数即可。计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低。2.4 乐谱发生器本文将乐谱中的音符数据存储在 LPM-ROM 中,如“两只老虎”乐曲中的第一个音符为“3” ,此音在

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

10、较频率(这里是 12MHz)的信号,通过 SPEAKERA 分频后由 SPKOUT 输出,由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个 D 触发器以均衡其占空比,但这时的频率将是原来的 1/2。SPEAKERA 对 clk 输入信号的分频比由 11 位预置数 Tone100决定。SPKOUT 的输出频率将决定每一音符的音调,这样,分频计数器的预置值 Tone100与 SPKOUT 的输出频率,就有了对应关系。音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定,图 1 中3模块 TONETABA 的功能首先是为 SPEAKERA 提供决定所发音

11、符的分频预置数,而此数在 SPEAKERA 输入口停留的时间即为此音符的节拍值。输向TONETABA 中 Index30的值 ToneIndex30的输出值与持续的时间由模块NOTETABS 决定。在 NOTETABS 中设置了一个 8 位二进制计数器,作为音符数据 ROM 的地址发生器。得到乐曲演奏电路的原理框图如图 1 所示:图 1 电路原理图3 音乐硬件演奏电路的设计实现音乐硬件演奏电路主要是用 VHDL 语言来设计,并利用 QuartusII 软件工具来编译、测试和仿真。根据顶层原理图,共分为地址发生器模块、分频预置数模块、数控分频模块这三个模块。而 music 模块是存放乐曲中的音符

12、数据,在我们的顶层原理图中并没有显示出来,地址发生器模块作为 music 模块中所定制的音符数据 ROM 的地址发生器,分频预置数模块提供分频预置数即给数控分频模块提供计数初值。数控分频模块根据分频预置数输出各个音符所对应的频率。3.1 地址发生器模块地址发生器模块设置了一个 8 位二进制计数器(计数最大值为 138),作为音符数据 ROM 的地址发生器。每来一个时钟脉冲信号(Clk),8 位二进制计数器就计数一次,ROM 文件中的地址也就随着递增,音符数据 ROM 中的音符也就一个接一个连续的取出来了。43.1.1 地址发生器的 VHDL 设计这个计数器的计数频率选为 4Hz,即每一计数值的

13、停留时间为 0.25 秒,恰为当全音符设为 1 秒,四四拍的 4 分音符持续时间。例如,地址发生器在以下的 VHDL 逻辑描述中, “两只老虎”乐曲的第一个音符为“3” ,此音在逻辑中停留了 4 个时钟节拍,即 1 秒时间。那么相应随着程序中的计数器按 4Hz 的时钟频率作加法计数时,即随地址递增时,将从音符数据 ROM 中将连续取出 4 个音符“3”通过 toneindex30端口输向分频预置数模块。这样两只老虎乐曲中的音符就一个接一个的通过 toneindex30端口输向分频预置数模块。程序如下LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEE

14、E.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_VECTOR(7 DOWNTO 0);inclock: IN STD_LOGIC;q: OUT STD_LOGIC_VECTOR (3 DOWNTO 0);END COMPONENT;SIGNAL Counter: STD

15、_LOGIC_VECTOR (7 DOWNTO 0);BEGINCNT8: PROCESS(clk,Counter)5BEGINIF Counter=138 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 位输入值 index30确定。输向程序4中 index30的值又由地址发生器模块的输出 toneindex30的输出值和持续时间决定。程序如下:lib

17、rary ieee;use ieee.std_logic_1164.all;entity tonetaba is6port(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 entity tonetaba;architecture one of tonetaba isbeginsearch:process(index)begincase index iswhen“

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

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

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

21、_logic_1164.all;use 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 entity speakera;architecture one of speakera issignal preclk,fullspks: std_logic;begindivideclk: process(clk)variable count4: std_logic_vector(3 do

22、wnto 0);beginpreclk11 then preclkmegawizard plug-in manager,选择“creat a new”,然后按“next”键,进入图 2 所示界面。选择 LPM-ROM;最后在 browse 下的栏中键入路径与输出文件名:“D:mucic.vhd” ,注意后缀vhd 小写。12图 3 选择路径(2)单击“next”键,将出现图 3 所示的界面,选择 ROM 数据位宽度为 4,地址线宽为 8,即设置此 ROM 能存储 8 位二进制数据共 64 个,然后进入图 4 所示的窗口。(3)通过在图 4 所示窗口的“browse”钮,找 ROM 中的加载文件

23、路径和文件名:“D:alteraQuartusIImusic.mif” ,注意 ROM 元件的 inclock 文件名:“D:alteraQuartusIImusic.mif”,注意 ROM 元件的 inclock 是地址锁存钟。此模块的功能是输出相应地址上所存储的音符数据,当 address 是0、1、2、3 时,q 的输出是 3;当 address 是 4、5、6 时,q 的输出是 5;当address 是 7 时,q 的输出是 6 等等都符合模块中的音符数据文件中的地址/数据表。这里必须选择 AUTO 和 Dual clock:used separate input and 13outp

24、utClocks 选项图 4 芯片的选择(4)单击“next”键,将出现图 5 所示的界面,选择允许在线编程,地址线宽为 8,即设置此 ROM 能存储 8 位二进制数据共 64 个,通过在图 4 所示窗口的“browse”钮,找 ROM 中的加载文件路径和文件名:“D:alteraQuartusIImusic.mif”,注意 ROM 元件的 inclock 文件名:“D:alteraQuartusIImusic.mif”,注意 ROM 元件的 inclock 是地址锁存钟,然后单击Next完成 LPM_ROM 的定制。如下图所示:图 5 选择是否在线编程3.6 顶层文件程序如下:LIBRARY

25、 IEEE;14USE IEEE.STD_LOGIC_1164.ALL;ENTITY Songer ISPORT (CLK12MHZ: IN STD_LOGIC;CLK8HZ: IN STD_LOGIC;CODE1: OUT STD_LOGIC_VECTOR (3DOWNTO 0);HIGH1: OUT STD_LOGIC;SPKOUT: OUT STD_LOGIC);END ENTITY Songer;ARCHITECTURE one OF Songer ISCOMPONENT NoteTabsPORT (clk: IN STD_LOGIC;ToneIndex: OUT STD_LOGIC_

26、VECTOR (3 DOWNTO 0);END COMPONENT;COMPONENT ToneTabaPORT (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 SpeakeraPORT (clk: IN STD_LOGIC;Tone: OUT STD_LOGIC_VECTOR (10 DOWNTO 0); Spk

27、S: out STD_LOGIC);END COMPONENT;15SIGNAL Tone: STD_LOGIC_VECTOR (10 DOWNTO 0);SIGNAL ToneIndex: STD_LOGIC_VECTOR (3 DOWNTO 0);BEGINu1: NoteTabs PORT MAP(clk=CLK8HZ,ToneIndex=ToneIndex);u2:ToneTabaPORTMAP(Index=ToneIndex,Tone=Tone,CODE=CODE1,HIGH=HIGH1);u3:SpeakeraPORTMAP(clk=CLK12MHZ,Tone=TONE,SpkS=

28、SPKOUT);END one;将所编写的顶层文件程序设为当前工程,通过对程序进行编译,仿真,确定工程没有错误后经过引脚锁定就可以下载到 EDA 试验箱中了。通过试验箱上的蜂鸣器我们可以听到“两只老虎”的乐曲。4 时序仿真及下载调试过程关于乐曲演奏电路设计的实现关键是要实现它的时序仿真,下面就是各部分的仿真图示。4.1 时序仿真图图 6 Notetabas 的时序仿真图16图 7 Tonetaba 的时序仿真图 8 Speakerea 的时序仿真图 9 Songer 的时序仿真4.2 引脚锁定以及下载为实现所设计的功能,管脚锁定时,选用实验箱的模式 5。锁定管脚如下:图 10 引脚锁定4.3调

29、试过程及结果17这个乐曲硬件演奏电路的设计是仿照 EDA 实验例子设计的。一开始,我们仔细研究书本例子后,按照书上的例子建立工程,并在实验箱上下载测试实现,两只老虎乐曲可以播放,实验成功。接下来,根据设计要求,我们就选了两只老虎这首歌曲,把它翻译成需要的音符数据,并把它和前一首曲子放在一个数据 ROM 里。然后,通过地址的选择实现手动和自动播放歌曲。 (详见前面实验原理)最后下载在实验箱上,进行硬件测试。 5 扩大乐曲硬件演奏电路的通用性前面所设计的电路只能演奏”两只老虎”曲子,但是在实际应用中,若能将电路实用于各种曲子的演奏,它的实用性和应用范围就会扩大许多。这里主要通过修改分频预置数模块的

30、程序,使其实用于各种曲子的演奏。另外要使更改乐曲方便,主要通过重新设置音符数据文件,再对其进行 LPM-ROM 定制。5.1 完善分频预置数模块的功能在前面的 VHDL 设计中,我们只能通过程序输出”两只老虎”曲子中的13 个音符的分频预置数(即计数初值) ,但是在其它的乐曲中可能会用到另外的那些音符,因此对程序进行修改完善它的功能,使其能输出另外那些音符的分频预置数。程序修改如下:Library ieee;Use ieee.std_logic_1164.all;Entity tonetaba isPort( index : in std_logic_vector(4 downto 0);co

31、de : out std_logic_vector(4 downto 0);high : out std_logic;18tone : out std_logic_vector(10 downto 0);End;Architecture one of tonetaba isBeginSearch : process(index)BeginCase index isWhen “00000“=tonetonetonetonetonetonetonetonetonetonetonetonetonetonetonetonetonetonetonetonetonetone null;End case;E

32、nd process;End;将其设为当前工程,并选用 cyclone 为目标芯片对其进行编译和仿真。完善后模块的功能是输出所有音符所对应的分频预置数。我们知道 tone 的输出值与表 1 中的分频预置数(计数初值)相符合,并且输出了所有音符的分频预置数。因此所编写的程序实现了模块的功能。20设计总结与心得体会本课设介绍了基于 FPGA 的音乐硬件演奏电路的设计,实现了一个乐曲播放器,而且描述了其工作原理、设计思路及实现方法,并在 MAX+PLUS 上选用目标芯片仿真实现了音乐硬件演奏电路的功能。实践证明:采用 FPGA 设计实现音乐硬件演奏电路的可行性和可靠性,而且更改乐曲容易,可根据需要修

33、改 ROM中的音符数据文件,从而使电路实现任一曲子的播放。这种基于 FPGA 的音乐硬件演奏电路的设计与实现,不仅通过 VHDL 层次化和模块化设计方法,同时采用数控分频和定制 LPM-ROM 的设计思想,更好的优化了乐曲演奏数字电路的设计,在此基础上不必变化顶层文件架构可随意变更乐曲,有效缩短了产品开发周期、减少了设计芯片的数量、降低了功耗、提高了设计的灵活性、可靠性和可扩展性。通过为期一周的课程设计,我应用所学 EDA 技术与 VHDL 和 EDA 实用技术实验及课程设计指导书顺利得完成了乐曲硬件演奏电路的设计。期间,我查阅里很多相关资料,更进一步学习了 VHDL 语言。不仅巩固了课堂知识

34、,而且有效的和实际结合在了一起,扩展了所学知识和见识。在设计过程中遇到不少问题,如编程能力不够,工程文件建立的错误,还有一些相关文件的使用不明白等问题。总体感觉就是:学得不够,知识真的很有用。同时,也感觉到书本知识与实际问题之间需要我们去探索的,不是学了书本知识就能很好的解决实际问题的,要通过不断的锻炼和学习才能更好的掌握好知识,这次课设也激发了我对 EDA 技术方面的兴趣,提高了理论结合实际的意识。21参考文献1.潘松、黄继业编著. EDA 技术与 VHDL,北京:清华大学出版社2.边计年主编.用 VHDL 设计电子线路, 北京:清华大学出版社3.王金明,杨吉斌编著.数字系统设计与 Verilog HDL.北京:电子工业出版社4.徐志军,徐光辉编著.CPLD/FPGA 开发与应用.北京:电子工业出版社5.潘松,黄继业编著.EDA 技术实用教程(第 2 版).北京:科学出版社6.叶天迟主编.EDA 实用技术实验及课程设计指导书.长春:自编实验指导书

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报