目录1 引言 (2)2 设计任务及设计要求 (2)3 设计原理及总体思路 (3)4 各单元模块的设计 (5)5 总电路设计 (17)6 设计调试体会与总结 (18)参考文献 (23)1 引言《EDA课程设计》(注:EDA即电子设计自动化,Electronics Design Automation)是继《模拟电子技术基础》、《数字电子技术基础》、《电子技术基础实验》课程后,电气类、自控类和电子类等专业学生在电子技术实验技能方面综合性质的实验训练课程,是电子技术基础的一个部分,其目的和任务是通过一周的时间,让学生掌握EDA的基本方法,熟悉一种EDA软件,并能利用EDA软件设计一个电子技术综合问题,并在实验箱上成功下载,为以后进行工程实际问题的研究打下设计基础。
1.通过课程设计使学生能熟练掌握一种EDA软件的使用方法,能熟练进行设计输入、编译、管脚分配、下载等过程。
2.通过课程设计使学生能利用EDA软件进行至少一个电子技术综合问题的设计,设计输入可采用图形输入法或AHDL硬件描述语言输入法。
3.通过课程设计使学生初步具有分析寻找和排除电子电路中常见故障的能力。
4.通过课程设计使学生能独立写出严谨的、有理论根据的、实事求是的、文理通顺的字迹端正的课程设计报告。
2 设计任务及设计要求设计一个简易硬件播放器并能播放多首音乐(最少四首),可通过按键手动控制音乐播放。
在播放音乐的同时可实现音谱与音高的显示,并通过16个LED 小灯显示不同音调的变化。
使用VHDL语言设计音调发生模块,音调编码模块,乐曲存储模块,控制模块,小灯控制模块,数字显示模块,音谱与音高输出模块等各个模块。
3 设计原理及总体思路产生音乐的两个因素是音乐频率和音乐的持续时间,以纯硬件完成演奏电路比利用微处理器(CPU)来实现乐曲演奏要复杂的多如果不借助于功能强大的EDA 工具和硬件描述语言,凭借传统的数字逻辑技术,即使最简单的演奏电路也难以实现。
根据设计要求,乐曲硬件演奏电路系统主要由音频发生模块和乐曲存储模块组成。
音频发生模块对FPGA的基准频率进行分频,得到与各个音阶对应的频率输出。
乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中可存放一个乐曲曲谱真值表,由一个计数器来控制此真值表的输出,而由计数器的计数时钟信号作为乐曲节拍控制信号。
3.1 音名与频率的关系音乐的十二平均率规定:每两个八度音(如简谱中的中音1与高音1)之间的频率相差一倍.在两个八度音之间,又可分为十二个半音,每两个半音的频率比为4。
另外,音名A(简谱中的低音6)的频率为440Hz,音名B到C之间,E 到F之间为半音,其余为全音,由此可以计算出简谱中从低音1到高音1之间每个音名的频率如表3-1所示。
表3-1 简谱中的音名与频率的关系由于音阶频率多为非整数,而分频系数又不能为小数,故必须将得到的分频数四舍五入取整。
若基准频率过低,则由于分频系数过小,四舍五入取整后的误差较大,若基准频率过高,虽然误码差变小,但分频结构将变大。
实际的设计应综合考虑两方面的因素,在尽量减小频率误差的前提下取舍合适的基准频率。
本例中选取12MHz的基准频率,若无12MHz的时钟频率,实际上,只要各个音名间的相对品频率关系不变,C作1与D作1演奏出的音乐听起来都不会“走调”。
各音阶频率及相应的分频系数如表2所示。
为了减少输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,因此在到达扬声器之前,有一个二分频的分频器。
表3-2中的分频系数就是从500KHZ频率二分频得到的250KHZ频率基础上计算得出的。
表3-2 各音阶频率对应的分频值由于最大的分频系数为1274,故采用13位二进制计数器已能满足分频要求。
在表3-2,除给出了分频比以外,给出了对应于各个音阶频率时计数器不同的初始值,对于乐曲中的休止符,要将分频系数设为0,即初始值为2047即可,此时扬声器将不会发声。
对于不同的分频系数,加载不同的初始值即可。
3.2 节拍控制原理该演奏电路演奏的乐曲是“梁祝”等片段,其最小的节拍为1拍。
将1拍的时长定为0.25秒,则需要再提供一个4Hz的时钟频率即可产生1拍的时长,演奏的时间控制通过音符的多次重复的方式来完成。
对于占用时间较长的节拍,如全音符为4拍(重复4),2/4音符为2拍(重复2),1/4音符为1拍(重复1)。
由于乐理规律对于任何一首音乐都是普遍适用的,所以以上原理对于其他三首乐曲同样适用。
4 各单元模块的设计4.1 音频发生模块4.1.1 模块引脚图4-1 speaker模块4.1.2 模块功能如图4-1,en为使能引脚,当en引脚接高电平时speaker模块使能可正常工作。
clk为时钟信号引脚,为speaker模块提供时钟信号。
tone[10..0]为11位的音调初始值信号并行总线,可快速的为speaker模块输送音调初始值信号,保证乐曲演奏的流畅性。
spks为电信号输出引脚,连接蜂鸣器将电信号转化为声信号。
该模块中有一个4位的计数器用于将12MHz时钟信号进行十二分频产生1MHz的基准信号。
一个11位的递增计数器用于赋音调初始值对基准信号进行频,最后进行二分频产生对称方波。
初始值D = 计数最大值N - 分频系数n (1) 4.1.3 VHDL程序library ieee;use ieee.std_logic_1164.all;entity speaker isport(en : in std_logic;clk : in std_logic;tone : in integer range 0 to 16#7ff#; --"2047"spks : out std_logic);end speaker;architecture behav of speaker issignal preclk : std_logic;signal fullspks : std_logic;begindivideclk: process(clk) --12分频variable count4 : integer range 0 to 15;beginpreclk<='0';if count4>11 thenpreclk<='1';count4:=0;elsif clk'event and clk='1' thencount4:=count4+1;end if;end process;genspks : process(preclk,tone)--"preclk=1MHZ";variable count11 : integer range 0 to 16#7ff#;beginif preclk'event and preclk='1' then --频率控制if count11=16#7ff# then --b"111,1111,1111"count11:=tone; -- 初始值D = 计数最大值N - 分频系数nfullspks<='1';else count11:=count11+1;fullspks<='0';end if;end if;end process;delay: process(fullspks)--"fullspks=488.2815HZ"; 二分频variable count2 : std_logic;beginif fullspks'event and fullspks='1' thencount2:=not count2;if en='0' thenspks<='0'; --gaile elsif count2='1' thenspks<='1';elsespks<='0'; --"spks=244.14075HZ"end if;end if;end process;end behav;4.2 音频编码模块4.2.1 模块引脚图4-2 tonetaba模块4.2.2 模块功能如图4-2,index[3..0]为4位的音符输入并行总线,用于为tonetaba 模块输送音符信号。
tone[10..0]为11位的音调初始值信号输出并行总线,为speaker 模块提供音调初始值信号。
code[3..0]为4位的音谱输出并行总线,为SELTIME 模块提供音谱信号。
high[1..0]为2位的音高输出并行总线,为SELTIME 模块提供音高信号。
该模块将输入的音符信号转化为音调初始值(tone),对应的音谱(code)及音高(high)并输出。
4.2.3 VHDL程序library ieee;use ieee.std_logic_1164.all;entity tonetaba isport(index : in integer range 0 to 15;tone : out integer range 0 to 16#7ff#; --"2047"code : out integer range 0 to 15;high : out integer range 0 to 2);end tonetaba;architecture behav of tonetaba isbeginsearch:process(index)begincase index iswhen 0=>tone<=2047; code<=0; high<=0;when 1=>tone<=773; code<=1; high<=0;when 2=>tone<=912; code<=2; high<=0;when 3=>tone<=1036; code<=3; high<=0;when 5=>tone<=1197; code<=5; high<=0;when 6=>tone<=1290; code<=6; high<=0;when 7=>tone<=1372; code<=7; high<=0;when 8=>tone<=1410; code<=1; high<=1;when 9=>tone<=1480; code<=2; high<=1;when 10=>tone<=1542; code<=3; high<=1;when 12=>tone<=1622; code<=5; high<=1;when 13=>tone<=1668; code<=6; high<=1;when 15=>tone<=1728; code<=1; high<=2;when others=>null;end case;end process;end behav;4.3 乐曲储存模块4.3.1 模块引脚图4-3 notetabs模块4.3.2 模块功能如图4-3,clk为时钟信号引脚为模块提供时钟信号,clr为计数器清零引脚,当clr为高电平时notetabs 模块中的乐曲播放计数器清零。