简易音乐播放器的EDA设计.docx

上传人:b****4 文档编号:3852160 上传时间:2023-05-06 格式:DOCX 页数:33 大小:319.04KB
下载 相关 举报
简易音乐播放器的EDA设计.docx_第1页
第1页 / 共33页
简易音乐播放器的EDA设计.docx_第2页
第2页 / 共33页
简易音乐播放器的EDA设计.docx_第3页
第3页 / 共33页
简易音乐播放器的EDA设计.docx_第4页
第4页 / 共33页
简易音乐播放器的EDA设计.docx_第5页
第5页 / 共33页
简易音乐播放器的EDA设计.docx_第6页
第6页 / 共33页
简易音乐播放器的EDA设计.docx_第7页
第7页 / 共33页
简易音乐播放器的EDA设计.docx_第8页
第8页 / 共33页
简易音乐播放器的EDA设计.docx_第9页
第9页 / 共33页
简易音乐播放器的EDA设计.docx_第10页
第10页 / 共33页
简易音乐播放器的EDA设计.docx_第11页
第11页 / 共33页
简易音乐播放器的EDA设计.docx_第12页
第12页 / 共33页
简易音乐播放器的EDA设计.docx_第13页
第13页 / 共33页
简易音乐播放器的EDA设计.docx_第14页
第14页 / 共33页
简易音乐播放器的EDA设计.docx_第15页
第15页 / 共33页
简易音乐播放器的EDA设计.docx_第16页
第16页 / 共33页
简易音乐播放器的EDA设计.docx_第17页
第17页 / 共33页
简易音乐播放器的EDA设计.docx_第18页
第18页 / 共33页
简易音乐播放器的EDA设计.docx_第19页
第19页 / 共33页
简易音乐播放器的EDA设计.docx_第20页
第20页 / 共33页
亲,该文档总共33页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

简易音乐播放器的EDA设计.docx

《简易音乐播放器的EDA设计.docx》由会员分享,可在线阅读,更多相关《简易音乐播放器的EDA设计.docx(33页珍藏版)》请在冰点文库上搜索。

简易音乐播放器的EDA设计.docx

简易音乐播放器的EDA设计

1引言

电子设计自动化EDA(ElectronicDesignAutomation)是指利用计算机完成电子的设计。

EDA技术是以计算机和微电子技术为先导,汇集了计算机图形学、拓扑、逻辑学、微电子工艺与结构学和计算机数学等等多种计算机应用学科最新成果的先进技术。

EDA工具的发展经历了两个阶段:

物理工具和逻辑工具。

现在EDA和系统设计工具正逐渐被理解成一个整体的概念:

电子系统设计自动化。

物理工具用来完成设计中的实际物理问题,如芯片布局、印制电路板布线等;逻辑工具是基于网表、布尔逻辑、传输时序等概念,首先由原理图编辑器或硬件描述语言进行设计输入,然后利用EDA系统完成综合、仿真、优化等过程,最后生成物理工具可以接受的网表或VHDL,Verilog-HDL的结构化描述。

现在常见的EDA工具有编辑器、仿真器、检查分析工具、优化综合工具等。

VHDL是一种用于电路设计的高级语言。

它在80年代的后期出现。

最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言。

VHDL的英文全写是:

VHSI(VeryHighSpeedIntegratedCircuit)HardwareDescriptionLanguage.翻译成中文就是超高速集成电路硬件描述语言。

因此它的应用主要是应用在数字电路的设计中。

目前,它在中国的应用多数是用在FPGA/CPLD/EPLD的设计中。

当然在一些实力较为雄厚的单位,它也被用来设计ASIC。

  VHDL主要用于描述数字系统的结构,行为,功能和接口。

除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。

VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。

在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。

这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。

  与其他硬件描述语言相比,VHDL具有以下特点:

  

(1)功能强大、设计灵活。

VHDL具有功能强大的语言结构,可以用简洁明确的源代码来描述复杂的逻辑控制。

它具有多层次的设计描述功能,层层细化,最后可直接生成电路级描述。

VHDL支持同步电路、异步电路和随机电路的设计,这是其他硬件描述语言虽不能比拟的。

