eda电子设计使用verilog语言电子琴实验报告Word文档下载推荐.docx
《eda电子设计使用verilog语言电子琴实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《eda电子设计使用verilog语言电子琴实验报告Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
简易电子琴的设计
主要功能:
(1)设计一个八音电子琴。
(2)由键盘输入控制音响,同时可自动演奏乐曲。
(3)用户可以将自己编制的乐曲存入电子琴,演奏时可选择键盘输入乐曲或者已存入的乐曲。
三、课程设计报告内容
3.1设计原理与思路
系统由数控分频器、乐曲存储模块以及发声模块组成。
数控分频器对FPGA的基准频率进行分频,得到与各个音阶对应的频率输出。
乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中可存放一个乐曲曲谱真值表,由一个计数器来控制此真值表的输出,而由计数器的计数时钟信号作为乐曲节拍控制信号。
由发声模块产生音符对应的频率的信号来使扬声器发音。
(1)模块automusic
模块automsic由auto信号来选择发声的方式,auto=0时系统自动播放内置的音乐,auto=1时由键盘来手动演奏音乐。
(2)模块TONE
模块Tone是音阶发生器,当8位发声控制输入Index中某一位为高电平时,则对应某一音阶的数值将从端口Tone输出,作为获得该音阶的分频预置值;
同时由Code输出对应该音阶简谱的显示数码,如‘5’,并由High输出指示音阶高8度显示。
(3)模块Speaker
模块Speaker中的主要电路是一个数控分频器,它由一个初值可预置的加法计数器构成,当模块Speaker由端口Tone获得一个2进制数后,将以此值为计数器的预置数,对端口Clk12MHZ输入的频率进行分频,之后由Spkout向扬声器输出发声。
3.2操作过程
新建工程
添加模块
查找对应芯片
调试程序
波形仿真
生成逻辑图
设置管脚
3.3设计和调试过程中出现的问题及解决方法
在初次编写分频模块时候,使用的是比较基本的计数器分频法,编写程序后在modelsim软件中进行了仿真,发现无法观察到分频情况。
经过分析,原因是由于分频比过大,因此在波形图中很难观察到。
而且由于预分频的占空比很小,更难以观察到高电平。
在原因找到后,为了考察程序的性能,我们将输入频率减小。
同时适当缩小分频比,这样就得到了模块仿真中的分频波形。
4、设计总结和心得体会
通过这次课程设计发现,只有理论水平提高了;
才能够将课本知识与实践相整合,理论知识服务于教学实践,以增强自己的动手能力。
这个实验十分有意义我获得很深刻的经验。
通过这次课程设计,我们知道了理论和实际的距离,也知道了理论和实际想结合的重要性,,也从中得知了很多书本上无法得知的知识。
学习不但要立足于书本,以解决理论和实际教学中的实际问题为目的,还要以实践相结合,理论问题即实践课题,解决问题即课程研究,学生自己就是一个专家,通过自己的手来解决问题比用脑子解决问题更加深刻。
学习就应该采取理论与实践结合的方式,理论的问题,也就是实践性的课题。
这种做法既有助于完成理论知识的巩固,又有助于带动实践,解决实际问题,加强我们的动手能力和解决问题的能力。
参考文献:
(五号,宋体加粗)
[1]潘松,《EDA实用教程》,科学出版社,2004年
附录:
(源程序)
moduletop(clk32MHz,handTOauto,code1,index1,high1,spkout);
inputclk32MHz,handTOauto;
//32MHz系统时钟,键盘输入/自动演奏
input[7:
0]index1;
//键盘输入信号
output[6:
0]code1;
//音符显示信号
outputhigh1,spkout;
//高低音节信号,音频信号
wire[10:
0]tone;
wire[7:
0]indx;
automusicu0(.clk(clk32MHz),.index2(index1),.index0(indx),.auto(handTOauto));
toneu1(.index(indx),.tone0(tone),.code(code1),.high(high1));
speakeru2(.clk1(clk32MHz),.tone1(tone),.spks(spkout));
Endmodule
moduleautomusic(clk,auto,index2,index0);
//实现自动演奏功能。
inputclk,auto;
//系统时钟;
键盘输入/自动演奏
0]index2;
output[7:
0]index0;
//音符信号输出
reg[7:
reg[4:
0]count0;
regclk2;
reg[22:
0]count;
always@(clk,auto)//此过程完成对系统时钟8M的分频,得到4Hz的信号clk2
begin
if(auto)
begin
count=23'
d0;
clk2<
=1'
b1;
end
elseif(clk)
begin
count=count+1'
if(count==23'
d4000000)clk2<
elseif(count==23'
d8000000)beginclk2<
b0;
count=23'
end
end
always@(posedgeclk2)//此过程完成自动演奏部分曲的地址累加
if(count0==5'
d31)
count0<
=5'
else
=count0+1'
always@(count0,auto,index2)
if(!
auto)
case(count0)//此case语句:
存储自动演奏部分的曲
5'
d0:
index0<
=8'
b00000100;
//3
d1:
d2:
d3:
d4:
b00010000;
//5
d5:
d6:
d7:
b00100000;
//6
d8:
b10000000;
//8
d9:
d10:
d11:
d12:
b00000010;
//2
d13:
d14:
b00000001;
//1
d15:
d16:
d17:
d18:
b00001000;
//4
d19:
d20:
d21:
d22:
d23:
d24:
d25:
d26:
d27:
d28:
d29:
d30:
d31:
default:
;
endcase
elseindex0<
=index2;
//键盘输入音符信号输出
end
moduletone(index,code,high,tone0);
//音阶发生器程序。
0]index;
//音符输入信号
0]code;
//音符显示信号
outputhigh;
//高低音显示信号
output[10:
0]tone0;
//音符的分频系数
reghigh;
reg[6:
reg[10:
always@(index)//此过程完成音符到音符的分频系数译码,音符的显示,高低音阶
case(index)
8'
b00000001:
begintone0=11'
d773;
code=6'
b1001111;
high=1'
b00000010:
d912;
b0010010;
b00000100:
d1116;
code=6'
b1001100;
b00010000:
d1197;
b0100100;
b00100000:
d1290;
b0100000;
b01000000:
d1372;
b0001111;
b10000000:
d1410;
b0000000;
default:
d2047;
b0000001;
endmodule
modulespeaker(clk1,tone1,spks);
//实现数控分频
inputclk1;
//系统时钟
input[10:
0]tone1;
//音符分频系数
outputspks;
//驱动扬声器的音频信号
0]tone2;
regspks;
regpreclk,full