EDA课程设计硬件电子琴及自动演奏.docx
- 文档编号:10179424
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:31
- 大小:603.41KB
EDA课程设计硬件电子琴及自动演奏.docx
《EDA课程设计硬件电子琴及自动演奏.docx》由会员分享,可在线阅读,更多相关《EDA课程设计硬件电子琴及自动演奏.docx(31页珍藏版)》请在冰豆网上搜索。
EDA课程设计硬件电子琴及自动演奏
郑州航空工业管理学院
《EDA技术及应用》
课程设计报告
2011届通信工程专业1113071班级
题目:
电子琴与自动演奏
学号:
姓名:
同组人:
指导老师:
张松炜赵成
邸金红马鹏阁
2013年07月07日
1课程设计要求
1.1硬件电子琴设计
设计要求:
(1)按下KEY1~KEY7分别表示中音的DO、RE、ME、FA、SOL、LA、SI.
(2)按住KEY8同时按KEY1~KEY7分别表示高音的DO、RE、ME、FA、SOL、LA、SI;
(3)按下相应的键有对应LED灯指示;
其他要求:
(1)晶振为12MHz.,采用CPLD器件为ALTERA的EPM7064AEL144-7N。
1.2乐曲自动演奏机
设计要求:
(1)可以在电路上能自动演奏乐曲,在这里我们采用的是贝多芬的《欢乐颂》;
(2)有相应的LED灯指示高低音;
其他要求:
(1)晶振为12MHz;
(2)采用CPLD器件,为ALTERA的EPM7064AEL144-7N。
1.3硬件电子琴设计+乐曲自动演奏机
最初我们选择的设计是电子琴,但是由于电子琴的设计较为基础,因此我们对电子琴的设计进行了改进,将其与乐曲自动演奏相结合,要求如下:
设计要求:
(1)按下KEY1—KEY7分别表示中音的DO、RE、ME、FA、SOL、LA、SI;
(2)对于电子琴,按下相应的键有对应LED灯指示;
(3)可以在电路上能自动演奏乐曲,在这里我们采用的是贝多芬的《欢乐颂》,且有相应的LED灯指示高低音;
(4)能实现电子琴和乐曲自动演奏功能的切换。
其他要求:
(1)晶振为12MHz;
(2)采用CPLD器件为ALTERA的EPM7064AEL144-7N。
2整体规划
2.1设计分析
根据设计要求,由于乐曲自动演奏机和硬件电子琴的设计已经存在,我们对已有的设计进行修改,形成两个不同功能的模块,然后采用元件例化,拼接两个模块,同时附加一个选择功能模块,以实现乐曲自动演机和硬件电子琴两个功能。
2.1.1硬件电子琴分析
对于硬件电子琴,参考了实验时使用的程序,已经达到的要求有:
(1)按下key1~key7分别表示中音的DO、RE、ME、FA、SOL、LA、S;
(2)按下相应的键有对应LED灯指示。
2.1.2乐曲自动演奏机分析
对于乐曲自动演奏机,参考了实验时使用的程序,已经达到的要求有:
(1)可以在电路上能自动演奏乐曲,在这里我们采用的是贝多芬的《欢乐颂》
(2)有相应的LED灯指示高低音。
而对于其他要求:
(1)晶振为12MHz.;
(2)采用CPLD器件为ALTERA的EPM7064SL-44。
我们在实验箱验证时,先按照实验箱芯片和晶振进行就修改,在实验箱上确认实验相应功能之后,我们在对应模块的频率数值进行修改,并在对管脚重新锁定即可。
2.1.3整体设计分析
整体设计要求:
用key8实现两个功能切换。
添加一个选择器,以实现两个功能切换。
当key8键没有按下时,电路实现硬件电子琴功能,当key8键按下之后,电路实现乐曲自动演奏机。
由于不存在现成可以借鉴的,于是,课程设计任务重心就放在了选择器模块的编写以及整体电路的合成上。
2.2顶层模块输入输出
图2-1顶层文件图形
管脚说明:
输入:
时钟信号——clk,按键——[6:
0]key,功能切换键——key7
输出:
LED灯——[6:
0]led,蜂鸣器——beep;
Key0:
DOkey1:
REkey2:
MEkey3:
FAkey4:
SOL
key5:
LAkey6:
SIkey7:
功能切换键
2.3设计流程
图2-1设计流程图
2.4设计分工
孙干:
负责修改硬件电子琴以及乐曲自动演奏模块。
周龙杰:
负责编写选择器以及设计顶层文件。
朱真:
负责综合测试电路是否达到要求,并进行修改。
3功能划分与模块化分
3.1自动演奏模块
自动演奏模块功能:
在按下key7键后,实现可以自动播放乐曲的功能。
3.1.1自动演奏设计方案
(1)根据乐曲自动演奏的基本原理设计出适合EDA多功能试验箱的源程序,通过分频模块得到12MHZ的晶振;源程序编写完成,编译调试后,在实验箱上验证其功能;
(2)验证模块是否能完成实践要求的所有功能;然后去掉分频模块,将功能模块做适当的修改,编译调试成功后,将其下载到CPLD实验板上。
3.1.2设计步骤
(1)在QuartusⅡ中建立一个工程项目文件song.qpf,并在该项目下新建VerilogHDL源程序文件song.v输入程序代码并保存。
完整的VerilogHDL程序参考程序清单。
(2)然后在该工程选择目标器件并对相应的引脚进行锁定,在这里所选择器件为Alter公司的EPM7064SL-44芯片。
(3)对该工程文件进行全程编译处理,若在编译中发现错误,则找出错误并更正,直到编译成功。
(4)最后拿出下载电缆,将此电缆的两端分别接到PC机的打印机并口和核心板上的JTAG接口上,打开电源执行下载命令,把程序下载到CPLD器件中。
此时可以得到《欢乐颂》乐曲的演奏以及LED灯的明灭指示其高低音。
3.2硬件电子琴模块
硬件电子琴模块功能:
在按下功能切换键key7后,可以实现电子琴功能,即按下key1到key7的过程中发出相应的高低音。
3.2.1硬件电子琴设计方案
(1)根据硬件电子琴演奏的基本原理设计出适合EDA多功能试验箱的源程序,通过分频模块得到12MHZ的晶振;源程序编写完成,编译调试后,在实验箱上验证其功能;
(2)验证模块是否能完成实践要求的所有功能;然后去掉分频模块,将功能模块做适当的修改后,编译调试成功后,将其下载到CPLD实验板上。
3.2.2设计步骤
(1)在QuartersII中建立一个工程项目文件beep1.qpf。
并在该项目下新建VerilogHDL源程序文件beep1.v,输入程序代码并保存,进行综合编译,若在编译中发现错误,则找出并更正错误,直至编译成功为止。
(2)选择目标器件并进行引脚锁定。
将未使用的管脚设置为三态输入。
(3)对该工程文件进行全程编译处理。
若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。
(4)将产生的beep1.sof输出对FPGA进行配置。
按下按键KEY1~KEY8就可以开始使用电子琴来演奏音乐了。
4课程设计原理
4.1硬件电子琴设计原理
乐曲演奏的原理是:
由于组成乐曲的每个音符的频率值(音调)及其持续时间(音长)是乐曲演奏的2个基本数据,因此需要控制输出到扬声器的激励信号的频率高低和该频率信号持续的时间。
频率的高低决定了音调的高低,而乐曲的简谱与各音名的频率对应关系在后面将给出。
所有不同频率的信号都是从一基准频率分频而得来的,由于音阶频率多为非整数,而分频系数有不能为小数,故必须将计算得到的分频数进行向下取整,基准频率和分频系数应综合考虑加以选择,从而保证音乐不会走调。
如在48MHz时钟下,中音1(对应的频率值是523.3Hz)的分频系数应该为:
48000000/(2*523.3)=45863,这样只需对系统时钟进行45863次分频即可得到所要的中音M1(分频系数计算公式为D=F/2K,由于F/2K之后,会使分频系数D变小,所以功能模块中语句:
beep_r<=!
beep_r,使得输出取反,K=F/2count_end,消除了前面除以2K的影响)。
4.2乐曲自动演奏设计原理
硬件电路和自动演奏的原理同硬件电子琴实验原理类似。
至于其他音符,同样可由一式求出对应的分频系数。
在程序中设置一个状态机,每250ms改变一个状态(即一个节拍),组成乐曲的每个音符的频率值(音调)相对应于状态机的每一个状态。
只要让状态机的状态按顺序转换,就可以自动演奏播放音乐了。
《欢乐颂》乐曲的简谱如图所示:
图4-1《欢乐颂》简谱图
4.3消抖原理
作为机械开关的键盘,在按键操作时,由于机械触点的弹性及电压突跳等原因,在触点闭合或开启的瞬间会出现电压抖动,实际应用中如果不进行处理将会造成误触发。
由于这里是低电平表示按键按下,所以按键去抖动的关键在于提取稳定的低电平状态,虑除前沿、后沿抖动毛刺。
对于一个按键信号,可以用一个脉冲对他进行取样,如果连续三次取样为低电平,可以认为信号已经处于键稳定状态,这时输出一个低电平按键信号。
继续取样的过程中如果不能满足连续三次取样为低,则认为键稳定状态结束,这时输出变为高电平。
5各模块的实现方法
5.1选择器模块实现方法
经过小组讨论和老师的指导,我们确定以下三种方案以实现功能切换。
方案A
添加使能端控制两个模块工作状态。
即当KEY8没有按下时,硬件电子琴模块工作,乐曲自动演奏模块不工作;当KEY8按下时,硬件电子琴不工作,乐曲自动演奏模块工作。
于是,需要给两个模块分别添加使能控制端,以控制其工作状态,而选择器就负责检测KEY8按键的状态,同时给出相应的使能信号输出指示。
方案B
通过控制时钟信号输入与否来控制两个模块工作状态。
即当KEY8没有按下时,给硬件电子琴模块时钟信号,使其工作,将乐曲自动演奏模块的时钟信号屏蔽,使其不工作;当KEY8按下时,将硬件电子琴时钟信号屏蔽,使其不工作,给乐曲自动演奏模块时钟信号,使其工作。
于是,需要让选择器实现时钟信号的选择输出,以分别给两个模块时钟信号。
方案C
方案A、B都是对输入进行控制,换一个思路,我们可以对输出进行控制。
即让两个模块都工作,但是输出的部分添加选择器,有选择输出信号。
当KEY8没有按下时,硬件电子琴的模块输出接到蜂鸣器和LED灯;当KEY8按下时,乐曲自动演奏模块输出接到蜂鸣器和LED灯。
由于三种方式实现的手段都不相同,逐一尝试后再进行取舍。
对于方案A,经过编译下载到试验箱之后,虽然添加使能端可以达到切换功能,但是由于存在时钟信号与使能不同步的原因,在实验箱上就会出现按下按键后不能完全切换,需要等待对应的时钟信号出现后才能将功能切换过去。
对于方案B,经过编译下载到实验箱之后,我们发现由于时钟信号有高低变化的电平出现,在切换的过程中,考虑到器件的延时,会出现无法考虑到的情况,对于两个模块很难达到切换。
于是,我们改变了思路,采用方案C,从输出进行控制,通过将蜂鸣和LED灯的输入和两个模块的输出有选择的匹配进行切换。
通过编译下载到实验箱验证可以实现功能,而且在两种状态的切换时,不会出现无法控制的状况。
5.2自动演奏模块实现方法
通过参照实验课本,我们根据相关实验对试验程序进行了简单修改,得到了本次自动演奏模块的歌曲《欢乐颂》,实现其自动演奏功能。
对于自动演奏模块而言,要实现其功能,只需要在顶层模块中添加触发自动演奏模块的触发点,在本程序中,即按下key8按键,屏蔽掉硬件电子琴的时钟信号,而使自动演奏模块的电子时钟信号作为使能信号。
在自动演奏模块中,首先计算出各个音符所对应的参数,对参数进行定义和设计。
通过对晶振的控制实现每个音响应时间的长短并且可以修改相关参数实现音长的改变。
演奏过程中,设置循环体,即每次演奏结束,可以再从头开始演奏,从而实现自动演奏的自动功能。
程序中可以设置每次循环时间,也可以设置循环中断。
每个音符都需要驱动蜂鸣器实现其功能。
最后,自动演奏模块中,需要有LED灯的指示,对于这样的要求,我们在程序最后添加了assign赋值语句。
实现了每个音符响时对应的LED灯点亮。
对于在实验中没有出现的音符所对应的LED灯则设置为高阻态,从而屏蔽LED灯点亮。
在程序中,通过控制TIME从而得到每个音阶所响应的时间,不同晶振所对应的的时间为1s,对应的时间可以控制振荡次数实现控制时间的长短。
if(state==8'd125)state=8'd0;语句实现的是自动演奏循环和实现歌曲演奏长短。
通过系应该参数从而使歌曲唱到想要唱到的部分。
5.3硬件电子琴模块实现方法
在原理部分我们已经知道了硬件电子琴和自动演奏乐曲的原理是相同的,因此在知道了如何实现乐曲演奏模块的方法后,对于硬件电子琴只需要实现同样的方法,就可以实现其模块功能,只不过在硬件电子琴模块中,需要的是利用按键实现其功能。
对于每一个按键,在程序中设置各按键所对应的参数即可实现硬件电子琴的功能。
程序的关键点为在于各个系数的计算,这个问题在原理部分通过清单已经详细解决,在这里对程序进行简单的解读:
硬件电子琴的功能实现主要靠蜂鸣器和系数得到实现。
在试验程序的基础上进行修改系数而得到。
控制程序的循环体部分实现了计数和完成清零的操作。
通过assign赋值语句实现LED灯的操作,在这里,我们添加了数码管的功能,从而实现了再按下按键的同时,实现数码管显示相对应的音阶大小。
6实验箱上完整设计
6.1硬件电子琴模块程序
图6-1硬件电子琴模块图
modulebeep1(clk,key,beep,led);//模块名称beep
inputclk;//系统时钟48MHz
input[6:
0]key;//按键输入
outputbeep;//蜂鸣器输出端
output[6:
0]led;//LED输出
regbeep_r;//寄存器
reg[15:
0]count,count_end;
reg[6:
0]key_r;
reg[13:
0]a;//消抖寄存器
always@(posedgeclk)
begin
count<=count+1'b1;//计数器加1
if((count==count_end)&(!
(count_end==16'hffff)))
begin
count<=16'h0;//计数器清零
beep_r<=!
beep_r;//取反输出信号
end
end
always@(key)
begin
a=2000;//消抖等待时间
key_r=key;//取键值
case(key_r)
7'b1111110:
begin
while(a>0)
begin
a=a-1;
end
count_end=16'hb327;
while(a>0)
begin
a=a-1;
end
end
7'b1111101:
beginwhile(a>0)begina=a-1;endcount_end=16'h9fa0;while(a>0)begina=a-1;endend//中音2的分频系数值
7'b1111011:
beginwhile(a>0)begina=a-1;endcount_end=16'h8e32;while(a>0)begina=a-1;endend//中音3的分频系数值
7'b1110111:
beginwhile(a>0)begina=a-1;endcount_end=16'h8637;while(a>0)begina=a-1;endend//中音4的分频系数值
7'b1101111:
beginwhile(a>0)begina=a-1;endcount_end=16'h7794;while(a>0)begina=a-1;endend//中音5的分频系数值
7'b1011111:
beginwhile(a>0)begina=a-1;endcount_end=16'h6a88;while(a>0)begina=a-1;endend//中音6的分频系数值
7'b0111111:
beginwhile(a>0)begina=a-1;endcount_end=16'h5ee8;while(a>0)begina=a-1;endend//中音7的分频系数值
default:
beginwhile(a>0)begina=a-1;endcount_end=16'hffff;while(a>0)begina=a-1;endend
endcase
end
assignbeep=beep_r;//输出音乐
assignled=key_r;//输出按键状态
endmodule
6.2乐曲自动演奏机程序
图6-2乐曲自动演奏模块图
modulesong(clk,beep,led);//模块名称
inputclk;//系统时钟48Mhz
outputbeep;//蜂鸣器输出端
output[7:
0]led;
regbeep_r;//寄存器
reg[7:
0]state;//乐谱状态机
reg[15:
0]count,count_end;
reg[23:
0]count1;
//乐谱参数:
D=F/2K(D:
参数,F:
时钟频率,K:
音高频率)
//以下是12MHZ晶振状态下的各音高对应的参数
/*parameterL_5=16'h3bca,//低音5
M_1=16'h2cc9,//中音1
M_2=16'h27f8,//中音2
M_3=16'h238c,//中音3
M_4=16'h218d,//中音4
M_5=16'h1de5,//中音5
M_6=16'h1aa2;//中音6
parameterTIME=3000000;//控制每一个音的长短(250ms)*/
//乐谱参数:
D=F/2K(D:
参数,F:
时钟频率,K:
音高频率)
parameterL_5=16'd61224,//低音5
M_1=16'd45863,//中音1
M_2=16'd40864,//中音2
M_3=16'd36402,//中音3
M_4=16'd34359,//中音4
M_5=16'd30612;//中音5
parameterTIME=12000000;//控制每一个音的长短(250ms)
assignbeep=beep_r;//输出音乐,蜂鸣器
always@(posedgeclk)
begin
count<=count+1'b1;//计数器加1
if(count==count_end)
begin
count<=16'h0;//计数器清零
beep_r<=!
beep_r;//输出取反
end
end
always@(posedgeclk)
begin
if(count1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 课程设计 硬件 电子琴 自动 演奏