基于FPGA的乐曲演奏电路设计.docx

上传人:b****6 文档编号:12893939 上传时间:2023-06-09 格式:DOCX 页数:23 大小:186.80KB
下载 相关 举报
基于FPGA的乐曲演奏电路设计.docx_第1页
第1页 / 共23页
基于FPGA的乐曲演奏电路设计.docx_第2页
第2页 / 共23页
基于FPGA的乐曲演奏电路设计.docx_第3页
第3页 / 共23页
基于FPGA的乐曲演奏电路设计.docx_第4页
第4页 / 共23页
基于FPGA的乐曲演奏电路设计.docx_第5页
第5页 / 共23页
基于FPGA的乐曲演奏电路设计.docx_第6页
第6页 / 共23页
基于FPGA的乐曲演奏电路设计.docx_第7页
第7页 / 共23页
基于FPGA的乐曲演奏电路设计.docx_第8页
第8页 / 共23页
基于FPGA的乐曲演奏电路设计.docx_第9页
第9页 / 共23页
基于FPGA的乐曲演奏电路设计.docx_第10页
第10页 / 共23页
基于FPGA的乐曲演奏电路设计.docx_第11页
第11页 / 共23页
基于FPGA的乐曲演奏电路设计.docx_第12页
第12页 / 共23页
基于FPGA的乐曲演奏电路设计.docx_第13页
第13页 / 共23页
基于FPGA的乐曲演奏电路设计.docx_第14页
第14页 / 共23页
基于FPGA的乐曲演奏电路设计.docx_第15页
第15页 / 共23页
基于FPGA的乐曲演奏电路设计.docx_第16页
第16页 / 共23页
基于FPGA的乐曲演奏电路设计.docx_第17页
第17页 / 共23页
基于FPGA的乐曲演奏电路设计.docx_第18页
第18页 / 共23页
基于FPGA的乐曲演奏电路设计.docx_第19页
第19页 / 共23页
基于FPGA的乐曲演奏电路设计.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于FPGA的乐曲演奏电路设计.docx

《基于FPGA的乐曲演奏电路设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的乐曲演奏电路设计.docx(23页珍藏版)》请在冰点文库上搜索。

基于FPGA的乐曲演奏电路设计.docx

基于FPGA的乐曲演奏电路设计

 

1、EDA技术发展及介绍

1.1EDA技术的介绍

EDA是电子设计自动化(ElectronicDesignAutomation)缩写,是90年代初从CAD(计算机辅助设计)、CAM(计算机辅助制造)、CAT(计算机辅助测试)和CAE(计算机辅助工程)的概念发展而来的。

EDA技术是以计算机为工具,根据硬件描述语言HDL(HardwareDescriptionlanguage)完成的设计文件,自动地完成逻辑编译、化简、分割、综合及优化、布局布线、仿真以及对于特定目标芯片的适配编译和编程下载等工作。

硬件描述语言HDL是相对于一般的计算机软件语言,如:

C、PASCAL而言的。

HDL语言使用与设计硬件电子系统的计算机语言,它能描述电子系统的逻辑功能、电路结构和连接方式。

设计者可利用HDL程序来描述所希望的电路系统,规定器件结构特征和电路的行为方式;然后利用综合器和适配器将此程序编程能控制FPGA和CPLD内部结构,并实现相应逻辑功能的的门级或更底层的结构网表文件或下载文件。

目前,就FPGA/CPLD开发来说,比较常用和流行的HDL主要有ABEL-HDL、AHDL和VHDL。

1.2EDA技术的发展

可将EDA技术分为三个阶段。

(1)七十年代为CAD阶段,人们开始用计算机辅助进行IC版图编辑、PCB布局布线,取代了手工操作,产生了计算机辅助设计的概念。

(2)八十年代为CAE阶段,与CAD相比,除了纯粹的图形绘制功能外,又增加了电路功能设计和结构设计,并且通过电气连接网络表将两者结合在一起,实现了工程设计,这就是计算机辅助工程的概念。

