EDA-简易音乐播放器设计_第1页
EDA-简易音乐播放器设计_第2页
EDA-简易音乐播放器设计_第3页
EDA-简易音乐播放器设计_第4页
EDA-简易音乐播放器设计_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

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 : s

10、td_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' then count4:=count4+1;end if;end process;genspks : process(preclk,tone)-"preclk=1MHZ"var

11、iable count11 : integer range 0 to 16#7ff#; begin if 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: pro

12、cess(fullspks)-"fullspks=488.2815HZ" 二分频variable count2 : std_logic;beginif fullspks'event and fullspks='1' thencount2:=not count2;if en='0' then spks<='0' -gaileelsif count2='1' thenspks<='1'elsespks<='0' -"spks=244.14075HZ

13、"end if;end if;end process;end behav; 4.2 音频编码模块4.2.1 模块引脚图4-2 tonetaba模块4.2.2 模块功能如图4-2,index3.0为4位的音符输入并行总线,用于为tonetaba 模块输送音符信号。tone10.0为11位的音调初始值信号输出并行总线,为speaker 模块提供音调初始值信号。code3.0为4位的音谱输出并行总线,为SELTIME 模块提供音谱信号。high1.0为2位的音高输出并行总线,为SELTIME 模块提供音高信号。该模块将输入的音符信号转化为音调初始值(tone),对应的音谱 (code)及音

14、高(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 isbeginsea

15、rch: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<=1

16、290; 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

17、; 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 模块中的乐曲播放计数器清零。add1.0为2位的乐曲地址选择并行总线,可通过不同的地址值选择不同的乐曲。cs为片选信号引脚当cs为高电平时模块才

18、能正常工作反之无法工作。index3.0为4位的音符信号输出并行总线,为tonetaba 模块和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 t

19、o 15);end notetabs;architecture behav of 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

20、="10" and counter=183 then counter<=0;elsif add="11" and counter=131 then counter<=0;elsif clr='1' and clr'LAST_VALUE='0' then counter<=0;elsif clk'event and clk='1' thencounter<=counter+1;end if;end process;search : process(counter)beg

21、inif add="00" thencase counter iswhen 00=>index<=3;when 01=>index<=3;when 02=>index<=3;-此处省略when 135=>index<=5;when 136=>index<=0;when 137=>index<=0;when 138=>index<=0;when others=>null;end case;end if;if add="01" thencase counter iswh

22、en 00=>index<=13;when 01=>index<=13;when 02=>index<=13;-此处省略when 124=>index<=5;when 125=>index<=0;when 126=>index<=0;when 127=>index<=0;when others=>null;end case;end if;if add="10" thencase counter iswhen 00=>index<=10;when 01=>index&l

23、t;=10;when 02=>index<=12;-此处省略when 180=>index<=8;when 181=>index<=8;when 182=>index<=8;when 183=>index<=8;when others=>null;end case;end if;if add="11" thencase counter iswhen 00=>index<=6;when 01=>index<=6;when 02=>index<=6;-此处省略when 128=

24、>index<=6;when 129=>index<=0;when 130=>index<=0;when 131=>index<=0;when others=>null;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

25、首乐曲,为01时选择第2首乐曲,为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;arc

26、hitecture one of 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<=add_r+1;end if;end process;end one;4.5 小灯控制模块4.5.1 模块引脚图4-5 LED模块4.5.2 模块功

27、能如图4-5,NUM3.0为4位的音符信号输入并行总线。LIGHT15.0为16位的LED灯控制并行总线,控制LED小灯的亮灭及其亮灭个数。能依次点亮并保持不同数目的LED小灯且不同的音符对应由低到高的不同的亮灯个数。4.5.3 VHDL程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY LED ISPORT(NUM: IN INTEGER RANGE 0 to 15; LIGHT: OUT STD_LOGIC_VECTOR(15 DOWNTO 0);END LED;ARCHITEC

28、TURE ONE OF LED ISBEGINPROCESS(NUM)BEGINCASE NUM ISWHEN 0=> LIGHT<="00001"WHEN 1=> LIGHT<="00011"WHEN 2=> LIGHT<="00111"WHEN 3=> LIGHT<="01111"WHEN 4=> LIGHT<="11111"WHEN 5=> LIGHT<="11111"WHEN 6=> LIG

29、HT<="11111"WHEN 7=> LIGHT<="11111"WHEN 8=> LIGHT<="11111"WHEN 9=> LIGHT<="11111"WHEN 10=>LIGHT<="11111"WHEN 11=>LIGHT<="11111"WHEN 12=>LIGHT<="11111"WHEN 13=>LIGHT<="11111"WHE

30、N 14=>LIGHT<="11111"WHEN 15=>LIGHT<="11111"END CASE;END PROCESS;END ONE;4.6 数字显示模块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:

31、 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 DATA:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL DOUT:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGINDATA<=S;PROCESS(DATA)BEGINCASE DATA ISWHEN "0000"=>DOUT<=""WHEN "0001&quo

32、t;=>DOUT<=""WHEN "0010"=>DOUT<=""WHEN "0011"=>DOUT<=""WHEN "0100"=>DOUT<=""WHEN "0101"=>DOUT<=""WHEN "0110"=>DOUT<=""WHEN "0111"=>DOUT<=&q

33、uot;"WHEN "1000"=>DOUT<=""WHEN "1001"=>DOUT<=""WHEN "1010"=>DOUT<=""WHEN "1011"=>DOUT<=""WHEN "1100"=>DOUT<=""WHEN "1101"=>DOUT<=""WHEN &qu

34、ot;1110"=>DOUT<=""WHEN "1111"=>DOUT<=""WHEN OTHERS=>DOUT<=""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 SELTIM

35、E模块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(

36、1 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(clk'event and clk='1') then if(sec="011") then sec<

37、;="000"else sec<=sec+1;end if;end if;end process;process(sec,code(3 downto 0),high(1 downto 0)begincase sec iswhen "000"=>daout<=code(3 downto 0);when "001"=>daout<="0000"when "010"=>daout<="0000"when "011"=&g

38、t;daout(3)<='0' daout(2)<='0' daout(1)<=high(1); daout(0)<=high(0);when others=>daout<="XXXX"end case;end process;sel<=sec;end behav;5 总电路设计5.1 总体原理图总体电路原理图如图5-1。图5-1 总体电路原理图5.2 总体功能介绍该电路可以播放最多四首乐曲,可通过按按键的次数来切换曲目,接通电源后默认为播放第一首乐曲。接通电源后按一次播放第二首乐曲 ,接通电源后按两

39、次播放第三首乐曲 ,接通电源后按三次播放第四首乐曲 ,接通电源后按第四次地址归零播放第一首乐曲。每按按键四次一个循环。可重复播放当前乐曲。在播放乐曲的同时十六位的LED小灯点亮,其点亮的个数与音调对应。四位数码管的第一位显示乐谱(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(中音),对应的音谱

40、为2。与原理相符合。6.1.2 乐曲储存模块图6-2 notetabs模块仿真波形图6-2中,当clr为高电平时每首乐曲的输出保持不变,当cs为高电平且clr为低电平时模块正常工作,当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时LIGHT15.0的输出的所有位都为高电平,LED小灯全点亮。不同的音符对应由低到高的不同的亮灯个数。与原理相符合。6.1.5 数字显示模块图6-5 DELED模块仿真波形图6-5中,当十六进制4为并行线输入3时,A引脚至H引脚分别输出1(高电平),1(高电平),1(高电平),1(高电平),0(低电平),0(低电平)

温馨提示

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

评论

0/150

提交评论