当前位置:文档之家› VHDL音乐播放器

VHDL音乐播放器

洛阳理工学院课程设计报告课程名称 EDA技术与VHDL设计题目音乐播放器的设计与仿真专业通信工程班级 B1105学号 B1105姓名完成日期 2014年12月22日前言随着科学技术的进步,电子器件和电子系统设计方法日新月异,电子设计自动化(Electronics Design Automation,EDA)技术正是适应了现代电子产品设计的要求,吸收了多学科最新成果而形成的一门新技术。

现如今掌握EDA技术是电子信息类专业的学生、工程技术人员所必备的基本能力和技能。

传统电子电路的设计,首先要对系统进行分析,然后按功能对系统进行划分,接下来就要选择特定芯片,焊接成PCB电路板,最后对成品PCB电路板进行调试。

这样的设计没有灵活性可言,搭成的系统需要的芯片种类多且数目大,而且对于电路图的设计和电路板的设计都需要很大的工作量,工作难度也很高。

随着可编程器件和EDA技术的发展,传统设计的劣势被克服,采用可编程逻辑器件基于芯片的设计方法,期间的内部逻辑和引脚可以由设计者自行决定,提高了设计的灵活性和工作效率;同时,将系统集成在一个芯片上的设计,使系统具有体积小、功耗低、可靠性高等特点。

EDA技术即电子设计自动化技术,它是以可编程逻辑器件(PLD)为载体,以硬件描述语言(HDL)为主要的描述方式,以EDA软件为主要的开发软件的电子设计过程。

它主要采用“自顶向下”的设计方法,设计流程主要包括:设计输入、综合、仿真、适配、下载。

EDA技术主要有以下特征:(1)高层综合的理论和方法取得进展,从而将EDA设计层次由RT级提高到了系统级,并推出了系统级综合优化工具,缩短了复杂ASIC的设计周期。

(2)采用硬件描述语言来描述10万门以上的设计,并形成了VHDL和Verilog-HDL两种标准硬件描述语言。

(3)采用平面规划技术对逻辑综合和物理版图设计联合管理,做到在逻辑设计综合早期阶段就考虑到物理设计信息的影响。

(4)可测性综合设计。

(5)为带有嵌入式IP核的ASIC设计提供软、硬件协同设计工具。

(6)建立并设计工具框架结构的集成化设计环境,以适应当今ASIC规模大而复杂、数字与模拟电路并存、硬件与软件设计并存、产品上市速度快等特点。

总而言之,EDA技术的出现,给电子信息产业带来了革命性的变革。

一.设计任务及要求本次课程设计要求使用EDA工具,设计实现简易音乐播放器,理解音名与频率的关系及数控分频原理,经过对整体进行模块化分析、编程、综合、仿真及最终下载,完整实现简易音乐器的播放功能。

用VHDL语言设计乐音的节拍与音符产生电路;用VHDL语言设计分频系数、音符显示数据产生电路;用VHDL语言设计可控分频器电路;理解简易音乐播放器总体设计方案。

掌握基本的VHDL语言;理解音乐播放电路设计方案。

掌握用VHDL语言设计节拍与音符产生电路;掌握用VHDL语言设计分频系数、音符显示数据产生电路;掌握用VHDL语言设计可控分频器电路。

设计结果:原理图与原程序、电路仿真图、能在实训系统上播放悦耳动听的音乐。

二.设计实现2.1 准备知识在本次设计中采用了《梁祝》《茉莉花》《虫儿飞》作为要播放的乐曲,根据声乐知识,组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需的两个基本要素,获取这两个要素所对应的数值以及通过纯硬件的手段来利用这些数值实现所希望乐曲的演奏效果是本实验的关键。

该演奏电路演奏的乐曲是“梁祝”片段,其最小的节拍为1拍。

将1拍的时长定为0.25秒,则只需要再提供一个4Hz的时钟频率即可产生1拍的时长,演奏的时间控制通过ROM查表的方式来完成。

对于占用时间较长的节拍,如全音符为4拍(重复4),2/4音符为2拍(重复2),1/4音符为1拍(重复1)。

由于音阶频率多为非整数,而分频系数又不能为小数,故必须将得到的分频数四舍五入取整。

若基准频率过低,则由于分频系数过小,四舍五入取整后的误差较大,若基准频率过高,虽然误码差变小,但分频结构将变大。

实际的设计应综合考虑两方面的因素,在尽量减小频率误差的前提下取舍合适的基准频率。