CAE的主要功能是:

原理图输入,逻辑仿真,电路分析,自动布局布线,PCB后分析。

(3)九十年代为ESDA阶段,尽管CAD/CAE技术取得了巨大的成功,但并没有把人从繁重的设计工作中彻底解放出来。

在整个设计过程中,自动化和智能化程度还不高,各种EDA软件界面千差万别,学习使用困难,并且互不兼容,直接影响到设计环节间的衔接。

基于以上不足,人们开始追求:

贯彻整个设计过程的自动化,这就是ESDA即电子系统设计自动化。

1.3EDA技术的发展趋势

目前的EDA产业正处在一场大变革的前夕,对更低成本、更低功耗的无止境追求和越来越短的产品上市压力正迫使IC供应商提供采用0.13μm或以下的千万门级的系统芯片,而这些系统芯片的高复杂性设计更加依赖于EDA供应商提供全新的设计工具和方法以实现模拟前后端、混合信号和数字电路的完全整合。

然而,这些新的需求为当代EDA工具和设计方法带来了不少新的挑战与机会。

例如,如何在工艺上防止模拟电路与数字电路之间的干扰;现有的大部份EDA工具最多只能处理百万门级设计规模,随着IC设计向千万门级以上规模发展,现有EDA工具和方法必须进行升级。

如何融合各EDA供应商的工具,以便向IC设计界提供更高效能和更方便的RTL-to-GDSII或Conc-ept-to-GDSII整合设计环境;为保证深亚微米(0.13μm或以下)和更低内核工作电压(1.8V或以下)时代的信号完整性和设计时序收敛,必须采用新的设计方法。

半导体工艺的每一次跃升都促使EDA工具改变自己,以适应工艺的发展;反过来EDA工具的进步又推动设计技术的发展。

可以说EDA工具是IC设计产业的背后推手。

系统芯片(SOC)正在迅速地进入主流产品的行列。

由此引发的“芯片就等于整机”的现象,将对整个电子产业形成重大的冲击。

种种迹象表明,整个电子产业正在酝酿着一场深刻的产业重组,这将为许多新兴的企业提供进入这一行业的最佳。

1.4乐曲演奏简介

乐曲演奏广泛用于自动答录装置、手机铃声、集团电话及智能仪器仪表设备。

实现方法有许多种,在众多的实现方法中,以纯硬件完成乐曲演奏,随着FPGA集成度的提高,价格下降,EDA设计工具更新换代,功能日益普及与流行,使这种方案的应用越来越多。

PFGA预装了很多已构造好的参数化库单元LPM器件,通过引入支持LPM的EDA软件工具,设计者可以设计出结构独立而且硅片的使用效率非常高的产品。

2、总体方案设计

2.1设计内容

用FPGA器件驱动蜂鸣器演奏“友谊地久天长”片段。

一首乐曲包含三个要素:

乐曲声音频率,发音时间的长短,停顿的时间。

按照图1乐谱,设计相应电路控制speaker信号的方波频率,某一频率持续时间长短,各频率间间隔大小,就可以推动蜂鸣器演奏乐曲。

图1“友谊地久天长”片段乐谱

注:

N一拍;N两拍;N·四拍;N·八拍;N为音谱。

2.2设计方案比较

方案一:

由单片机AT89S52来实现乐曲演奏电路的设计,外围电源采用+5V电源供电,时钟由12MHz的晶振产生,通过按键的状态来检测乐曲演奏状态,中央处理器由AT89S52单片机来完成,乐曲演奏状态由七段数码管来模拟。

这种方案结构简单,易掌握,各部分电路实现起来都非常容易,在传统的乐曲演奏设计中也应用得较为广泛,技术成熟。

其原理框图如图2-1。

 

 

图2-1基于单片机的乐曲演奏电路框图

方案二:

基于现场可编程逻辑门阵列FPGA,通过EDA技术,采用VerilogHDL硬件描述语言实现乐曲演奏电路设计。

程序设计思想为:

1、用分频电路产生不同频率方波;2、利用计数器实现speaker信号频率选择,某一频率持续时间长短,各频率间间隔大小。

其框图如图2-2。

6MHz扬声器

 

4Hz数码管

 

图2-2乐曲演奏电路原理框图

2.3方案论证

通过方案一二的比较,可以看出方案一的设计使用分立元件电路较为多,因此会增加电路调试难度,且电路的不稳定性也会随之增加,而采用FPGA芯片实现的电路,由于在整体性上较好,在信号的处理和整个系统的控制中,FPGA的方案能大大缩减电路的体积,提高电路的稳定性。

此外其先进的开发工具使整个系统的设计调试周期大大缩短,一般来讲,同样的逻辑,基于FPGA要比基于单片机要快很多,因为它们工作的原理是完全不同的。

单片机是基于指令工作的,同样的激励到达单片机后,单片机首先要判断,然后读取相应的指令,最后作出相应,这每一步都是需要在单片机的时钟驱动下一步步的进行。

而基于FPGA则是把相应的逻辑“暂时”固化为硬件电路了,它对激励作出的响应速度就是电信号从FPGA的一个管脚传播另一个管脚的传播速度,当然这指的是异步逻辑,同时电信号也要在芯片内进行一些栅电容的充放电动作,但这些动作都是非常非常快的。

2.4方案选择

从目前的EDA技术来看,其特点是使用普及、应用广泛、软件功能强大。

在ASIC和PLD器件方面,向超高速、高密度、低功耗、低电压方向发展。

当今社会人们对低故障、高实时、高可靠、高稳定的性能更加青睐,结合本设计的要求及综合以上比较的情况,我们选择了基于FPGA的乐曲演奏电路方案。

3、单元模块设计

本设计由现场可编程门矩阵(FPGA)作为控制芯片,通过VreilogHDL硬件描述语言设计,运用自顶而下的设计思想,按功能逐层分割实现层次化的设计。

总体设计方案为

(1)用分频电路产生不同频率方波;

(2)利用计数器实现speaker信号频率的选择,某一频率持续时间长短,各频率间间隔大小。

下面介绍主要模块的功能及作用。

3.1稳压电源电路

该稳压电路的作用是当电网电压波动、负载和温度变化时,维持输出直流电压稳定。

该电路可为晶振电路以及扬声器提供+3.3V的稳定电压,驱动器件工作。

其原理图如图3-1所示。

图3-1稳压电源电路

3.2有源晶振电路

采用有源晶振作为时钟信号源,它是一个完整的振荡器,其内部除了石英晶体外还有阻容软件和晶体管,有源晶振信号质量好,比较稳定,而且连接方式比较简单。

主要是作为电源滤波,通常使用的为一个电容和电感组成的PI型滤波网络,输出端使用一个小阻值电阻过滤信号。

串电阻可减小反射波,避免反射波叠加引起过冲,减少谐波以及阻抗匹配,减小回波干扰及导致的信号过冲。

由于本设计所用的为20MHZ的晶振,而20MHz以下的晶体晶振基本上都是基频的器件,稳定度好,20MHz以上的大多是谐波的(如3次谐波、5次谐波等等),稳定度差,因此我们使选用频的器件,毕竟倍频用的PLL电路需要的周边配置主要是电容、电阻、电感,其稳定度和价格方面远远好于晶体晶振器件。

其原理图如图3-2所示。

 

图3-2有源晶振电路

3.3蜂鸣器

根据蜂鸣器输入信号频率的不同决定了其发声不同的原理,来设计一个由数控分频器控制BUZZER发声的简单实验。

数控分频器的预置值由乐曲的音调的值来决定,从而间接地控制BUZZER得发声频率。

其原理图如图3-3所示。

图3-3蜂鸣器电路

