veriloghdl电子琴课程设计.docx
- 文档编号:29127436
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:30
- 大小:224.87KB
veriloghdl电子琴课程设计.docx
《veriloghdl电子琴课程设计.docx》由会员分享,可在线阅读,更多相关《veriloghdl电子琴课程设计.docx(30页珍藏版)》请在冰豆网上搜索。
veriloghdl电子琴课程设计
verilog-hdl—电子琴课程设计
湖北文理学院
课程设计报告
题目Veriloghdl课程设计
专业1211自动化
学生姓名一天虹影
指导教师单鸣雷
完成时间2015—1—9
课程设计(报告)任务书
(理工科类)
课程设计(报告)题目:
电子琴的设计
课程设计(论文)工作内容
一、课程设计目标
1、培养综合运用知识和独立开展实践创新的能力;
2、深入学习VerilogHDL,了解其编程环境;
3、学会运用Modelsim和QuartusII等编程仿真软件;
4、将硬件语言编程与硬件实物功能演示相结合,加深理解VerilogHDL的学习;
二、研究方法及手段应用
1、将任务分成若干模块,查阅相关论文资料,分模块调试和完成任务;
2、遇到问题小组成员及时讨论得出解决方法;
3、遇到本组内解决不了的问题,及时和其他小组交流或询问老师;
4、程序仿真,仿真无问题后进行模块调试,根据实验箱上的硬件实现是否符合要求来检验程序正确与否。
三、课程设计预期效果
1、完成实验环境搭建;
2、具有手动弹奏和自动播放功能;
3、以按键(或开关)作为琴键,至少可以通过蜂鸣器输出7个音阶;
4、自动播放曲目至少两首;
摘要
简易电子琴的设计通过通过软硬件结合实现,硬件系统包括主控器芯片、9个按键、LED、蜂鸣器等,软件资源包括编写VerilogHDL程序的应用软件Modelsim和仿真软件QuartusII。
电子琴有按键代替琴键的弹奏功能和自动播放功能。
按键有七个音,自动播放功能中有三首曲子,分别是《两只老虎》、《天空之城》和《康定情歌》。
程序共有五个模块,分别为主模块、琴键模块、曲1模块、曲2模块、曲3模块。
硬件实现是用三个LED灯组合亮暗分别表示七个按键按下情况,另外两个按键用来选择曲目。
实验箱原始时钟为50MHz,分频后变成不同的频率输出,通过蜂鸣器输出不同频率的声音。
音乐的节拍通过分频变为4Hz,作为1/4拍。
通过主模块调用各模块实现电子琴的功能。
【关键词】VerilogHDL电子琴模块分频
ABSTRACT
Thisarticleintroducedthesimpleelectricpiano’sdesign.Itrealizesthroughthesoftwareandhardwareunion.Thehardwaresystemincludesadirector,9keys,LEDsandabuzzer.ThesoftwaredesignusesVerilogHDL.EmulationusesQuartusII.Itcanbroadcastthesystemestablishmentthecorrespondingnote,andcancompleteamilitarysongthebroadcast,butalsohasshowsthesoundthefunction.Designsthesimpleelectricpianotohaveinthehardware.Theprogramhassevenmodules,includingmainmodule,fractionalfrequencymoduleandsoon.Keyboardwithkeystoplaythefunctionandreplacethekeystoplayfunction.Keyhassevensound,automaticplaybackfunctionwiththreeinsong,werethetwotiger","theskycity"and"kangdinglovesongs.Softwarehasitsmerit.ItisperfectinthesoftwareVerilogHDL.Theoriginalfrequencyisdividedintodifferentfrequencys.Thepianomakessoundbythebuzzerwithdifferentfrequencys.
【keywords】VerilogHDLelectricpianomodulefractionalfrequency
第一章系统设计
第一节课题目标及总体方案
本次项目设计课程的目标是让我们在学习VerilogHDL的基础上更加深入的理解硬件设计语言的功能、作用及其特征,并且将我们的动手能力与创新能力结合起来。
本次电子琴实验的目标是:
1、具有手动弹奏和自动播放功能;
2、以按键(或开关)作为琴键,至少可以通过蜂鸣器输出7个音阶;
3、自动播放曲目至少两首;
本次实验的方框图为:
(每个模块中都有分频)
第二节设计框图说明
一、主模块
主模块中用mm=(key8,key9)值的不同选择调用不同模块,mm=01调用曲目1模块,即bell模块;mm=10调用曲目2模块,即bell2模块;mm=11调用曲目3模块,即bell3模块;而在key8与key9没有被按下的情况下,程序调用按键模块,即digital_piano模块
modulemain(inclk,outclk,key1,key2,key3,key4,key5,key6,key7,key8,key9,num);
inputinclk;
inputkey1,key2,key3,key4,key5,key6,key7,key8,key9;
outputoutclk;
output[3:
0]num;
regoutclk,clk_6M;
reg[3:
0]c;
wireout1,out2,out3,out4;
wire[8:
0]key;
reg[1:
0]mm;
assignkey={key1,key2,key3,key4,key5,key6,key7,key8,key9};//由按键拼键为变量key
//调用子调块
digital_pianom1(.inclk(inclk),.key1(key1),.key2(key2),.key3(key3),.key4(key4),
.key5(key5),.key6(key6),.key7(key7),.beep2(out2),.num(num));
bellm2(.inclk(inclk),.beep1(out1));
bell2m3(.inclk(inclk),.beep3(out3));
bell3m4(.inclk(inclk),.beep4(out4));
always@(posedgeclk_6M)//在时钟的上升沿检测是否有按键按下
begin
if(key==9'b111111110)
mm<=2'b01;
elseif(key==9'b111111101)
mm<=2'b10;
elseif(key==9'b111111100)
mm<=2'b11;
elsemm<=2'b00;
end
always@(posedgeinclk)
begin
if(c<4'd4)
c<=c+4'd1;
else
begin
c<=4'd0;
clk_6M=~clk_6M;
end
end
always@(posedgeclk_6M)
begin
if(mm==2'b01)
outclk<=out1;
elseif(mm==2'b00)
outclk<=out2;
elseif(mm==2'b10)
outclk<=out3;
elseoutclk<=out4;
end
endmodule
二、按键模块
Key1到key7对应do到si七个音,用于模拟电子琴弹奏
//digital_piano子模块
moduledigital_piano(inclk,key1,key2,key3,key4,key5,key6,key7,beep2,num);
inputinclk,key1,key2,key3,key4,key5,key6,key7;
output[3:
0]num;
outputbeep2;
wire[6:
0]key_code;
reg[3:
0]c;
regclk_6M;
regbeep_r;
reg[3:
0]num;
reg[15:
0]count;
reg[15:
0]count_end;
parameterDo=7'b1111110,//状态机的7个编码,分别对应中音的7个音符
re=7'b1111101,
mi=7'b1111011,
fa=7'b1110111,
so=7'b1101111,
la=7'b1011111,
si=7'b0111111;
assignkey_code={key7,key6,key5,key4,key3,key2,key1};
assignbeep2=beep_r;//输出音乐
always@(posedgeinclk)
begin
if(c<4'd4)
c<=c+4'd1;
else
begin
c<=4'd0;
clk_6M=~clk_6M;
end
end
always@(posedgeclk_6M)//分频模块,得出乐谱
begin
count<=count+16'd1;//计数器加1
if(count==count_end)
begin
count<=16'd0;//计数器清零
beep_r<=!
beep_r;
end
end
always@(posedgeclk_6M)//状态机,根据按键状态,选择不同的音符输出
begin
case(key_code)
Do:
count_end<=16'd11450;
re:
count_end<=16'd10204;
mi:
count_end<=16'd09090;
fa:
count_end<=16'd08571;
so:
count_end<=16'd07802;
la:
count_end<=16'd06802;
si:
count_end<=16'd06060;
default:
count_end<=16'd0;
endcase
end
always@(posedgeclk_6M)
begin
case(key_code)
Do:
num<=4'b0001;
re:
num<=4'b0010;
mi:
num<=4'b0011;
fa:
num<=4'b0100;
so:
num<=4'b0101;
la:
num<=4'b0110;
si:
num<=4'b0111;
endcase
end
endmodule
二、曲目1模块
//bell子模块《两只老虎》
modulebell(inclk,beep1);
inputinclk;//系统时钟
outputbeep1;//蜂鸣器输出端
reg[3:
0]high,med,low;
reg[15:
0]origin;
regbeep_r;//寄存器
reg[7:
0]state;
reg[15:
0]count;
assignbeep1=beep_r;//输出音乐
//时钟频率6MHz
regclk_6MHz;
reg[2:
0]cnt1;
always@(posedgeinclk)
begin
if(cnt1<3'd4)
cnt1<=cnt1+3'b1;
else
begin
cnt1<=3'b0;
clk_6MHz<=~clk_6MHz;
end
end
//时钟频率4MHz
regclk_4Hz;
reg[24:
0]cnt2;
always@(posedgeinclk)
begin
if(cnt2<25'd6250000)
cnt2<=cnt2+25'b1;
else
begin
cnt2<=25'b0;
clk_4Hz<=~clk_4Hz;
end
end
always@(posedgeclk_6MHz)
begin
count<=count+1'b1;//计数器加1
if(count==origin)
begin
count<=16'h0;//计数器清零
beep_r<=!
beep_r;//输出取反
end
end
always@(posedgeclk_4Hz)
begin
case({high,med,low})
12'b000000010000:
origin=11466;//mid1
12'b000000100000:
origin=10216;//mid2
12'b000000110000:
origin=9101;//mid3
12'b000001000000:
origin=8590;//mid4
12'b000001010000:
origin=7653;//mid5
12'b000001100000:
origin=6818;//mid6
12'b000000000101:
origin=14447;//low5
endcase
end
always@(posedgeclk_4Hz)//歌曲<
begin
if(state==63)state=0;//计时,以实现循环演奏
else
state=state+1;
case(state)
0,1:
{high,med,low}=12'b000000010000;//mid1
2,3:
{high,med,low}=12'b000000100000;//mid2
4,5:
{high,med,low}=12'b000000110000;//mid3
6,7:
{high,med,low}=12'b000000010000;//mid1
8,9:
{high,med,low}=12'b000000010000;//mid1
10,11:
{high,med,low}=12'b000000100000;//mid2
12,13:
{high,med,low}=12'b000000110000;//mid3
14,15:
{high,med,low}=12'b000000010000;//mid1
16,17:
{high,med,low}=12'b000000110000;//mid3
18,19:
{high,med,low}=12'b000001000000;//mid4
20,21,22,23:
{high,med,low}=12'b000001010000;//mid5
24,25:
{high,med,low}=12'b000000110000;//mid3
26,27:
{high,med,low}=12'b000001000000;//mid4
28,29,30,31:
{high,med,low}=12'b000001010000;//mid5
32:
{high,med,low}=12'b000001010000;//mid5
33:
{high,med,low}=12'b000001100000;//mid6
34:
{high,med,low}=12'b000001010000;//mid5
35:
{high,med,low}=12'b000001000000;//mid4
36,37:
{high,med,low}=12'b000000110000;//mid3
38,39:
{high,med,low}=12'b000000010000;//mid1
40:
{high,med,low}=12'b000001010000;//mid5
41:
{high,med,low}=12'b000001100000;//mid6
42:
{high,med,low}=12'b000001010000;//mid5
43:
{high,med,low}=12'b000001000000;//mid4
44,45:
{high,med,low}=12'b000000110000;//mid3
46,47:
{high,med,low}=12'b000000010000;//mid1
48,49:
{high,med,low}=12'b000000100000;//mid2
50,51:
{high,med,low}=12'b000000000101;//low5
52,53,54,55:
{high,med,low}=12'b000000010000;//mid1
56,56:
{high,med,low}=12'b000000100000;//mid2
57,58:
{high,med,low}=12'b000000000101;//low5
59,60,61,62,63:
{high,med,low}=12'b000000010000;//mid1
default:
{high,med,low}=12'bx;
endcase
end
endmodule
三、曲目2模块
//bell2子模块《康定情歌》
modulebell2(inclk,beep3);
inputinclk;//系统时钟
outputbeep3;//蜂鸣器输出端
reg[3:
0]high,med,low;
reg[15:
0]origin;
regbeep_r;//寄存器
reg[7:
0]state;
reg[15:
0]count;
assignbeep3=beep_r;//输出音乐
//时钟频率6MHz
regclk_6MHz;
reg[2:
0]cnt1;
always@(posedgeinclk)
begin
if(cnt1<3'd4)
cnt1<=cnt1+3'b1;
else
begin
cnt1<=3'b0;
clk_6MHz<=~clk_6MHz;
end
end
//时钟频率4MHz
regclk_4Hz;
reg[24:
0]cnt2;
always@(posedgeinclk)
begin
if(cnt2<25'd6250000)
cnt2<=cnt2+25'b1;
else
begin
cnt2<=25'b0;
clk_4Hz<=~clk_4Hz;
end
end
always@(posedgeclk_6MHz)
begin
count<=count+1'b1;//计数器加1
if(count==origin)
begin
count<=16'h0;//计数器清零
beep_r<=!
beep_r;//输出取反
end
end
always@(posedgeclk_4Hz)
begin
case({high,med,low})
'b000000000001:
origin=22900;//低1
'b000000000010:
origin=20408;//低2
'b000000000011:
origin=18181;//低3
'b000000000101:
origin=15267;//低5
'b000000000110:
origin=13605;//低6
'b000000000111:
origin=11472;//中1
'b000000100000:
origin=10216;//中2
'b000000110000:
origin=9101;//中3
'b000001010000:
origin=7653;//中5
'b000001100000:
origin=6818;//中6
'b000100000000:
origin=5733;//高1
'b001000000000:
origin=5108;//高2
'b001100000000:
origin=4551;//高3
endcase
end
always@(posedgeclk_4Hz)
begin
if(state==103)
state=0;
else
state=state+1;//《康定情歌》
case(state)
0,1:
{high,med,low}='b000000110000;//中3
2,3:
{high,med,low}='b000001010000;//中5
4,5:
{high,med,low}='b000001100000;//中6
6:
{high,med,low}='b000001100000;//中6
7:
{high,med,low}='b000001010000;//中5
8,9,10:
{high,med,low}='b000001100000;//中6
11:
{high,med,low}='b000000110000;//中3
12,13,14,15:
{high,med,low}='b000000100000;//中2
16,17:
{high,med,low}=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- veriloghdl 电子琴 课程设计