音乐流水灯报告Word文件下载.docx
《音乐流水灯报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《音乐流水灯报告Word文件下载.docx(73页珍藏版)》请在冰豆网上搜索。
前仿真。
所设计的电路必须在布局布线前验证,目的主要是在仿真时,验证电路功能是否有效。
在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课题研究
在本课程设计中使用Altera公司的EP2C35系列的FPGA芯片,利用SOPC-NIOSII-EP2C35开发板上的资源,实现一个音乐流水灯。
本设计的任务要求通过编程实现一段音乐旋律的循环播放,在音乐播放的过程中,流水灯根据旋律闪烁。
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;
entityTKZCis
port(clk:
instd_logic;
--ClockSignal
spk:
bufferstd_logic;
--speakerdriver
led:
outstd_logic_vector(11downto0));
endTKZC;
architecturebehaveofTKZCis
signaltone:
std_logic_vector(10downto0);
signaltone_count:
signaltone_index:
integerrange0to15;
signalclk10_count:
std_logic_vector(17downto0);
signaltime:
integerrange0to270;
signalclk10:
std_logic;
begin
process(clk)--generate10hzclocksignal
if(clk'
eventandclk='
1'
)then
clk10_count<
=clk10_count+1;
if(clk10_count=16#3fff#)then
clk10<
=notclk10;
endif;
endprocess;
process(clk10)
if(clk10'
eventandclk10='
if(time=270)then
time<
=0;
else
=time+1;
casetimeis
when0=>
tone_index<
=6;
when1=>
=7;
when2=>
=8;
when3=>
--
when4=>
when5=>
when6=>
when7=>
when8=>
=10;
when9=>
when10=>
when11=>
when12=>
when13=>
when14=>
when15=>
when16=>
=3;
when17=>
when18=>
when19=>
when20=>
when21=>
=5;
when22=>
when23=>
when24=>
when25=>
when26=>
when27=>
when28=>
when29=>
when30=>
when31=>
when32=>
when33=>
when34=>
=4;
when35=>
when36=>
when37=>
when38=>
when39=>
when40=>
when41=>
when42=>
when43=>
when44=>
when45=>
when46=>
when47=>
=9;
when48=>
when49=>
when50=>
when51=>
when52=>
when53=>
when54=>
when55=>
when56=>
when57=>
when58=>
when59=>
when60=>
when61=>
when62=>
when63=>
----
when64=>
when65=>
when66=>
when67=>
when68=>
when69=>
when70=>
when71=>
when72=>
when73=>
when74=>
when75=>
when76=>
when77=>
when78=>
when79=>
when80=>
when81=>
when82=>
when83=>
when84=>
when85=>
when86=>
when87=>
when88=>
when89=>
when90=>
when91=>
when92=>
when93=>
when94=>
when95=>
when96=>
when97=>
when98=>
when99=>
when100=>
when101=>
when102=>
when103=>
when104=>
when105=>
when106=>
when107=>
when108=>
when109=>
when110=>
when111=>
when112=>
when113=>
when114=>
when115=>
when116=>
when117=>
when118=>
when119=>
when120=>
when121=>
when122=>
when123=>
when124=>
when125=>
when126=>
when127=>
when128=>
when129=>
when130=>
when131=>
when132=>
when133=>
when134=>
when135=>
when136=>
=12;
when137=>
when138=>
when139=>
when140=>
when141=>
to