VHDL还支持各种设计方法,既支持自底向上的设计,又支持自顶向下的设计;既支持模块化设计,又支持层次化设计。

  

(2)支持广泛、易于修改。

由于VHDL已经成为IEEE标准所规范的硬件描述语言,目前大多数EDA工具几乎都支持VHDL,这为VHDL的进一步推广和广泛应用奠定了基础。

在硬件电路设计过程中,主要的设计文件是用VHDL编写的源代码,因为VHDL易读和结构化,所以易于修改设计。

  (3)强大的系统硬件描述能力。

VHDL具有多层次的设计描述功能,既可以描述系统级电路,又可以描述门级电路。

而描述既可以采用行为描述、寄存器传输描述或结构描述,也可以采用三者混合的混合级描述。

另外,VHDL支持惯性延迟和传输延迟,还可以准确地建立硬件电路模型。

VHDL支持预定义的和自定义的数据类型,给硬件描述带来较大的自由度,使设计人员能够方便地创建高层次的系统模型。

 (4)独立于器件的设计、与工艺无关。

设计人员用VHDL进行设计时,不需要首先考虑选择完成设计的器件,就可以集中精力进行设计的优化。

当设计描述完成后,可以用多种不同的器件结构来实现其功能。

(5)很强的移植能力,易于共享和复用。

 VHDL采用基于库(Library)的设计方法,可以建立各种可再次利用的模块。

这些模块可以预先设计或使用以前设计中的存档模块,将这些模块存放到库中,就可以在以后的设计中进行复用,可以使设计成果在设计人员之间进行交流和共享,减少硬件电路设计。

目前有多种EDA工具支持采用VHDL进行电路综合、仿真以及实现。

一些可编程器件生产商将使用VHDL进行电路设计所需的多种EDA工具集成为统一的开发平台提供给用户,进行针对本公司可编程器件产品的开发,从而使整个设计流程更加简捷和易于使用。

目前比较常见的是Altera公司的QuartusII和Xilinx公司的ISE开发平台。

本次课程设计是利用EDA设计一个简单的乐曲演奏器,可通过按键输入来控制音响声音,演奏时可以通过按键选择是手动演奏还是自动演奏,手动演奏是通过按键进行简易乐曲的演奏,自动演奏则是演奏已存入的固定乐曲。

 

2软件介绍

QuartusII是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。

  QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。

对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三放EDA工具。

  此外,QuartusII通过和DSPBuilder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。

  MaxplusII作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。

目前Altera已经停止了对MaxplusII的更新支持,QuartusII与之相比不仅仅是支持器件类型的丰富和图形界面的改变。

Altera在QuartusII中包含了许多诸如SignalTapII、ChipEditor和RTLViewer的设计辅助工具,集成了SOPC和HardCopy设计流程,并且继承了MaxplusII友好的图形界面及简便的使用方法。

  AlteraQuartusII作为一种可编程逻辑的设计环境,由于其强大的设计能力和直观易用的接口,越来越受到数字系统设计者的欢迎。

Altera的QuartusII可编程逻辑软件属于第四代PLD开发平台。

该平台支持一个工作组环境下的设计要求,其中包括支持基于Internet的协作设计。

Quartus平台与Cadence、ExemplarLogic、MentorGraphics、Synopsys和Synplicity等EDA供应商的开发工具相兼容。

改进了软件的LogicLock模块设计功能,增添了FastFit编译选项,推进了网络编辑性能,而且提升了调试能力。

3设计流程

3.1原理描述

3.1.1音名与频率的关系

根据声乐知识,产生音乐的两个因素是音乐频率的持续时间,音乐的十二平均率规定,每两个八音度之间的频率相差一倍,在两个八音度之间,又可分为12个半音。

每两个半音的频率比为4。

另外,音名A(乐谱中的低音6)的频率为440HZ,音名B到C之间,E到F之间为半音,其余为全音。

由此可以计算出乐谱中从低音1到高音1之间每个音名的频率如图3-1-1所示:

图3-1-1简谱中的音名与频率的关系

音名

频率(Hz)

音名

频率(Hz)

音名