3.4七段数码显示电路

七段数码管和普通发光二极管的发光原理一样,为了进行直观显示而将普通发光二极管封装在一起,能够进行16进制数字显示;有共阳极和共阴极之分,共阳极就是此实验平台所使用的链接方式,在控制端输入底点平的时候发光,在输入高电平的时候就不发光。

其原理电路图如图3-4所示。

图3-4七段数码显示电路

4、特殊器件的介绍

4.1CPLD器件介绍

CPLD是ComplexProgrammableLogicDevice的缩写,它是有最早的PLD器件发展形成的高密度可编程逻辑器件,它具有编程灵活、集成度高、设计开发周期短、适用范围宽、开发工具先进、设计制造成本低、对设计者的硬件经验要求低、标准产品无需测试、保密性强、价格大众化等特点。

CPLD是一种用户根据各自需要而自行构造逻辑功能的数字集成电路。

其基本设计方法是借助集成开发软件平台,用原理图、硬件描述语言等方法,生成相应的目标文件,通过下载电缆(“在系统”编程)将代码传送到目标芯片中,实现设计的数字系统。

许多公司都开发出了CPLD可编程逻辑器件。

比较典型的就是Altera、Lattice、Xilinx世界三大权威公司的产品。

如Altera公司的MAXII器件,就是其极具代表性的一类CPLD器件,是有史以来功耗最低、成本最低的CPLD。

MAXIICPLD基于突破性的体系结构,在所有CPLD系列中,其单位I/O引脚的功耗和成本都是最低的。

Altera公司的MAX7000A系列器件是高密度、高性能的EPLD,它是基于第二代MAX结构,采用CMOSEPROM工艺制造的。

该系列的器件具有一定得典型性,其他结构都与此结构非常的类似。

它包括逻辑阵列块、宏单元、扩展乘积项、可编程连线阵列和IO控制部分。

由于大多数CPLD是基于乘积项的“与或”结构,故适合设计组合逻辑电路。

4.2FPGA器件介绍

FPGA(Field-ProgrammableGateArray)可以达到比PLD更高的集成度,它是在PAL、GAL、EPLD等可编程器件的基础上进一步发展起来的,具有更复杂的布线结构和逻辑实现。

PLD器件和FPGA的主要区别在于PLD是通过修改具有固定内连电路得逻辑功能来进行编程,而FPGA是通过修改一根或多根分割宏单元的基本功能块的内连线的布线来进行编程。

它一般由可嵌入式阵列块(EAB)、逻辑阵列块(LAB)、快速互联通道(FastTrack)、IO单元(IOE)组成。

AlteraCycloneII采用全铜层、低K值、1.2伏SRAM工艺设计,裸片尺寸被尽可能最小的优化。

采用300毫米晶圆,以TSMC成功的90nm工艺技术为基础,CycloneII器件提供了4,608到68,416个逻辑单元(LE),并具有一整套最佳的功能,包括嵌入式18比特x18比特乘法器、专用外部存储器接口电路、4kbit嵌入式存储器块、锁相环(PLL)和高速差分I/O能力。

CycloneII器件扩展了FPGA在成本敏感性、大批量应用领域的影响力,延续了第一代Cyclone器件系列的成功。

由于FPGA是基于查找表(LUT)结构的器件,且每个LAB由10个LE组成,一个LE由LUT和寄存器组成,适合于时序逻辑电路的设计。

4.3MAX‖EPM240T100C5器件

MAXII器件系列是一种非易失性、即用性可编程逻辑系列,它采用了一种突破性的新型CPLD架构。

这种新型架构的成本是原先MAX器件的一半,功耗是其十分之一,密度是其四倍,性能却是其两倍。

这些超级性能是在提供了所有MAX系列CPLD先进特性的架构的基础上,根据Altera专家们的意见而重新采用基于查找表的架构而得到的。

这种基于查找表的架构在最小的I/O焊盘约束的空间内提供了最多的逻辑容量。