本设计中选取4MHz 的基准频率。

表2-1为简谱中音名与频率的对应关系。

表2.1 乐谱编码和乐音频率2.2乐曲演奏电路的结构示意2.3乐曲演奏电路的子结构顶层结构所包含的模块分别有地址计数器模块(ADDR )、乐音分频器模块分频器乐谱存储器扬声器时钟地址乐音(SPEAKER)、数据存储器(YP)以下便是对各个子模块的分析。

2.3.1 地址计数器模块1. 地址计数器功能在此模块中设置了一个9位二进制计数器(计数最大值为512),这个计数器的计数频率选为4Hz,即每一计数值的停留时间为0.25s,恰好为当全音符设为1s时。

例如,《梁祝》乐曲的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即为1s时间,相应地所对应“1”音符分频预置数为1409在ADDR的输入端停留了1s。

随着ADDR中的计数器按4Hz的时钟频率做加法计数时,乐谱逐次被选取,《梁祝》乐曲就开始自然连续的演奏起来了。

2. 程序代码LIBRARY ieee;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ADDR ISPORT (clk : IN STD_LOGIC;A : BUFFER STD_LOGIC_VECTOR(8 DOWNTO 0));END;ARCHITECTURE ONE OF ADDR ISBEGINPROCESS (clk)BEGINIF (clk'event AND clk = '1')THENA <= A + 1;END IF;END PROCESS;END;3. 地址计数器符号图图2.1 地址计数器符号图4. 仿真波形图图2.2 地址计数器波形图图2.3 地址计数器波形图2.3.2 乐音分频器1. 乐音分频器模块的功能此模块的功能首先是提供决定所发音符的分频预置数,而此数在输入端口停留的时间即为此音符的节拍值。

电路中设置了《梁祝》《茉莉花》《虫儿飞》乐曲全部音符所对应的分频预置数,每一音符的停留时间由音乐节拍和音调发生器模块clk输入频率决定,在此为4Hz。

2.乐音分频器模块的VHDL源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity speaker isport(clk : in std_logic;--1mhzTN : in std_logic_vector(3 downto 0);--乐谱编码spks : out std_logic);end;architecture rts of speaker issignal FM : std_logic;signal count : integer range 0 to 2047;signal temp : integer range 0 to 2048;beginprocess (TN)begincase TN iswhen "0000" => temp<=2048;when "0001" => temp<=1907;when "0010" => temp<=1699;when "0011" => temp<=1514;when "0101" => temp<=1275;when "0110" => temp<=1136;when "0111" => temp<=1011;when "1000" => temp<=955;when "1001" => temp<=851;when "1010" => temp<=758;when "1100" => temp<=637;when "1101" => temp<=567;when "1110" => temp<=505;when "1111" => temp<=477;when others => temp<=2048;end case;end process;process(clk)beginif(clk'event and clk='1') then count<=count+1;if(count=temp) then FM<=not FM;count<=0;end if;end if;end process;spks<=FM;end;3. 乐音分频器符号图图2.4 乐音分频器符号图4. 乐音分频器波形图图2.5 乐音2的波形图图2.6 乐音3的波形图2.3.3 数据存储器从菜单里的Tools选择MegaWizard Plug-In Manager…,按照向导完成ROM的定制,ROM初始化文件见附录。

图2.7数据存储器设计图2.3.3 数据仿真1. 符号图图2.8 存储器和地址计数器符号图2. 波形图图2.9 存储器存入的数据存储器存入了《梁祝》《茉莉花》《虫儿飞》三首音乐,最小编程单元是八分音符即每个数字占0.37秒。

每首歌结束之后空0.37*8*2 = 6秒。

三首歌共424个地址,即0.37*424 = 155秒,即两分半左右。

2.3.4 时钟分频器1.二十分频器程序代码:library ieee;use ieee.std_logic_1164.all;entity fenpin20 isport(clk : in std_logic; --输入20MHZ信号out1 : out std_logic);-- 输出1MHZend;architecture one of fenpin20 issignal T1 : integer range 0 to 10-1;signal F1M : std_logic;beginprocess(clk)beginif(clk'event and clk='1')thenT1<=T1+1;if(T1=9) then F1M<= not F1M;T1<=0;end if;end if;end process;out1<=F1M;end;符号图:图2.10 分频器符号图波形图:图2.11 分频器波形图波形图意义:此分频器是20分频,即把频率分成其本身频率的1/20。

相关主题