频率(Hz)

低音1

261

中音1

523

高音1

1046

低音2

293

中音2

578

高音2

1175

低音3

329

中音3

659

高音3

1318

低音4

349

中音4

698

高音4

1397

低音5

391

中音5

784

高音5

1568

低音6

440

中音6

880

高音6

1760

低音7

439

中音7

988

高音7

1976

3.1.2可变分频器

(1)基准频率的选取

各音名所对应的频率可由一频率较高的基准频率进行整数分频得到,所以实际产生各音名频率为近似的整数值。

这是由于音阶频率多为非整数,而分频系数又不能为小数,故必须将得到的分频系数四舍五入取整,若基准频率过低,则由于分频系数过小,四舍五入取整后的误差较大,若基准频率过高,虽然误码差较小,但分频结构将变大,实际的设计应综合考虑两方面的因素,在尽量减小频率差的前提下取舍合适的基准频率。

本次设计选择12MHz作为基准频率。

(2)分频系数A、公用二进制的计数容量N及初始值的选取D

1、分频系数的选取

首先将12MHz的基准频率进行12分频,得到1MHz的基准频率,分频系数A=1MHz/音名频率,此分频系数可由计数器实现。

但若不加处理语句,其分频后的信号将不是对称方波。

而占空比很小的方波很难使扬声器有效地发出声响。

为得到对称方波,可将分频系数A分解为:

分频系数A=分频系数n×2。

即先进行分频系数n的分频,得到不对称方波,然后再2分频得到对称方波。

2、公用二进制的计数容量N的选取

n分频可由n进制计数器实现。

n进制计数器可用复位法或置位法实现,由于加载初始值d的置位法可有效地减少设计所占用的可编程逻辑器件资源,因此,此次设计采用置位法。

低音1的分频数n为最大,其值为1275,应取公用二进制计数器的计数容量N大与“最大分频系数n”,故本次设计的公用二进制计数器应该设计为十一位二进制加法计数器,其计数最大容量为2048,计数的最大值N为2047,可满足本次设计中所有音名对音频系数的要求。

3、初始值的选取D

初始值D=计数最大值N-分频系数n

此次设计中应用的各音名对应的分频系数值及初始值部分如表所示:

图3-1-2各音名对应的分频系数值及初始值

音符

初始值

对应音谱

区别高中音

0

2047

0

0

1

1091

1

0

2

1196

2

0

3

1289

3

0

4

1331

4

0

5

1409

5

0

6

1479

6

0

7

1541

7

0

8

1569

1

1

9

1621

2

1

10

1668

3

1

12

1728

5

1

(3)《世上只有妈妈好》的音符谱为:

6;5;3;5;1;6;5;6;3;5;6;5;5;3;2;1;6;5;3;2;2;3;5;5;6;3;2;1;5;3;

3.1.3节拍发生器原理

该演奏电路的最小节拍为1拍,将一拍的时长定为0.25s,则需要将12MHz进行分频,从而得到一个4Hz的时钟频率即可产生一拍的时长。

为了能达到演奏时能循环进行,则需设置一个时长计数器,当乐曲演奏完时,保证能自动从头开始演奏。

3.2乐曲演奏电路各模块设计

本次设计乐曲演奏电路结构方框图如图3-2-1所示:

 

图3-2-1乐曲演奏电路结构方框图

3.3乐曲演奏电路的子结构

顶层结构所包含的模块分别有分频器(fenpin),音调发生器(ydfsq)模块、音调编码器(ydbmq)模块、手动\自动选择(zdsd)模块及数控分频器skfpq)模块。

3.3.1音调发生器模块

1、音调发生器模块

在此模块中设置了一个8位二进制计数器(计数最大值为89),这个计数器的计数频率为4Hz,即每一计数值的停留时间为0.25s,恰好为当全音符设为1s时,四四拍的4分音符的持续时间。

例如,ydfsq在以下的VHDL逻辑描述中,“世上只有妈妈好”的第一个音符为“6”,此音在逻辑中停留了4个时钟节拍,即为1s时间,相应地所对应“6”音符分频预置数为1479在skfpq的输入端停留了1s。