因此,MAXIICPLD是所有CPLD系列产品中成本最低、功耗最小和密度最高的器件。

基于成本优化的0.18微米6层金属Flash工艺,MAXII器件系列具有CPLD所有的优点,例如非易失性、即用性、易用性和快速传输延时性。

以满足通用性,低密度逻辑应用为目标,MAXII器件成为接口桥接、I/O扩展、器件配置和上电顺序等应用最理想的解决方案。

除这些典型的CPLD应用之外,MAXII器件还能满足大量从前在FPGA、ASSP和标准逻辑器件中实现的低密度可编程逻辑需求。

MAXII器件提供的密度范围从240到2210个逻辑单元(LE),最多达272个用户I/O管脚。

 

其引脚图如图4-3所示

图4-1EPM240T100C5

5、最小系统原理

6、软件实现

通过至顶向下(TOP--DOWN)的设计方法,我们对电路的设计要求作了分析,从电路要实现的功能着手,逐层分析电路设计的步骤,再具体到各个模块的设计实现以及各模块实现方案的选择。

从本设计的电路要求,我们分析了需要实现一个输入状态的编码,以及对循环点亮灯的方式的选择,综合这两种状态控制输出信号的状态变化。

软件设计流程图:

 

图6-1软件设计流程图

6.1音调的控制

频率的高低决定了音调的高低。

简谱中从低音1至高音1之间每个音名对应的频率如表6-1所示。

表6-1音高频率对照表

1

2

3

4

5

6

7

低音

262Hz

294Hz

330Hz

349Hz

392Hz

440Hz

494Hz

中音

532Hz

578Hz

659Hz

698Hz

784Hz

880Hz

988Hz

高音

1046Hz

1175Hz

1318Hz

1397Hz

1568Hz

1760Hz

1976Hz

该乐曲各音阶频率及相应的分频比如表6-2所示。

为了减小输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,因此在到达扬声器之前,有一个二分频的分频器。

表6-2中的分频比就是从6MHz频率二分频得到的3MHz频率基础上计算得出来的。

从表6-2可以看出,最大的分频系数为11468,故采用14位二进制计数器分频可满足需求。

对于不同的分频系数,只要加载不同的预置数即可,对于乐曲中的休止符,只要将分频系数设为0,即初始值为16383即可,此时扬声器将不会发声。

采用加载预置数实现分频的方法比采用反馈复零法节省资源,实现起来也容易些。

 

表6-2各音阶频率对应的分频比及预置数

音名

分频比

预置数

音名

分频比

预置数

低音1

11468

4915

中音5

3827

12556

低音2

10215

6168

中音6

3409

12974

低音3

9102

7281

中音7

3037

13346

低音4

8591

7792

高音1

2867

13516

低音5

7653

8730

高音2

2554

13829

低音6

6818

9565

高音3

2274

14109

低音7

6073

10310

高音4

2148

14235

中音1

5736

10647

高音5

1913

14470

中音2

5111

11272

高音6

1705

14678

中音3

4552

11831

高音7

1519

14864

中音4

4289

12094

休止符

0

16383

6.2音长的控制

音符的持续时间根据乐曲的速度及每个音符的节拍数来确定。

本次演奏的片段,最短的音符为四分音符,如果将全音符的持续时间设为1s的话,则只需要再提供一个4Hz的时钟频率即可产生四分音符的时长。

6.3软件设计

设计程序如下

//"友谊天长地久"乐曲演奏电路

//信号定义与说明:

//clk_4Hz:

用于控制音长(节拍)的时钟频率;

//clk_6MHz:

用于产生各种音阶频率的基准频率;

//speaker:

用于激励扬声器的输出信号,本例中为方波信号;

//high,med,low:

分别用于显示高音、中音和低音音符,各驱动一个数码管来显示。

modulesong(clk_6MHz,clk_4Hz,speaker,high,med,low);

inputclk_6MHz,clk_4Hz;

