基于vhdl八音符电子琴电路设计.docx
《基于vhdl八音符电子琴电路设计.docx》由会员分享,可在线阅读,更多相关《基于vhdl八音符电子琴电路设计.docx(24页珍藏版)》请在冰豆网上搜索。
基于vhdl八音符电子琴电路设计
一、设计任务与要求………………………………………1
二、总体框图……………………………………………2
三、选择器件……………………………………………5
四、功能模块……………………………………………6
1.Songer模块………………………………6
1.1NoteTabs模块………………………6
1.2ToneTaba模块………………………11
1.3Speakera模块………………………13
2.div模块……………………………………16
3.七段译码器模块……………………………18
五、总体设计电路图………………………………………21
1.顶层设计的电路原理图……………………21
2.顶层设计的仿真结果………………………23
3.电路的管脚图………………………………23
六、结束语………………………………………………24
七、心得体会……………………………………………25
八音符电子琴电路设计
一、设计任务与要求
在EDA开发平台上利用VHDL语言设计一个八音符电子琴,由键盘输入控制音响或自动演奏。
用户可以将自己编制的乐曲存入电子琴,演奏时可以选择键盘输入乐曲或者自动演奏已存入的乐曲。
二、总体框图
系统设计方案:
方案一:
采用单个的逻辑器件组合实现。
这样虽然比较直观,逻辑器件分工鲜明,思路也比清晰,一目了然。
但是由于元器件种类、个数繁多,而过于复杂的硬件电路也容易引起系统的精度不高、体积过大等不利因素。
例如八个不同的音符是由八个不同的频率来控制发出的,而采用方案一就需要运用不同的分频器来对信号进行不同程度的分频。
所用仪器之多显而易见。
方案二:
采用VHDL语言编程来实现电子琴的各项功能。
系统主要由电子琴发声模块、选择控制模块和储存器模块组成。
和方案一相比较,方案二就显得比较笼统,只是把整个系统分为了若干个模块,而不牵涉到具体的硬件电路。
但是我们必须看到用超高速硬件描述语言VHDL的优势,它不仅具有良好的电路行为描述和系统描述的能力而且通俗易懂。
经过对以上两种方案的分析、比较和总结,我们选用方案二来进行八音符电子琴的设计。
八音符电子琴设计总体框图,如图1:
NOTETABS
TONETABA
译码器
分频器
扬声器
SPEAKERA
图1八音符电子琴设计总体框图
该系统由三个模块:
Songer、Div和SEG7(7段译码器)组成。
1.Songer模块:
此模块包括3个小模块,分别是NoteTabs模块,ToneTab模块和Speakera模块。
此外,还需建立一个名为“music”的LPM_ROM模块与NoteTabs模块连接。
1.NoteTabs模块:
该模块的功能就是定义音符数据ROM“music”随着该模块中的计数器控制时钟频率速率作加法计数时,即地址值递增时,音符数据ROM中的音符数据。
将从ROM中通过ToneIndex[3..0]端口输向ToneTaba模块,演奏《采茶舞曲》。
2.ToneTaba模块:
是乐曲简谱码对应的分频预置数查找表电路,其中设置了乐曲的全部音符所对应的分频置数,每一音符的停留时间由音乐节拍和音调发生器模块NoteTabs的CLK的输入频率决定,这些值由对应于ToneTaba的4位输入值Index[3..0]确定,最多有16种可选值。
输向ToneTaba中Index[3..0]的值ToneIndex[3..0]的输出值与持续的时间由模块NoteTabs决定。
3.Speakera模块:
是一个数控分频器,音符的频率可由此模块获得。
由CLK端输入一具有较高频率的信号,通过Speakera分频后由SPKOUT输出。
由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号。
为了利用驱动扬声器,需加一个D触发器以均衡其占空比,频率将是原来的1/2。
Speakera对CLK输入信号的分频比由预置数Tone决定。
SPKOUT的输出频率将决定每一音符的音调。
2.Div模块:
由于所使用的硬件设备不能满足设计所需要的两个CLK输出的频率,所以使用一个分频器来实现把一个50MHz的晶体振荡频率分成一个12MHz,一个8Hz两个分频率,再把两个频率分别给所需的两个模块。
3.EG7模块:
SEG7模块是一个七段译码器,作用是在硬件上显示音频的高
低,用0到7分别对应空节拍do、ri、mi、fa、suo、la、xi,高音时,
LED灯亮,数码管显示对应数字。
发音原理:
1.乐曲演奏的原理
组成乐曲的每个音符的频率值(音调)及其持续时间(音长)是乐
曲能连续演奏所需的两个基本数据,因此只要控制输出到扬声器的激励
信号的频率的高低和持续时间,就可以使扬声器发出连续的乐曲声。
2.音调的控制:
频率的高低决定了音调的高低。
2.1基准频率f0的选取
所有不同频率的信号都是从同一个基准频率f0分频而得到的。
由于音节频率多为非整数,而分频系数又不能为小数,因此必须将计算所得的分频数四舍五入取整。
若基准频率过高,则分频比太小,取整后误差较大。
若基准频率过高,虽然误差减小,但分频数变大。
综合这两方面因素,在尽量减小频率误差的前提下取合适的基准频率,在此取f0=12MHz。
2.2分频系数,二进制计数器计数的容量N和预置数的选取
分频系数A=f0/音名频率
分频系数n=f0/音名频率/2
N〉=MAX{分频系数n}
由表1可得最大分频系数为1274,因此N=2048为2的11次方。
因此二进制计数器设为11位二进制加法计数器,其计数容量为2048,计数的最大值为2047。
预置数=N-分频系数n
表1为各音阶的频率、对应的分频系数及预置数:
3.音长的控制:
音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定的。
《采茶舞曲》中最短的音符为四分音符,如果全音符的持续时间为1s,则四分音符的持续时间为0.25s,二分音符持续的时间为0.5s等等,只需再提供一个4Hz的时钟频率。
每来一个脉冲计一次数,每一计数值的停留时间为0.25s,即要输入一个全音符时需要计四次数才行,则应在Rom表格中输出相应音符四次,表示一个全音符的持续时间。
三、选择器件
1.装有QuartusII软件的计算机一台。
2.外置扬声器
3.7段数码管
4.LED灯一个
5.芯片:
使用altera公司生产的Cyclone系列芯片,如EP1C12Q240C8芯片。
6.EDA实验箱一个。
7.下载接口是数字芯片的下载接口(JTAG),主要用于FPGA芯片的数据下载。
Cyclone器件的配置器件:
此次设计实验采用ALTERA公司的cyclone系列的FPGA芯片EP1C12,设计和仿真采用ALTERA公司的QUARTUSII软件,EP1C12各项参数参照表2。
Cyclone的配置器件
配置器件
器件数量
EP1C3
EP1C4
EP1C6
EP1C12
EP1C20
EPCS1
1
1
1
N/A
N/A
EPCS4
1
1
1
1
1
EPC2
1
1
1
2
2
EPC4
1
1
1
1
1
EPC8
1
1
1
1
1
EPC16
1
1
1
1
1
表2EP1C12参数表
Cyclone的性能特性:
1、新的可编程体系结构,实现低成本设计。
2、嵌入式存储器资源支持多种存储器应用和数字信号处理(DSP)实现
3、专用外部存储器接口电路,支持与DDRFCRAM和SDRAM器件以及SDRSDRAM存储器的连接。
4、支持串行总线和网络接口以及多种通信协议
片内和片外系统时序管理使用嵌入式PLL
5、支持单端I/O标准和差分I/O技术,LVDS信号数据速率高达640Mbps。
6、处理功耗支持NiosII系列嵌入式处理器
7、采用新的串行配置器件的低成本配置方案
8、QuartusII软件OpenCore评估特性支持免费的IP功能评估
四、功能模块
1)、Songer模块如图3:
图3Songer模块
Songer模块由三个模块组成:
NoteTabs模块,ToneTaba模块
和Speakera模块。
Notetabs模块类似于弹琴人的手指,Tonetaba类似于琴键,
Speakera类似于琴弦或音调发生器。
1.NoteTabs模块:
原理:
在这个模块中设置了一个8位二进制计数器,作为音符数据
ROM的地址发生器。
这个计数器的计数频率选为4HZ,即每一计数
值的停留时间为0.25秒,当全音符设为1秒时,4分音符持续时
间为0.25s,2分音符持续的时间为0.5s等等。
每来一个脉冲计一
次数,每一计数值的停留时间为0.25s,即要输入一个全音符时需
要计数4次才行,则应在Rom表格中输出相应音符四次,表示一个
全音符的持续时间,要输入一个2分音符则需要计数2次,依次类
推。
NoteTabs模块图如图4:
图4NoteTabs模块
程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitynotetabsis
port(clk1:
instd_logic;
toneindex:
outstd_logic_vector(3downto0));
end;
architectureoneofnotetabsis
componentmusic
port(address:
instd_logic_vector(7downto0);
clock:
instd_logic;
q:
outstd_logic_vector(3downto0));
endcomponent;
signalcounter:
std_logic_vector(7downto0);
begin
cnt8:
process(clk1,counter)
begin
ifcounter=336thencounter<="00000000";
elsif(clk1'eventandclk1='1')then
counter<=counter+1;
endif;
endprocess;
u1:
music
portmap(address=>counter,q=>toneindex,clock=>clk1);
end;
NoteTabs模块波形仿真图如图5:
(注:
每来一个时钟clk,输出一个相应的数,每个音符的拍子不一样所记次数也不一样)
图5Notetabs的波形仿真图
《采茶舞曲》简谱如图6
图6《采茶舞曲》简谱
下表7是Rom表格:
(即为此程序中调用的music模块)。
表7Rom表格
ROM模块图如图8:
图8ROM生成的模块图
2.ToneTaba模块:
原理:
ToneTaba是乐曲简谱码对应的分频预置数查表电路。
音符的持续时间需要根据乐曲的速度及每个音符的节拍数来确定,Tonetaba的功能首先是为Speakera提供决定所发音符的分频预置数,而此数在Speakera输入口停留的时间为此音符的节拍值。
模块Tonetaba是乐曲简码对应的分频预置数查表电路,其中设置了《采茶舞曲》乐曲全部音符所对应的分频预置数,共16个,每一音符的停留时间由音乐节拍和音调发生器模块Notetabs的clk的输入频率决定,在此为4Hz。
这16个值得输出由对应于Tonetaba的