随着计数器按4Hz的时钟频率做加法计数时,乐谱逐次被选取,“世上只有妈妈好”乐曲就开始自然连续而且循环地演奏起来。

音调发生器模块VHDL源程序如下:

libraryieee;

useieee.std_logic_1164.all;

entityydfsqis

port(clk:

instd_logic;

toneindex:

outintegerrange0to15);

end;

architecturebhvofydfsqis

signalcounter:

integerrange0to89;

begin

process(counter)

begin

ifcounter=90then

counter<=0;

elsifclk'eventandclk='1'then

counter<=counter+1;

endif;

endprocess;

search:

process(counter)

begin

casecounteris

when0to2=>toneindex<=6;

when3to4=>toneindex<=5;

when5to8=>toneindex<=3;

when9to12=>toneindex<=5;

when13to16=>toneindex<=8;

when17to18=>toneindex<=6;

when19to20=>toneindex<=5;

when21to25=>toneindex<=6;

when26to29=>toneindex<=3;

when30to32=>toneindex<=5;

when33to35=>toneindex<=6;

when36to39=>toneindex<=5;

when40to41=>toneindex<=3;

when42to43=>toneindex<=2;

when44to45=>toneindex<=1;

when46to47=>toneindex<=6;

when48to49=>toneindex<=5;

when50to51=>toneindex<=3;

when52to55=>toneindex<=2;

when56to58=>toneindex<=2;

when59to62=>toneindex<=3;

when63to64=>toneindex<=5;

when65to66=>toneindex<=5;

when67to69=>toneindex<=6;

when70to71=>toneindex<=3;

when72to73=>toneindex<=2;

when74to77=>toneindex<=1;

when78to80=>toneindex<=5;

when81to82=>toneindex<=3;

when83to84=>toneindex<=2;

when85to86=>toneindex<=1;

when87to89=>toneindex<=0;

whenothers=>NULL;

endcase;

endprocess;

end;

2、音调发生器模块的仿真图

图3-3-1音调发生器模块的仿真波形图

通过仿真图可以清楚的看到,时钟clk由0开始计数,每计一次数输出toneindex的值随之发生一定的变化,只不过根据乐谱的不同,输出的变化也不尽相同。

例如在本次设计中,自第4个时钟上升沿来临到第5个时钟上升沿,输出toneindex“5”。

于是根据乐谱的不同就输出不同的音符,作为音调编码器的输入。

然后把输出toneindex输入到音调编码器模块,进行下一步编码工作。

于是,由仿真图可以知道本模块输出的即为演奏音乐的音符谱,说明该程序正确,可以生成逻辑器件。

3、音调发生器模块生成的逻辑器件

图3-3-2音调发生器电路模块生成器件

3.3.2音调编码器电路模块

1、音调编码器模块

该编码模块的作用为将输入的音符数据翻译为音乐产生模块的所需要的分频系数,并且显示音符的数字码型和高音阶,通过对照图3-1-2各音名对应的分频系数值及初始值,根据输入得到初始值,从而得到分频系数以便进行分频,得到所需的频率。

音调编码器模块的VHDL源程序:

libraryieee;

useieee.std_logic_1164.all;

entityydbmqis

port(index:

inintegerrange0to15;

code:

outintegerrange0to15;

code1:

outintegerrange0to15;

tone:

outintegerrange0to2047);

end;

architecturebhvofydbmqis

begin

process(index)

begin

caseindexis

when0=>tone<=2047;code<=0;code1<=0;when1=>tone<=1091;code<=1;code1<=0;

when2=>tone<=1196;code<=2;code1<=0;when3=>tone<=1289;code<=3;code1<=0;

when4=>tone<=1331;code<=4;code1<=0;when5=>tone<=1409;code<=5;code1<=0;

when6=>tone<=1479;code<=6;code1<=0;when7=>tone<=1541;code<=7;code1<=0;

when8=>tone<=1569;code<=1;code1<=1;when9=>tone<=1621;code<=2;code1<=1;

when10=>tone<=1668;code<=3;code1<=1;

when12=>tone<=1728;code<=5;code1<=1;

whenothers=>NULL;

endcase;

