用EDA设计音乐播放器
时间:2025-03-07
时间:2025-03-07
乐曲播放器的VHDL设计
1.设计背景
随着电子技术的飞速发展,微电子技术的进步主要表现在大规模集成电路加工技术即半导体工艺技术的发展上,使得表征半导体的工艺水平的线宽已经达到60nm,并在不断地缩小,表现在硅片单位面积上,集成了更多的晶体管。集成电路设计正在不断地向超大规模、极低功耗和超高速的方向发展,电子产品的功能越来越强大,体积越来越小,功耗越来越低。
传统电子电路的设计,首先要对系统进行分析,然后按功能对系统进行划分,接下来就要选择特定芯片,焊接成PCB电路板,最后对成品PCB电路板进行调试。这样的设计没有灵活性可言,搭成的系统需要的芯片种类多且数目大,而且对于电路图的设计和电路板的设计都需要很大的工作量,工作难度也很高。可编程逻辑器件和EDA 技术的使用使设计方法发生了质的变化。把以前“电路设计+硬件搭试+调试焊接”转化为“功能设计+软件模拟+仿真下载”。利用EDA 开发平台,采用可编程逻辑器件CPLD/FPGA 使硬件的功能可通过编程来实现,这种新的基于芯片的设计方法能够使设计者有更多机会充分发挥创造性思维,实现多种复杂数字逻辑系统的功能,将原来由电路板设计完成的工作放到芯片的设计中进行,减少了连线和体积,提高了集成度,降低了干扰,大大减轻了电路设计和PCB设计的工作量和难度,增强了设计的灵活性,有效地提高了工作效率,增加了系统的可靠性和稳定性,提高了技术指标。
这些技术使得各种电子产品迅速的进入了我们的生活,我们处在一个被电子产品深度包围的时代,在一个普通老百姓的家里,衣食住行,每一个产品的诞生都离不开EDA技术,从彩色电视机,到智能冰箱,到全自动洗衣机,电饭煲,到微波炉,电磁炉,电子琴,再到个人随身用的手机,MP3音乐播放器都需要EDA技术提供支持。
本次设计在EDA开发工具Quartus II 9.1平台上,应用语言层次化和模块化的设计方法,通过音符编码的设计思想,预先定制乐曲,在此基础上设计了一个乐曲硬件演奏电路,经过对整体进行模块化分析、编程、综合、仿真及最终下载,完整实现简易音乐器的播放功能。
2.设计方案
2.1音符准备知识
用以记录不同长短的音的进行的符号叫做音符。音符包括三个组成部分,即符头、符干和符尾。以节拍来划分音符的种类,如全音符为四拍;二分音符为二拍等。
在本次设计中采用了铃声《祝你生日快乐》作为要播放的乐曲,它的旋律下图所示
图2-1 《祝你生日快乐》歌曲简谱
为了便于理解,首先介绍一下硬件电路的发声原理。我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。而乐曲中的每一音符对应着一个确定的频率,因此,要想FPGA发出不用音符的音调,实际上只要控制它输出相应音符的频率即可。乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在扬声器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让扬声器能够发声是不够的,还必须准确地控制乐曲的节奏,即每个音符的持续时间。由此可见,乐曲中每个音符的发音频率及其持续的时间是乐曲能够连续演奏的两个基本要素,获取这两个要素所对应的数值以及通过纯硬件的手段来利用这些数值实现所希望乐曲的演奏效果是本实验的关键。
表2-1为简谱中音名与频率的对应关系。
表2-1 简谱音名与频率的关系
表2-2为频率点及音符与音谱对应定义。
表2-2音符语音谱定义
2.2系统总体设计方案
乐曲演奏电路主要包括音调发生器(ydfsq)模块、手动\自动选择(bmux)模块、音调编码器(ydbmq)模块及数控分频器(skfpq)模块。通过这几个模块的协调工作就可以完成相应的音乐播放功能。顶层框图如图2-2所示。
图2-2 乐曲演奏电路的结构示意
顶层乐曲演奏电路如下图2-3所示。
图 2-3 乐曲演奏电路原理图
2.3硬件电路设计
2.3.1音调发生器模块
在此模块中设置了一个8位二进制计数器(计数最大值为107),这个计数器的计数频率选为4Hz,即每一计数值的停留时间为0.25s,恰好为当全音符设为1s时,四四拍的4分音符的持续时间。例如,ydfsq在以下的VHDL逻辑描述中,《祝你生日快乐》乐曲的第一个音符为“5”,此音在逻辑中停留了4个时钟节拍,即为1s时间,相应地所对应“1”音符分频预置数为1409在skfpq的输入端停留了1s。随着ydfsq中的计数器按4Hz的时钟频率做加法计数时,乐谱逐次被选取,《祝你生日快乐》乐曲就开始自然连续而且循环的演奏起来了。
a.音调发生器模块的VHDL实现 library ieee;
use ieee.std_logic_1164.all; entity ydfsq is port(clk:in std_logic;
clkj:in std_logic_vector(1 downto 0);
rst:in std_logic;--工作时钟/输入信号/复位信号 toneindex:out integer range 0 to 14);--检测结果输出 end ydfsq;
architecture bhv of ydfsq is
signal counter:integer range 0 to 107;--定义8位二进制计数器的计数范围 signal clker:std_logic; signal count4:integer; begin process(clk) begin
if clk'event and clk='1' then if clkj="10" then count4<=c …… 此处隐藏:7410字,全部文档内容请下载后查看。喜欢就下载吧 ……
上一篇:鲁教版初中化学前四单元测试题