《EDA-简易音乐播放器设计(共27页).doc》由会员分享,可在线阅读,更多相关《EDA-简易音乐播放器设计(共27页).doc(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上目 录1 引言EDA课程设计(注:EDA即电子设计自动化,Electronics Design Automation)是继模拟电子技术基础、数字电子技术基础、电子技术基础实验课程后,电气类、自控类和电子类等专业学生在电子技术实验技能方面综合性质的实验训练课程,是电子技术基础的一个部分,其目的和任务是通过一周的时间,让学生掌握EDA的基本方法,熟悉一种EDA软件,并能利用EDA软件设计一个电子技术综合问题,并在实验箱上成功下载,为以后进行工程实际问题的研究打下设计基础。1.通过课程设计使学生能熟练掌握一种EDA软件的使用方法,能熟练进行设计输入、编译、管脚分配、下载等过
2、程。2.通过课程设计使学生能利用EDA软件进行至少一个电子技术综合问题的设计,设计输入可采用图形输入法或AHDL硬件描述语言输入法。3通过课程设计使学生初步具有分析寻找和排除电子电路中常见故障的能力。4通过课程设计使学生能独立写出严谨的、有理论根据的、实事求是的、文理通顺的字迹端正的课程设计报告。2 设计任务及设计要求设计一个简易硬件播放器并能播放多首音乐(最少四首),可通过按键手动控制音乐播放。在播放音乐的同时可实现音谱与音高的显示,并通过16个LED小灯显示不同音调的变化。使用VHDL语言设计音调发生模块,音调编码模块,乐曲存储模块,控制模块,小灯控制模块,数字显示模块,音谱与音高输出模块
3、等各个模块。3 设计原理及总体思路产生音乐的两个因素是音乐频率和音乐的持续时间,以纯硬件完成演奏电路比利用微处理器(CPU)来实现乐曲演奏要复杂的多如果不借助于功能强大的EDA工具和硬件描述语言,凭借传统的数字逻辑技术,即使最简单的演奏电路也难以实现。根据设计要求,乐曲硬件演奏电路系统主要由音频发生模块和乐曲存储模块组成。音频发生模块对FPGA的基准频率进行分频,得到与各个音阶对应的频率输出。乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中可存放一个乐曲曲谱真值表,由一个计数器来控制此真值表的输出,而由计数器的计数时钟信号作为乐曲节拍控制信号。3.1 音名与频率的关系音乐的十二平均率规定:
4、每两个八度音(如简谱中的中音1与高音1)之间的频率相差一倍在两个八度音之间,又可分为十二个半音,每两个半音的频率比为4。另外,音名A(简谱中的低音6)的频率为440Hz,音名B到C之间,E到F之间为半音,其余为全音,由此可以计算出简谱中从低音1到高音1之间每个音名的频率如表3-1所示。表3-1 简谱中的音名与频率的关系音名频率/Hz音名频率/Hz音名频率/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.
5、99中音5783.99高音51567.98低音6440.00中音6880.00高音61760.00低音7493.88中音7987.76高音71975.52由于音阶频率多为非整数,而分频系数又不能为小数,故必须将得到的分频数四舍五入取整。若基准频率过低,则由于分频系数过小,四舍五入取整后的误差较大,若基准频率过高,虽然误码差变小,但分频结构将变大。实际的设计应综合考虑两方面的因素,在尽量减小频率误差的前提下取舍合适的基准频率。本例中选取12MHz的基准频率,若无12MHz的时钟频率,实际上,只要各个音名间的相对品频率关系不变,C作1与D作1演奏出的音乐听起来都不会“走调”。各音阶频率及相应的分频
6、系数如表2所示。为了减少输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,因此在到达扬声器之前,有一个二分频的分频器。表3-2中的分频系数就是从500KHZ频率二分频得到的250KHZ频率基础上计算得出的。表3-2 各音阶频率对应的分频值音名初始值分频系数音名初始值分频系数低音17731274中音11410637低音29121135中音21480567低音310361011中音31542505低音51197850中音51622425低音61290757中音61668379低音71372675高音11728319由于最大的分频系数为1274,故采用13位二进制计数器已能满足分频要求。在表3
7、-2,除给出了分频比以外,给出了对应于各个音阶频率时计数器不同的初始值,对于乐曲中的休止符,要将分频系数设为0,即初始值为2047即可,此时扬声器将不会发声。对于不同的分频系数,加载不同的初始值即可。3.2 节拍控制原理该演奏电路演奏的乐曲是“梁祝”等片段,其最小的节拍为1拍。将1拍的时长定为0.25秒,则需要再提供一个4Hz的时钟频率即可产生1拍的时长,演奏的时间控制通过音符的多次重复的方式来完成。对于占用时间较长的节拍,如全音符为4拍(重复4),2/4音符为2拍(重复2),1/4音符为1拍(重复1)。由于乐理规律对于任何一首音乐都是普遍适用的,所以以上原理对于其他三首乐曲同样适用。4 各单
8、元模块的设计4.1 音频发生模块4.1.1 模块引脚图4-1 speaker模块4.1.2 模块功能如图4-1,en为使能引脚,当en引脚接高电平时speaker模块使能可正常工作。clk为时钟信号引脚,为speaker模块提供时钟信号。tone10.0为11位的音调初始值信号并行总线,可快速的为speaker模块输送音调初始值信号,保证乐曲演奏的流畅性。spks为电信号输出引脚,连接蜂鸣器将电信号转化为声信号。该模块中有一个4位的计数器用于将12MHz时钟信号进行十二分频产生1MHz的基准信号。一个11位的递增计数器用于赋音调初始值对基准信号进行频,最后进行二分频产生对称方波。初始值D =
9、计数最大值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;beg
10、individeclk: process(clk) -12分频variable count4 : integer range 0 to 15;beginpreclk11 thenpreclk=1;count4:=0;elsif clkevent and clk=1 then count4:=count4+1;end if;end process;genspks : process(preclk,tone)-preclk=1MHZ;variable count11 : integer range 0 to 16#7ff#; begin if preclkevent and preclk=1 th
11、en -频率控制if count11=16#7ff# then -b111,1111,1111count11:=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 fullspksevent and fullspks=1 thencount2:=not count2;if en=
12、0 then spks=0; -gaileelsif count2=1 thenspks=1;elsespkstone=2047; code=0; hightone=773; code=1; hightone=912; code=2; hightone=1036; code=3; hightone=1197; code=5; hightone=1290; code=6; hightone=1372; code=7; hightone=1410; code=1; hightone=1480; code=2; hightone=1542; code=3; hightone=1622; code=5
13、; hightone=1668; code=6; hightone=1728; code=1; highnull;end case;end process;end behav;4.3 乐曲储存模块4.3.1 模块引脚图4-3 notetabs模块4.3.2 模块功能如图4-3,clk为时钟信号引脚为模块提供时钟信号,clr为计数器清零引脚,当clr为高电平时notetabs 模块中的乐曲播放计数器清零。add1.0为2位的乐曲地址选择并行总线,可通过不同的地址值选择不同的乐曲。cs为片选信号引脚当cs为高电平时模块才能正常工作反之无法工作。index3.0为4位的音符信号输出并行总线,为ton
14、etaba 模块和LED模块提供音符信号。该模块中有一个8位的播放计数器为乐谱的连续查询提供计数,当达到一定计数值后自动清零实现同一首乐曲的重复播放。4.3.3 VHDL程序library ieee;use ieee.std_logic_1164.all;entity notetabs isport( clk,clr: in std_logic; add : in std_logic_vector(1 downto 0); cs: in std_logic; index : out integer range 0 to 15);end notetabs;architecture behav o
15、f notetabs issignal counter : integer range 0 to 255;begincnt8: process(clk,cs)beginif cs=0 then counter=0;elsif add=00 and counter=138 then counter=0; -每一首歌都循环播放elsif add=01 and counter=127 then counter=0;elsif add=10 and counter=183 then counter=0;elsif add=11 and counter=131 then counter=0;elsif
16、clr=1 and clrLAST_VALUE=0 then counter=0;elsif clkevent and clk=1 thencounterindexindexindexindexindexindexindexnull;end case;end if;if add=01 thencase counter iswhen 00=indexindexindexindexindexindexindexnull;end case;end if;if add=10 thencase counter iswhen 00=indexindexindexindexindexindexindexnu
17、ll;end case;end if;if add=11 thencase counter iswhen 00=indexindexindexindexindexindexindexnull;end case;end if;end process;end behav;4.4 控制模块4.4.1 模块引脚图4-4 control模块4.4.2 模块功能如图4-4,switch为控制引脚当其为上升沿时乐曲地址自动加一,当加到最大值时自动清零。en为使能引脚当刚en引脚为高电平时outcs引脚也为高电平,反之为低电平。add1.0为乐曲地址总线当add为00时选择第1首乐曲,为01时选择第2首乐曲,
18、为10时选择第3首乐曲,为11时选择第4首乐曲 。outcs为notetabs 模块片选控制引脚,当outcs引脚为高电平时选中notetabs 模块。4.4.3 VHDL程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity control isport(switch,en: in std_logic; add: out std_logic_vector(1 downto 0); outcs: out std_logic);end control;architecture one of
19、 control issignal add_r:std_logic_vector(1 downto 0);beginadd=add_r;process(switch,en)beginif en=0 then outcs=0;else outcs=1;end if;if rising_edge(switch) then add_r LIGHT LIGHT LIGHT LIGHT LIGHT LIGHT LIGHT LIGHT LIGHT LIGHTLIGHTLIGHTLIGHTLIGHTLIGHTLIGHT=11111;END CASE;END PROCESS;END ONE;4.6 数字显示模
20、块4.6.1 模块引脚图4-6 DELED模块4.6.2 模块功能如图,S3.0 为4位的十六进制数字输入并行总线。A,B,C,D,E,F,G,H各引脚分别连接数码管的对应段选引脚是数码管显示S3.0所输入的十六进制数字。4.6.3 VHDL程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DELED ISPORT( S: IN STD_LOGIC_VECTOR(3 DOWNTO 0); A,B,C,D,E,F,G,H: OUT STD_LOGIC);END DELED;ARCHITECTURE BEHAV OF DELED ISSIGNAL
21、DATA:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL DOUT:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGINDATADOUTDOUTDOUTDOUTDOUTDOUTDOUTDOUTDOUTDOUTDOUTDOUTDOUTDOUTDOUTDOUTDOUT=;END CASE;END PROCESS;H=DOUT(7);G=DOUT(6);F=DOUT(5);E=DOUT(4);D=DOUT(3);C=DOUT(2);B=DOUT(1);A=DOUT(0);END BEHAV;4.7 音谱与音高输出模块4.7.1 模块引脚图4-7 SELTIME
22、模块4.7.2 模块功能如图,code3.0为4位的音谱输入总线,输入音谱。high1.0为2位的音高输入总线,输入音高。clk为时钟输入引脚。daout3.0为4位的数据输出总线,输出音高和音谱信号。sel2.0为位选输出总线,输出数码管的位选。4.7.3 VHDL程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity SELTIME isport( code : in std_logic_vector(3 downto 0); high : in std_logic_vector(1
23、 downto 0); clk : in std_logic; daout: out std_logic_vector(3 downto 0); sel : out std_logic_vector(2 downto 0); end SELTIME;architecture behav of SELTIME issignal sec : std_logic_vector(2 downto 0);beginprocess(clk)beginif(clkevent and clk=1) then if(sec=011) then sec=000;else secdaoutdaoutdaoutdao
24、ut(3)=0; daout(2)=0; daout(1)=high(1); daout(0)daout=XXXX;end case;end process;sel=sec;end behav;5 总电路设计5.1 总体原理图总体电路原理图如图5-1。图5-1 总体电路原理图5.2 总体功能介绍该电路可以播放最多四首乐曲,可通过按按键的次数来切换曲目,接通电源后默认为播放第一首乐曲。接通电源后按一次播放第二首乐曲 ,接通电源后按两次播放第三首乐曲 ,接通电源后按三次播放第四首乐曲 ,接通电源后按第四次地址归零播放第一首乐曲。每按按键四次一个循环。可重复播放当前乐曲。在播放乐曲的同时十六位的LE
25、D小灯点亮,其点亮的个数与音调对应。四位数码管的第一位显示乐谱(1,2,3,4,5,6,7),第四位显示音高(0(低音),1(中音),2(高音)),其余位显示0。6 设计调试体会与总结6.1 各模块调试仿真6.1.1 音频编码模块图6-1 tonetaba模块仿真波形图6-1中,当输入音符为2时其输出的音调初始值信号为912,音高为0(低音),对应的音谱为2。当输入音符为9时其输出的分频系数为1480,音高为1(中音),对应的音谱为2。与原理相符合。6.1.2 乐曲储存模块图6-2 notetabs模块仿真波形图6-2中,当clr为高电平时每首乐曲的输出保持不变,当cs为高电平且clr为低电平
26、时模块正常工作,当add1.0为2时输出第三首乐曲的音符。与原理相符合。6.1.3 控制模块图6-3 control模块仿真波形图6-3 中,引脚en与引脚outcs同步变化当en为高电平时outcs同样为高电平,反之亦然。当switch经历一次上升沿时add自动加1,当add大于3时自动归零,按键每按一次add继续自动加一,以此不断循环。与原理相符合。6.1.4 小灯控制模块图6-4 LED模块仿真波形图6-4中,当NUM3.0的输入为音符4时LIGHT15.0的输出的低5位都为高电平,当NUM3.0的输入为音符6时LIGHT15.0的输出的低7位都为高电平,当NUM3.0的输入为音符15时
27、LIGHT15.0的输出的所有位都为高电平,LED小灯全点亮。不同的音符对应由低到高的不同的亮灯个数。与原理相符合。6.1.5 数字显示模块图6-5 DELED模块仿真波形图6-5中,当十六进制4为并行线输入3时,A引脚至H引脚分别输出1(高电平),1(高电平),1(高电平),1(高电平),0(低电平),0(低电平),1(高电平),0(低电平),在共阴极数码管上显示为数字3。当十六进制4为并行总线输入12时,A引脚至H引脚分别输出1(高电平),0(低电平),0(低电平),1(高电平),1(高电平),1(高电平),0(低电平),0(低电平),在共阴极数码管上显示为十六进制数字C。与原理相符合。
28、6.1.6 音谱与音高输出模块图6-6 SELTIME 模块仿真波形图6-6中,当音谱输入为2,音高输入为1(中音)时输出位选sel为0(第一位数码管),daout为2。当音谱输入为3,音高输入为1(中音)时输出的位选sel为3(第四位数码管),daout为1(音高)。与原理相符合。6.2 总体硬件验证6.2.1 管脚锁定各引脚对应的目标芯片引脚如图6-7所示。图6-7 管脚锁定6.2.3 分析顶层文件编译仿真好之后,通过电脑连接到硬件上,下载顶层文件到FPGA里,下载完毕之后通过选择按键选择播放的歌曲,当add=00时,播放“梁祝”;当add=01时,播放“世上只有妈妈好”;当add=10时
29、,播放“隐形的翅膀”;当add=11时,播放“一剪梅”。声音流畅悦耳,达到设计功能要求。6.3 体会总结通过本次课程设计,从实际应用方面深刻体会了VHDL设计的优势,通过强大的EDA工具和硬件描述语言使演奏电路很易实现。并且通过此次设计让我们把课本中的知识系统的联系起来,更加体会到模块式设计的方法所带来的方便和明了化。通过模块式的方法,可以将复杂的总程序分成几个模块各自分工执行,独立工作互不干扰。然后通过原理图将各个模块直接相连,或者用元件例化的方式,用VHDL语言进行描述,达到了统一化管理各个模块的作用。通过查找资料,与同学交流增强了我们自主学习的能力;了解到了声音音谱的发生规律,信号的频率
30、与声音的关系,并且通过对基准频率的分频,来生成不同的声谱。从设计方面得知,在进行设计时,应首先对各方面的资料进行综合,在基本原理的范围内进行模块式的分解和综合,最后达到设计的需求。这次设计使我对quartus的运用更加灵活,熟悉了对该软件从工程建立到程序下载执行各个步骤的操作,对以前学习上的不足得到了补充。并且,通过这次课设,对EDA有了更深刻的理解。应用更加广泛,在学业上有了明显的提高。锻炼了自己的独立思考能力。同学们有问题不能解决时,便提出共同讨论,共同解决。总之,这次设计让我们学到了很多知识,为我们以后的学习奠定了基础。参考文献1 潘松,黄继业.EDA技术实用教程M.北京:科学出版社,2002.2 高歌.电子技术EDA仿真设计M.出版地:中国电力出版社,2007.3 黄任.VHDL入门经典实例经验总结M.北京航天大学出版社,2005.4 王振红,张常年.综合电子设计与实践M.北京:清华大学出版社,2005.5 阎石.数字电子技术基础(第五版)M.出版地:高等教育出版社,2006.6 李国丽,朱维勇,栾铭.EDA与数字系统设计M.机械工业出版社,2004.专心-专注-专业EDA课程设计简单音乐播放器设计学 院:物电学院班 级:通信(2)班年 级:xxx姓 名:xxx学 号:xxx指导老师:xxx完成时间:2015.12.