endprocess;

end;

2、音调编码器模块的仿真图

图3-3-3音调编码器模块的仿真波形图

在此程序中index为音乐节拍产生模块输出的音符数据,经过翻译后将tone输出到数控分频模块为其提供分频系数的初始值,code为数码管显示的字符数,应用模式5,所以直接输出音符的二进制值,code1为高音阶指示信号,当code1为1是说明输出为高音阶的音符。

通过仿真图可以清楚地看到结果。

3、音调编码器模块生成的逻辑器件

图3-3-4音调编码器模块生成的逻辑器件

3.3.3手动\自动选择模块

1、手动\自动选择模块

根据设计的要求,该简易乐曲演奏器能实现手动或自动演奏乐曲的功能。

于是,可通过一个按键cs来进行自动与手动的选择,当cs按下时,乐曲自动演奏,其他情况下均为手动演奏乐曲,即可以通过按下其他的按键(与cs相连的按键除外)来控制不同的音符。

与此同时,还需要一个复位信号rst来控制该演奏器是否工作,当rst为1时,停止演奏,为0时,可以演奏。

以上提到的手动与自动的选择只能在rst为0时有效。

手动\自动选择模块的VHDL源程序:

libraryieee;

useieee.std_logic_1164.all;

entityzdsdis

port(d1,d2:

inintegerrange0to15;

cs,rst:

instd_logic;

q:

outintegerrange0to15);

end;

architecturebhvofzdsdis

begin

process(cs,rst)

begin

ifrst='1'then

q<=0;

else

casecsis

when'0'=>q<=d1;

when'1'=>q<=d2;

whenothers=>q<=d1;

endcase;

endif;

endprocess;

end;

2、手动\自动选择模块的仿真图

 

图3-3-5手动\自动选择模块的仿真波形图

此仿真图中输入cs代表手动\自动演奏的选择端,输入rst代表整体复位端,输入d1、d2分别代表手动和自动演奏的音符,q为输出端,由此仿真图可清楚的看到当rst=1时,不论选择的是手动还是自动,输出都为零,达到了整体复位的功能;当rst=0且cs=1时,自动演奏乐曲,因为q与d2的值相同;当rst=0且cs=0时,手动演奏乐曲,因为这时的q与d1的值相同,从而也达到了演奏方式选择的功能。

3、手动\自动选择模块生成的逻辑器件

图3-3-6手动\自动选择模块生成的逻辑器件

3.3.4数控分频器模块

1、数控分频器模块的功能

该模块的clk端输入一个具有较高频率(本实验为12MHz)的信号,通过skfpq分频后由spkout输出。

由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲信号,为了便于驱动喇叭,需另加一个D触发器均衡其占空比,也即作二分频处理。

skfpq对clk输入信号的分频比由11位预置数tone[10..0]决定。

spkout的输出频率将决定每一音符的音调,这样分频计数器的预置数tone[10..0]与spkout的输出频率就有了对应关系。

例如在ydbmq模块中取tone[10..0]=1196,作为发音符为“2”音的信号频率。

数控分频器模块的VHDL源程序:

libraryieee;

useieee.std_logic_1164.all;

entityskfpqis

port(clk:

instd_logic;

tone:

inintegerrange0to2047;

spks:

outstd_logic);

end;

architecturebhvofskfpqis

signalpreclk:

std_logic;

signalfullspks:

std_logic;

begin

process(clk)

variablecount:

integerrange0to16;

begin

preclk<='0';

ifcount=12then

preclk<='1';count:

=0;

elsifclk'eventandclk='0'then

count:

=count+1;

endif;

endprocess;

process(preclk,tone)

variablecount1:

integerrange0to2047;

begin

ifpreclk'eventandpreclk='1'then

ifcount1=2047then

count1:

=tone;fullspks<='1';

else

count1:

=count1+1;fullspks<='0';

endif;

endif;

endprocess;

process(fullspks)

variablecount2:

std_logic;

begin

iffullspks'eventandfullspks='1'then

count2:

=notcount2;

ifcount2='1'then

spks<='1';

else

spks<='0';

endif;

endif;

e

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 交通运输

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2