eda课设音乐流水灯.docx
《eda课设音乐流水灯.docx》由会员分享,可在线阅读,更多相关《eda课设音乐流水灯.docx(55页珍藏版)》请在冰豆网上搜索。
eda课设音乐流水灯
1绪论
1.1EDA简介
EDA是电子设计自动化(ElectronicDesignAutomation)的缩写,在20世纪60年代中期从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。
EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。
利用EDA工具,电子设计师可以从概念、算法、协议等开始设计电子系统,大量工作可以通过计算机完成,并可以将电子产品从电路设计、性能分析到设计出IC版图或PCB版图的整个过程的计算机上自动处理完成。
现在对EDA的概念或范畴用得很宽。
包括在机械、电子、通信、航空航天、化工、矿产、生物等各个领域,都有EDA的应用。
1.2硬件描述语VHDL
硬件描述语言(HDL)是一种用于设计硬件电子系统的计算机语言,它用软件编程的方式来描述电子系统的逻辑功能、电路结构和连接形式,与传统的门级描述方式相比,它更适合大规模系统的设计。
例如一个32位的加法器,利用图形输入软件需要输人500至1000个门,而利用VHDL语言只需要书写一行“A=B+C”即可。
而且VHDL语言可读性强,易于修改和发现错误。
早期的硬件描述语言,如ABEL、HDL、AHDL,由不同的EDA厂商开发,互不兼容,而且不支持多层次设计,层次间翻译工作要由人工完成。
为了克服以上不足,1985年美国国防部正式推出了高速集成电路硬件描述语言VHDL,1987年IEEE采纳VHDL为硬件描述语言标准(IEEE-STD-1076)。
VHDL是一种全方位的硬件描述语言,包括系统行为级。
寄存器传输级和逻辑门多个设计层次,支持结构、数据流和行为三种描述形式的混合描述,因此VHDL几乎覆盖了以往各种硬件俄语言的功能,整个自顶向下或由下向上的电路设计过程都可以用VHDL来完成。
VHDL还具有以下优点:
(1)VHDL的宽范围描述能力使它成为高层进设计的核心,将设计人员的工作重心提高到了系统功能的实现与调试,而花较少的精力于物理实现。
(2)VHDL可以用简洁明确的代码描述来进行复杂控制逻辑设计,灵活且方便,而且也便于设计结果的交流、保存和重用。
(3)VHDL的设计不依赖于特定的器件,方便了工艺的转换。
(4)VHDL是一个标准语言,为众多的EDA厂商支持,因此移植性好。
美国于1981年提出了一种新的、标准化的HDL,称之为VHSIC(VeryHighSpeedIntegratedCircuit)HardwareDescriptionLanguage,简称VHDL。
这是一种用形式化方法来描述数字电路和设计数字逻辑系统的语言。
设计者可以利用这种语言来描述自己的设计思想,然后利用电子设计自动化工具进行仿真,再自动综合到门电路,最后用PLD实现其功能。
FPGA/CPLD电路设计的一般流程:
通常可将设计流程归纳为以下7个步骤。
第1步:
设计输入。
在传统设计中,设计人员是应用传统的原理图输入方法来开始设计的。
自90年代初,Verilog、VHDL、AHDL等硬件描述语言的输入方法得到了广大工程设计人员的认可。
第2步:
前仿真。
所设计的电路必须在布局布线前验证,目的主要是在仿真时,验证电路功能是否有效。
在ASIC设计中,这一步骤称为第一次Sign—off.
第3步:
设计输入编译。
设计输入之后就有一个从高层次系统行为设计向低层次门级逻辑电路的转化翻译过程,即把设计输入的某种或某几种数据格式(网表)转化为底层软件能够识别的某种数据格式(网表),以求达到与其工艺无关。
第4步:
设计输入的优化。
对于上述综合生成的网表,根据布尔方程功能等效的原则,用更小更快的综合结果替代一些复杂的单元,并与指定的库映射生成新的网表,这是硬件描述语言输入方式中减小电路规模的一条必由之路。
第5步:
布局布线。
当初步的仿真被验证后,就开始布局布线。
这一步可相对规划出ASIC和FPGA/CPLD设计。
第6步:
后仿真。
设计人员需要利用在布局线中获得的更精确的RC参数再次验证电路的功能和时序。
在ASIC设计中,这一步骤称为第二次Sign—off。
第7步:
流片。
在布局布线和后仿真完成之后,当需要大批量生产该芯片时,就可以开始ASIC芯片的投产。
1.3软件介绍
QuartusII是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
QuartusII可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。
具有运行速度快,界面统一,功能集中,易学易用等特点。
QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。
对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。
此外,QuartusII通过和DSPBuilder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
MaxplusII作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。
Altera在QuartusII中包含了许多诸如SignalTapII、ChipEditor和RTLViewer的设计辅助工具,集成了SOPC和HardCopy设计流程,并且继承了MaxplusII友好的图形界面及简便的使用方法。
AlteraQuartusII作为一种可编程逻辑的设计环境,由于其强大的设计能力和直观易用的接口,越来越受到数字系统设计者的欢迎。
1.4硬件介绍
Cyclone器件:
Cyclone现场可编程门阵列系列基于1.5V、0.13μm全铜层SRAM工艺,其密度增加至20060个逻辑元件(LE),RAM增加至228KB。
它具有生成时钟的锁相环以及DDRSDR和快速RAM(FCRAM)存储器所需的专用双数据率(DDR)接口等。
Cyclone器件支持多种I/O标准,包括640Mbps的LVDS,以及频率为33MHz和66MHz、数据宽度为32位和64位的PCI。
Cyclone器件可以实现NiosII嵌入式处理器,而且只占用不到600个逻辑单元(LE),因此在含多达20260个LE的最大Cyclone器件中,可以将多个NiosII处理器集成到一个Cyclone器件中。
NiosII系列嵌入式处理器以第一代Nios处理器为基础,提供三种内核来满足嵌入式处理器的应用。
设计者可以从高性能内核(超过200DMIPS)、低成本内核(代于50美分的逻辑资源消耗)和性价比平衡的标准内核中进行选择。
开发人员通过向NiosII处理器指令集中增加定制指令,可以加速软件算法。
定制指令可以在一个时钟周期的时间内完成复杂的处理任务,为系统优化提供了一种高性价比的解决方案。
用户添加的定制指令可以该问存储器和NiosII系统外部的逻辑,提供了高效、灵活的访问数据和逻辑资源的能力。
定制指令允许设计者灵活、轻便地设计高端软件,同时保留了并行硬件操作在可编程逻辑器件(PLD)中的性能优势。
1.5课题研究
通过此实验让我们进一步了解,熟悉和掌握CPLD/FPGA开发软件的使用方法及VHDL的编程方法。
本次EDA课程设计我们所采用的是由武汉凌特电子技术有限公司生产的LTE-SOPC-02FD型OPC实验开发系统。
1.5.1课题研究内容
主要内容:
在本课程设计中使用Altera公司的EP2C35系列的EP2C35F484C7-FPGA芯片,利用SOPC-NIOSII-EP2C35开发板上的资源,实现一个音乐流水灯。
本设计的任务要求通过编程实现一段音乐旋律的循环播放,在音乐播放的过程中,流水灯根据旋律闪烁。
扩展内容:
1利用数码管显示播放时间
2利用16*16点阵显示播放歌曲名称
3利用4×4键盘阵列键盘实现播放歌曲的切换
4利用液晶显示频谱分析
1.5.2课题研究方法
1.5.2.1理论依据
根据设计要求分析系统功能,掌握设计中所需理论(音乐模块的设计,流水灯模块的设计,16*16点阵模块的设计,按键选择模块的设计,音乐播放时间模块的设计),阐述设计原理。
1.5.2.2音乐模块
基本原理:
组成乐曲的每个音符的频率值以及持续时间是乐曲能连续演奏所需的基本数据。
并将简单音乐的相应程序加载到蜂鸣器模块中,使其能够按照音乐的节奏发声。
1.5.2.3流水灯模块
通过对流水灯模块的编程控制,使其实现随着简单音乐的节奏有规律的进行点亮和熄灭。
1.5.2.416*16点阵模块
16*16点阵的行为扫描选通信号、列为数据输入。
显示采用逐行列扫描方式,数据端不断输入数据,行扫描按一定顺序逐行选通,扫描一个周期(16次)产生一帧画面。
使其实现在按键选择播放相应简单音乐时,16*16点阵循环显示播放歌曲的名字。
1.5.2.5按键选择模块
由于4*4矩阵键盘模块、数码管模块与16*16点阵模块的引脚有相同的,所以不能在有数码管模块与16*16点阵模块的功能时同时用4*4矩阵键盘模块控制简单歌曲的切换。
因此,我将采用拨动开关模块控制简单歌曲的切换。
1.5.2.6音乐播放时间模块
当音乐开始播放时,八位七段数码管开始从零开始计时,因此通过八位七段数码管可以知道音乐播放的时间。
2课程设计方案及相应原理
2.1课程设计总体方案
具体总体设计方案见图2.1、图2.2:
图2.1总体方案设计流程图(点阵显示+按键选择+流水灯)
图2.2总体方案设计流程图(时间显示+按键选择+流水灯)
2.2具体设计方法
在本节中,将对各个模块的具体设计方法及仿真现象进行阐述,但最后的课程设计是将好几个模块的设计思路同时同时进行仿真和烧录至开发系统进行验证的。
同时,由于4*4矩阵键盘模块、数码管模块与16*16点阵模块的引脚有相同的,所以不能在有数码管模块与16*16点阵模块的功能时同时用4*4矩阵键盘模块控制简单歌曲的切换。
因此,课程设计内容里面要求的部分拓展内容,将分为两个程序来实现。
2.2.1音乐模块
2.2.1.1基本原理
为了便于理解,首先介绍一下硬件电路的发声原理。
我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。
而乐曲中的每一音符对应着一个确定的频率,因此,要想FPGA发出不用音符的音调,实际上只要控制它输出相应音符的频率即可。
乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在扬声器上连续地发出各个音符的音调。
而要准确地演奏出一首乐曲,仅仅让扬声器能够发声是不够的,还必须准确地控制乐曲的节奏,即每个音符的持续时间。
由此可见,乐曲中每个音符的发音频率及其持续的时间是乐曲能够连续演奏的两个基本要素,获取这两个要素所对应的数值以及通过纯硬件的手段来利用这些数值实现所希望乐曲的演奏效果是本实验的关键。
因此要实现在蜂鸣器上播放出有一定规律节奏的简单歌曲,就需要了解各个音阶的频率,以及怎样将这些频率转换为开发系统以及蜂鸣器能够识别的代码。
具体个音阶的频率见图2.3,以及频率点及音符与音谱对应定义见图2.4:
图2.3各音阶频率表
图2.4频率点及音符与音谱对应表
2.2.1.2程序及相应电路原理图
该模块程序如下所示:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitytbis
port(clk:
instd_logic;--ClockSignal
spk:
bufferstd_logic--speakerdriver
);
endtb;
architecturebehaveoftbis
signaltone:
std_logic_vector(10downto0);
signaltone_count:
std_logic_vector(10downto0);
signaltone_index:
integerrange0to15;
signalclk10_count:
std_logic_vector(17downto0);
signaltime:
integerrange0to150;
signalclk10:
std_logic;
begin
process(clk)--generate10hzclocksignal
begin
if(clk'eventandclk='1')then
clk10_count<=clk10_count+1;
if(clk10_count=16#3fff#)then
clk10<=notclk10;
endif;
endif;
endprocess;
process(clk10)
begin
if(clk10'eventandclk10='1')then
if(time=150)then
time<=0;
else
time<=time+1;
endif;
endif;
endprocess;
process(clk10)
begin
if(clk10'eventandclk10='1')then
casetimeis
when0=>tone_index<=3;
when1=>tone_index<=3;
when2=>tone_index<=3;
when3=>tone_index<=3;--
when4=>tone_index<=5;
when5=>tone_index<=5;
when6=>tone_index<=5;
when7=>tone_index<=6;--
when8=>tone_index<=8;
when9=>tone_index<=8;
when10=>tone_index<=8;
when11=>tone_index<=9;--
when12=>tone_index<=6;
when13=>tone_index<=8;
when14=>tone_index<=5;
when15=>tone_index<=5;--
when16=>tone_index<=12;
when17=>tone_index<=12;
when18=>tone_index<=12;
when19=>tone_index<=15;--
when20=>tone_index<=13;
when21=>tone_index<=12;
when22=>tone_index<=10;
when23=>tone_index<=12;--
when24=>tone_index<=9;
when25=>tone_index<=9;
when26=>tone_index<=9;
when27=>tone_index<=9;--
when28=>tone_index<=9;
when29=>tone_index<=9;
when30=>tone_index<=0;
when31=>tone_index<=0;--
when32=>tone_index<=9;
when33=>tone_index<=9;
when34=>tone_index<=9;
when35=>tone_index<=10;--
when36=>tone_index<=7;
when37=>tone_index<=7;
when38=>tone_index<=6;
when39=>tone_index<=6;--
when40=>tone_index<=5;
when41=>tone_index<=5;
when42=>tone_index<=5;
when43=>tone_index<=6;--
when44=>tone_index<=8;
when45=>tone_index<=8;
when46=>tone_index<=9;
when47=>tone_index<=9;--
when48=>tone_index<=3;
when49=>tone_index<=3;
when50=>tone_index<=8;
when51=>tone_index<=8;--
when52=>tone_index<=6;
when53=>tone_index<=5;
when54=>tone_index<=6;
when55=>tone_index<=8;--
when56=>tone_index<=5;
when57=>tone_index<=5;
when58=>tone_index<=5;
when59=>tone_index<=5;--
when60=>tone_index<=5;
when61=>tone_index<=5;
when62=>tone_index<=0;
when63=>tone_index<=0;----
when64=>tone_index<=10;
when65=>tone_index<=10;
when66=>tone_index<=10;
when67=>tone_index<=12;--
when68=>tone_index<=7;
when69=>tone_index<=7;
when70=>tone_index<=9;
when71=>tone_index<=9;--
when72=>tone_index<=6;
when73=>tone_index<=8;
when74=>tone_index<=5;
when75=>tone_index<=5;--
when76=>tone_index<=5;
when77=>tone_index<=5;
when78=>tone_index<=5;
when79=>tone_index<=5;--
when80=>tone_index<=5;
when81=>tone_index<=0;
when82=>tone_index<=0;
when83=>tone_index<=3;--
when84=>tone_index<=5;
when85=>tone_index<=3;
when86=>tone_index<=5;
when87=>tone_index<=5;--
when88=>tone_index<=6;
when89=>tone_index<=7;
when90=>tone_index<=9;
when91=>tone_index<=6;--
when92=>tone_index<=6;
when93=>tone_index<=6;
when94=>tone_index<=6;
when95=>tone_index<=6;--
when96=>tone_index<=6;
when97=>tone_index<=5;
when98=>tone_index<=6;
when99=>tone_index<=8;--
when100=>tone_index<=8;
when101=>tone_index<=8;
when102=>tone_index<=9;
when103=>tone_index<=12;--
when104=>tone_index<=12;
when105=>tone_index<=12;
when106=>tone_index<=10;
when107=>tone_index<=9;--
when108=>tone_index<=9;
when109=>tone_index<=10;
when110=>tone_index<=9;
when111=>tone_index<=8;--
when112=>tone_index<=8;
when113=>tone_index<=6;
when114=>tone_index<=5;
when115=>tone_index<=3;--
when116=>tone_index<=3;
when117=>tone_index<=3;
when118=>tone_index<=3;
when119=>tone_index<=8;--
when120=>tone_index<=8;
when121=>tone_index<=8;
when122=>tone_index<=8;
when123=>tone_index<=6;--
when124=>tone_index<=8;
when125=>tone_index<=6;
when126=>tone_index<=5;
when127=>tone_index<=3;--
when128=>tone_index<=5;
when129=>tone_index<=6;
when130=>tone_index<=8;
when131=>tone_index<=5;--
when132=>tone_index<=5;
when133=>tone_index<=5;
when134=>tone_index<=5;
when135=>tone_index<=5;--
when136=>tone_index<=5;
when137=>tone_index<=5;
when138=>tone_index<=0;
when139=>tone_index<=0;--
whenothers=>tone_index<=0;
endcase;
endif;
endprocess;
process(tone_index)
be