outputspeaker;

output[3:

0]high,med,low;

regspeaker;

reg[3:

0]high,med,low;

reg[7:

0]counter;

reg[13:

0]divider,origin;

wirecarry;

assigncarry=(divider==16383);

always@(posedgeclk_6MHz)

beginif(carry)divider<=origin;

elsedivider<=divider+1;

end

always@(posedgecarry)

beginspeaker<=~speaker;end//2分频产生方波信号

always@(posedgeclk_4Hz)

begincase({high,med,low})//根据不同的音符,分频比预置

'b000000000011:

origin<=7281;

'b000000000101:

origin<=8730;

'b000000000110:

origin<=9565;

'b000000000111:

origin<=10310;

'b000000010000:

origin<=10647;

'b000000100000:

origin<=11272;

'b000000110000:

origin<=11831;

'b000001010000:

origin<=12556;

'b000001100000:

origin<=12974;

'b000100000000:

origin<=13516;

'b000000000000:

origin<=16383;

endcase

end

always@(posedgeclk_4Hz)

begin

if(counter==122)counter<=0;//计时,以实现循环演奏

elsecounter<=counter+1;

case(counter)//记谱

0:

{high,med,low}<='h000;//低音"0",持续2个时钟节拍

1:

{high,med,low}<='h000;

2:

{high,med,low}<='h005;//低音"5",发4个时钟节拍

3:

{high,med,low}<='h005;

4:

{high,med,low}<='h005;

5:

{high,med,low}<='h005;

6:

{high,med,low}<='h010;//中音"1"

7:

{high,med,low}<='h010;

8:

{high,med,low}<='h010;

9:

{high,med,low}<='h010;

10:

{high,med,low}<='h010;

11:

{high,med,low}<='h010;//中音"1"

12:

{high,med,low}<='h010;

13:

{high,med,low}<='h030;//中音"3"

14:

{high,med,low}<='h030;

15:

{high,med,low}<='h020;//中音"2"

16:

{high,med,low}<='h020;//发4个时钟节拍

17:

{high,med,low}<='h020;

18:

{high,med,low}<='h020;

19:

{high,med,low}<='h010;//中音"1"

20:

{high,med,low}<='h020;//中音"2"

21:

{high,med,low}<='h020;

22:

{high,med,low}<='h030;//中音"3"

23:

{high,med,low}<='h030;

24:

{high,med,low}<='h010;//中音"1"

25:

{high,med,low}<='h010;

26:

{high,med,low}<='h010;

27:

{high,med,low}<='h010;

28:

{high,med,low}<='h010;

29:

{high,med,low}<='h030;//中音"3"

30:

{high,med,low}<='h030;

31:

{high,med,low}<='h050;//中音"5"

32:

{high,med,low}<='h050;

33:

{high,med,low}<='h060;//中音"6"

34:

{high,med,low}<='h060;

35:

{high,med,low}<='h060;

36:

{high,med,low}<='h050;//中音"5"

37:

{high,med,low}<='h050;

38:

{high,med,low}<='h050;

39:

{high,med,low}<='h050;

40:

{high,med,low}<='h030;//中音"3"

41:

{high,med,low}<='h030;

42:

{high,med,low}<='h030;

43:

{high,med,low}<='h010;//中音"1"

44:

{high,med,low}<='h010;

45:

{high,med,low}<='h020;//中音"2"

46:

{high,med,low}<='h020;

47:

{high,med,low}<='h020;

48:

{high,med,low}<='h020;

49:

{high,med,low}<='h010;//中音"1"

50:

{high,med,low}<='h020;//中音"2"

51:

{high,med,low}<='h020;

52:

{high,med,low}<='h030;//中音"3"

53:

{high,med,low}<='h030;

54:

{high,med,low}<='h010;//中音"1"

55:

{high,med,low}<='h010

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

当前位置:首页 > IT计算机 > 电脑基础知识

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

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