1、 毕业论文 设计 任务书 院 (系 ) 电信工程系 专业班级 电子信息工程 076 班 学生姓名 一、毕业论文设计题目 基于 FPGA 的音乐彩灯控制器 二、毕业论文设计工作自 2011 年 3 月 7 日 起至 2011 年 6 月 25 日止 三、毕业论文设计进行地点 : 陕西理工学院 四、毕业论文设计的内容要求: 1设计任务及要求 ( 1)了解 FPGA 的结构与工作原理,学习 VHDL 设计的基本语句; ( 2)设计基于 FPGA 的硬件演奏电路,并进行软件仿真; ( 3)建立与彩灯有关的硬件电路搭 建,进行系统联调,实现音乐彩灯控制; ( 4)撰写设计论文 2成果形式 ( 1)设计报
2、告(要求画出原理电路图、主程序流程图及仿真结果等,写出调试过程) ( 2)硬件电路实物 3知识准备 VHDL 语言程序设计、 EDA 技术、数字电子技术、模拟电子技术等。 5时间安排 3 月 7 日 3 月 20 日:设计准备(领任务书、收集资料、完成开题报告)。 3 月 21 日 4 月 30 日:理论准备, VHDL 编程、仿真。 5 月 1 日 5 月 20 日:硬件连接、调试 。 5 月 21 日 6 月 15 日:撰写设计报告。 6 月 16 日 6 月 20 日:整理说明书;准备答辩报告、进行答辩。 指 导 教 师 系 (教 研 室 ) 电子技术 系 (教研室 )主任签名 批准日期
3、 接受论文 (设计 )任务开始执行日期 学生签名 基于 FPGA 的音乐彩灯控制器 XX (陕西理工学院 电信工程系 电子信息工程专业 07X 班,陕西 汉中 723000) 指导教师: XXX 摘 要 设计一种利用 FPGA 以及 VHDL 硬件描述语言实现的音乐彩灯控制器,实现了乐曲播放的同时,彩灯随音乐闪烁,可以根据需要配置不同的音乐,最后在 EDA 实验开发箱上硬件实现。 关键词 FPGA; VHDL;彩灯; EDA 实验开发箱 The Music Coloured Lights Controller Based on FPGA XXXXXXX ( Grade07,ClassX,Maj
4、or Electronics and Information Engineering, Electronics Engineering Dept., Shaanxi University of Technology, Hanzhong 723000, Shaanxi) tutor:XXXXXXXX Abstract: Design a use of FPGA and VHDL hardware description language realization of music coloured lights controller, realized the music played at th
5、e same time, with music flashing lights, can according to need to configure the music, and the last in different experiment development box on EDA hardware implementation. Keywords: FPGA;VHDL;coloured lamp;EDA hardware implementation 目录 引言 . 1 1 系统设计方案 . 1 1.1系统设计要求 . 1 1.2系统组成 . 2 1.2.1 软件组成 . 2 1.
6、2.2 硬件组成 . 2 2 软件设计 . 2 2.1软件设计的理论基础 . 2 2.2.1 顶层电路设 计 . 4 2.2.2 音乐节拍和音调发生器 NOTETABS 模块 . 5 2.2.3 音乐谱对应分频预制数查表电路 TONETABA 模块 . 6 2.2.4 音乐符数控 11 分频 SPEAKERA 模块 . 8 2.2.5 乐曲演奏音符数据文件 music梁祝 . 10 2.2.6 LPM-ROM 的定制 . 10 2.2.7 整体举例说明 . 12 2.3 VHDL 程序的仿真与调试 . 12 2.3.1 音乐节拍和音调发生器 NOTETABS 模块的仿真 . 12 2.3.2
7、音乐谱对应分频预制数查表电路 TONETABA 的仿真 . 13 2.3.3 音乐符数控 11 分频 SPEAKERA 模块的仿真 . 13 2.3.4 完整电路仿真 . 13 3 硬件设计 . 14 3.1输入端 . 15 3.2输出端 . 15 心得体会 . 17 致谢 . 17 参考文献 . 18 附录 A 完整程序 . 19 附录 B 硬件电路实 物图 . 25 英文文献及翻译 . 错误 !未定义书签。 1 引言 FPGA( Field Programmable Gate Array),即现场可编程门阵列,它是在 PAL、 GAL、 CPLD等可编程器件的基础上进一步发展的产物。它是作
8、为 专用集成电路 ( ASIC)领域中的一种半定制电路 而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点 5。 通过 FPGA实现音乐彩灯控制器,实质上就是将不同音阶与特定频率的方波信号对应起来,以方波信号驱动蜂鸣器发出声音,再根据不同音阶来控制彩灯闪烁。与借助微处理器( CPU 或 MCU)来实现乐曲演奏相比,以纯硬件方式完成乐曲演奏电路逻辑要复杂的多,仅凭传统的数字逻辑技术,即使最简单的演奏电路也难以实现,所以要借助功能强大的 EDA 工具和硬件描述语言,提供了设计可能性,使得硬件演奏电路看起来更直观。 本设计在 EDA 开发平台上利用 VHDL 语言 设计数控分
9、频器电路,利用数控分频的原理设计音乐硬件演奏电路,并定制 LPM-ROM 存储音乐数据,以“梁祝”为例,将音乐数据存储到 LPM-ROM,就达到了以纯硬件的手段来实现乐曲的演奏效果。只要修改 LPM-ROM 所存储的音乐数据,将其换成其他乐曲的音乐数据,再重新定制 LPM-ROM,连接到程序中就可以实现演奏。将演奏的高音和乐谱显示分别作为输出连接到 LED 彩灯上,彩灯将随音乐闪烁出不同花型。 1 系统设计方案 随着经济的迅速发展,人们需要进一步提高生活质量、美化生活环境,利用各种彩灯装饰已成为一种时尚。音乐彩灯 的出现,更好的满足了人们的追求,音乐的播放和彩灯有节奏地闪烁,同时达到听觉和视觉
10、的完美结合,成为构成其必不可少的条件。要了解如何产生不同音阶的音乐,首先要对乐音的特性有所了解。乐音实际上是有固定频率的信号。在乐曲的构成中,乐音的频率和持续的时间是其构成的要素。音阶的频率可以通过高频时钟进行分频得到。音频的高低可以通过外部的LED 灯的闪烁来显示,这样在音乐和流水灯的配合下可以使人产生强烈的节奏感。 1.1 系统设计要求 (1)分频主要是通过一个可控分频器实现的。采用时钟的频率越高,分频系数越大,分频后的 音阶频率就越准确。但同时由于分频系数大,使用的计数单元就会增加,从而耗费更多的硬件逻辑单元,因此可以采取一个较为适中的时钟频率 12MHz。 (2)经过分频后的信号是一个
11、脉宽极窄的时钟信号,必须对其进行脉冲宽度调整,增大占空比,才能有效地驱动蜂鸣器。在脉冲宽度调整时会对此信号再次二分频,所以在计算时,以乐音音阶的二倍频率去求取在特定时钟信号下的分频系数,以便在调整占空比后得到正确的音阶频率。 (3)乐曲的频率变化多端,对应的分频系数也不断变化,因此需要将播放的乐曲的分频系数事先存放在 ROM 中便 于读取。如果将分频系数直接作为存储码存放在寄存器中,势必会占有更大的容量。因此在这里选取索引值来作为存储码以减小容量。 (4)使用开发平台上的 LED 灯模拟彩灯,不同音调对应不同的花形,根据节奏闪烁,实现音乐彩灯控制器。 2 1.2 系统组成 1.2.1 软件组成
12、 软件部分共分五个模块,音乐节拍和音调发生器 NOTETABS 模块、音乐谱对应分频预制数查表电路 TONETABA 模块、音乐符数控 11 分频 SPEAKERA 模块、乐曲演奏音符数据文件 music梁祝和 ROM模块,其中, Music 模块存放乐曲中的音符数据, 地址发生器模块作为 music 模块中所定制的音符数据 ROM 的地址发生器,分频预制数模块提供分频预制数即给数控分频模块提供计数初值,十六进制模块对 12MHz 的时钟脉冲进行 16 分频,得到 750KHz 的频率,给数控分频模块提供时钟脉冲,数控分频模块根据分频预制数输出各个音符所对应的频率,软件组成框图如图 1.1。
13、CLK 输出 图 1.1 软件组成框图 1.2.2 硬件组成 用 MAXPlusII 把软件部分编译仿真结束后,下载到试验箱上,外接电源、信号发生器、 LED 灯和蜂鸣器,调试后实现音乐彩灯控 制器。如图 1.2 硬件原理框图。 图 1.2硬件原理框图 2 软件设计 2.1 软件设计的理论基础 ( 1)音乐硬件演奏电路基本原理 6 硬件电路的发声原理,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制 FPGA 芯片某个引脚输出一定频率的矩形波,接上蜂鸣器就能发出相应频率的声音。乐曲中的每个音符对应着一个确定的频率,要想 FPGA 发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。
14、乐曲都是由一连串的音符组成的,因此按照乐曲的乐谱依次输出相应音符所对应的 频率,就可以在蜂鸣器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让蜂鸣器能够发声是不够的,音乐节拍和音调发生器 NOTETABS 音乐谱对应分频预制数查表电路 TONETABS 音乐符数控 11 分频SPEAKERA EPF10K10LC84-4 (将软件部分下载到该芯片 ) 时钟信号 8Hz 时钟信号 12MHz 蜂鸣器 LED 灯 3 还必须准确地控制乐曲的节奏,即乐曲中每个音符的发声频率及其持续时间是乐曲能连续演奏的两个关键因素。 ( 2)音符频率的获得 多个不同频率的信号可通过对某个基准频率进行分频
15、获得。由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。实际上应该综 合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。 为提高输出信号的驱动能力,以使扬声器有足够的功率发音,需要再通过一个分频器将原来的分频器输出脉冲均衡为对称方波(占空比为 1/2),但这时的频率是原来的 1/2。下表中各音符的分频系数就是从 750KHz 的基准频率二分频得到的 375KHz 频率基准上计算得到的。由于最大的分频系数是 127
16、4,故分频器采用 11 位二进制计数器能满足要求,乐曲中的休止符,只要将分频系数设为 0,此时扬声器就不会发出声音 ,如表 2.14。 表 2.1 各音符的频率及其对应 的分频系数 音符名 频率( Hz) 分频系数 计数初值 音符名 频率( Hz) 分频系数 计数初值 休止符 低音 1 低音 2 低音 3 低音 4 低音 5 低音 6 低音 7 中音 1 中音 2 中音 3 375000 249.349 330.396 370.92 386.598 394.737 495.376 555.56 588.697 638.84 724.574 0 1274 1135 1011 970 950 75
17、7 675 637 587 505 2047 773 912 1036 1077 1197 1290 1372 1410 1480 1542 中音 4 中音 5 中音 6 中音 7 高音 1 高音 2 高音 3 高音 4 高音 5 高音 6 高音 7 796.178 882.353 989.446 1136.363 1175.549 1353.790 1512.097 1609.442 1802.884 2027.027 2272.727 468 425 379 330 319 277 248 233 208 185 165 1579 1622 1668 1717 1728 1770 1799
18、 1814 1839 1862 1882 ( 3)乐曲节奏的控制 本设计中的梁祝乐曲,最小节拍为四一拍,若将一拍的时间定为 1 秒,则只需要提供一个4Hz 的时钟频率即可产生四一拍的时长( 0.25 秒),对于其它占用时间较长的节拍(必为四一拍的整数倍)则只需要将该音符连续输出相应的次数即可。 计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然低。 ( 4)乐谱发生器 4 本文将乐谱中的音符数据存储在 LPM-ROM 中,如梁祝乐曲中的第一个音符为“ 3”,此音在逻辑中停留了 4 个时钟节拍,即 1 秒的时间,相应地,
19、音符“ 3”就要在 LPM-ROM 中连续的四个地址上都存储。当一个 4Hz 的时钟到来时,相应的从 LPM-ROM 中输出第一个音符“ 3”。 ( 5)彩灯 将乐谱发生器的输出端接上 LED 灯模拟彩灯, LED 灯会随着音乐的变化开始闪烁 ,因为实验箱上的灯是低电平亮,所以 LED 灯灭的是输出音调,而灯的闪烁速度则是按照音乐节奏。 2.2 软件模块设计 2.2.1 顶层电路设计 ( 1)顶层电路模块图 图 2.1顶层电路模 块图 ( 2)顶层电路 VHDL 程序 LIBRARY IEEE;-硬件演奏电路顶层设计 USE IEEE.STD_LOGIC_1164.ALL; ENTITY So
20、nger IS PORT(CLK12MHZ:IN STD_LOGIC;-音调频率信号 CLK8HZ:IN STD_LOGIC;-节拍频率用于控制音长(节拍)的时钟频率 CODE1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);-简谱码输出显示 HIGH1:OUT STD_LOGIC;-高 8 度指示 SPKOUT:OUT STD_LOGIC);-声音输出 END; 5 ARCHITECTURE one OF Songer IS COMPONENT NoteTabs-原件 U1 例换化 PORT(clk:IN STD_LOGIC; ToneIndex:OUT STD_LOGI
21、C_VECTOR(3 DOWNTO O); END COMPONENT; COMPONENT ToneTaba-元件 U2 例换化 PORT(Index:IN STD_LOGIC_VECTOR(3 DOWNTO O); CODE:OUT STD_LOGIC_VECTOR(3 DOWNTO O); HIGH:OUT STD_LOGIC; Tone:OUT STD_LOGIC_VECTOR(10 DOWNTO O); END COMPONENT; COMPONENT Speakera-元件 U3 例换化 PORT(clk:IN STD_LOGIC; Tone:IN STD_LOGIC_VECTOR
22、(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); BEGIN u1:NoteTabs PORT MAP(clk=CLK8HZ,ToneIndex=ToneIndex);-参数 传递映射语句 u2:ToneTaba PORT MAP(Index=ToneIndex,Tone=Tone,COED=CODE1,HIGH=HIGH1); u3:Speakera PORT M
23、AP(clk=CLK12MHZ,Tone=Tone,SpkS=SPKOUT); END; 2.2.2 音乐节拍和音调发生器 NOTETABS 模块 ( 1)音乐节拍和音调发生器 NOTETABS 模块生成图,如图 2.2 图 2.2音乐节拍和音调发生器 NOTETABS 模块 在 NOTETABS 中设置了一个 8 位二进制计数器,作为音符数据 ROM 的地址发生器。这个计数器的6 计数频率选为 4Hz,即每一计数器的停留时间为 0.25 秒,恰为当全音符设为 1 秒时,四四拍的 4 分音符持续时间。例如, NOTETABS 在以下 VHDL 逻辑描述中,梁祝乐曲的第一个音符为“ 3”,此音在
24、逻辑中停留了 4 个时钟节拍,即 1 秒时间。 ( 2)音乐节拍和音调发生器 NOTETABS 模块 VHDL 程序设计 LIBRARY IEEE;-音乐节拍和音调发生器模块 USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY NoteTabs IS PORT(clk:IN STD_LOGIC;-音乐节拍时钟 4HZ ToneIndex:OUT STD_LOGIC_VECTOR (3 DOWNTO O); END; ARCHITECTURE one OF NoteTabs IS COMPONENT music
25、 -音符数据 ROM PORT(address:IN STD_LOGIC_VECTOR(7 DOWNTO O); clock:IN STD_LOGIC; q :OUT STD_LOGIC_VECTOR(3 DOWNTO 0); END COMPONENT; SIGNAL Counter:STD_LOGIC_VECTOR (7 DOWNTO 0);-8 位二进制计数器 BEGIN CNT8:PROCESS(clk,Counter,sel,rst) BEGIN IF(clkEVENT AND clk=1)and(Counter=256 or rst=0) then CounterCounter,q
26、=ToneIndex,clock=clk); END 2.2.3 音乐谱对应分频预制数查表电路 TONETABA模块 ( 1)音乐谱对应分频预制数查表电路 TONETABA 模块生成图,如图 2.3 7 图 2.3 音乐谱对应分频预制数查表电路 TONETABA 模块 音符的持续时间需根据乐曲的速度及每个音符的节拍数来确定,模块 TONETABA 的功能首先是为SPEAKERA 提供决定所发音符的分频预制数,而此数在 SPEAKERA 输入口停留的时间即为此音符的节拍值。模块 TONETABA 是乐谱简谱码对应的分频预制数查表电路,其中设置了梁祝乐曲全部音符所对应的分频预制数, 共 13 个,
27、每一音符的停留时间由音乐节拍和音调发生器模块 NOTETABS的 clk的输入频率决定,在此为 4Hz。这 13 个值的输出,由对应于 TONETBAB 的 4 位输入值 Index3.0确定,而 Index3.0最多有 16 种可选值。输向 TONETABA中 Index3.0的值 ToneIndex3.0的输出值与持续的时间由模块 NOTETABS 决定。 ( 2)音乐谱对应分频预制数查表电路 TONETABA 模块 VHDL 程序设计 LIBRARY IEEE;-音乐谱对应分频预制数查 表电路模块 USE IEEE.STD_LOGIC_1164.ALL; ENTITY ToneTaba
28、IS PORT(Index:IN STD_LOGIC_VECTOR(3 DOWNTO O);-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 IS BEGIN Search:PROCESS(Index) BEGIN CASE Index IS-译码电路,查表方式,控制音调的预制数 13 组频率 WHEN“0000“=ToneToneToneToneTone=“10010101101“;CODE=“0101“;HIGH=0;-1197