EDA简易电子琴设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
,、题目分析
1、分析要求,确定总体方框图
本设计基本部分是用VHDL语言设计一个简易的八音符电子琴,在Quartus II 平台下下载到Cyclone系列的EP1C12Q240C芯片中,该电路设计能够实现DO RE Ml、FA等八个音调的电子琴,发挥部分是设计一乐曲自动演奏器,用户自己编制乐曲存入电子琴,电子琴可以完成自动演奏。
电子琴音乐产生原理及硬件设计由于一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了。
根据系统设计要求,系统设计采用自顶向下的设计方法,系统的整体组装设计原理图如图1所示,它由乐曲自动演奏模块AUTO音调发生模块TONE和数控分频模块FENPIN三部分组成。
图1系统的整体组装设计原理图
2、最终完成的技能指标
(1)设计一个简易的八音符电子琴,它可通过按键输入来控制音响。
(2)演奏时可以选择是手动演奏(由键盘输入)还是自动演奏已存入的乐曲
】、选择方案
通过可编程逻辑器件(PLD和VHDL硬件描述引言来实现电子琴的基本部分和发挥部分的设计。对于基本部分,设计的主体是数控分频器,对输入的频率进行分频,得
到各个音阶对应的频率最为输出。当按下不同的键时发出不同的声音。对于发挥部分,则在原设计的基础上,增加一个乐曲存储模块,代替了键盘输入,产生节拍控制(index数据存留时间)和音阶选择信号,即在此模块中可存放一一个乐曲曲谱真值表,由一个计数器来控制此真值表的输出,而由此计数器的计数时钟信号作为乐曲节拍控制信号,从而可以设计出一个纯硬件的乐曲自动演奏电路。
方案一:由单片机来完成设计。可用单片机控制键盘的输入,以及产生相应的频率信号作为输出。目前,单片机的功能已比较强大,集成度日益增高且其设计和控制比较容易。但是由于在传统的单片机设计系统中必须使用许多分立元件组成单片机的外围电路,如锁存器,译码器等都需要单独的电路,因此整个系统显得十分复杂,抗干扰性差,在运行过程中容易死机或进入死循环,可靠性降低,而功耗费用增高。
方案二:利用PLC来完成设计。目前利用PLC的技术已经比较成熟。PLC有其优点,其性能优异,体积小,可靠性和精度都比较好,在电子琴的设计中可
采用PLC来完成硬件的控制,但是用PLC实现编程相对比较复杂,对于电子琴这种小型设计来说成本过高。
方案三:利用可编程逻辑器件PLD来完成该设计。利用PLD可以很好的解决上述的问题。它的成品体积小,适合电子琴这种小型设计。其性能稳定,控制精度高(Xili nx公司的高密度,高速可预测延时,高性能系列芯片),易于管理和屏蔽,抗干扰能力强,可靠性高。
综上,在本设计中选择第三种方案最优。
三、各模块原理及其程序
1、乐曲自动演奏模块
乐曲自动演奏模块(AUTO.VHD的作用是产生8位发声控制输入信号/当进行自动演奏时,由存储在此模块中的8位二进制数作为发声控制输入,从而自动演奏乐曲。
为了实现扩展部分的设计,便需要多加上一个音乐存储模块,该模块的作用是产生8位发声控制输入index,auto为0或1时可以选择自动演奏或者键盘输入,如果auto为0,则而由存储在此模块中的8位二进制数来作为发声控制输入,由此便可自动演奏乐曲。此模块的VHDL语言中包括两个进程,首先是对基准脉冲进行分频得到4Hz 的脉冲,作为第二个进程的时钟信号,它的目的是控制每个音阶之间的停顿时间,此处便是1/4=0.25s,第二个进程是音乐的存储,可根据需要编写不同的乐曲。
这段模块的原理图如图2所示:
CLK
AUTO
INDEX0[7.0]
图2乐曲自动演奏模块原理图
乐曲自动演奏模块可以由VHDL语言来实现,下面是一段主要代码:
BEGIN
IF AUTO ='0' THEN
CASE COUNT0 IS
WHEN 0=>INDEX0<="00000100"; --3 WHEN 1=>INDEX0<="00000100"; --3 WHEN 2=>INDEX0<="00000100"; --3 WHEN 3=>INDEX0<="00000100"; --3 WHEN 4=>INDEX0<="00010000"; --5 WHEN 5=>INDEX0<="00010000"; --5 WHEN 6=>INDEX0<="00010000"; --5 WHEN 7=>INDEX0<="00100000"; --6 WHEN 8=>INDEX0<="10000000"; --8 WHEN 9=>INDEX0<="10000000"; --8 WHEN 10=>INDEX0<="10000000"; --8 WHEN 1仁>INDEX0<="00000100"; --3 WHEN 12=>INDEX0<="00000010"; --2 WHEN 13=>INDEX0<="00000010"; --2 WHEN 14=>INDEX0<="00000001"; --1 WHEN 15=>INDEX0<="00000001"; --1 WHEN 16=>INDEX0<="00010000"; --5 WHEN 17=>INDEX0<="00010000"; --5 WHEN 18=>INDEX0<="00001000"; --4 WHEN 19=>INDEX0<="00001000"; --4 WHEN 20=>INDEX0<="00001000"; --4 WHEN 2仁>INDEX0<="00000100"; --3 WHEN 22=>INDEX0<="00000010"; --2 WHEN 23=>INDEX0<="00000010"; --2 WHEN 24=>INDEX0<="00010000"; --5 WHEN 25=>INDEX0<="00010000"; --5 WHEN 26=>INDEX0<="00001000"; --4 WHEN 27=>INDEX0<="00001000"; --4 WHEN 28=>INDEX0<="00000100"; --3 WHEN 29=>INDEX0<="00000100"; --3 WHEN 30=>INDEX0<="00000010"; --2 WHEN 31=>INDEX0<="00000010"; --2