veriloghdl电子琴课程设计.docx

上传人:b****5 文档编号:4370555 上传时间:2022-12-01 格式:DOCX 页数:25 大小:580.88KB
下载 相关 举报
veriloghdl电子琴课程设计.docx_第1页
第1页 / 共25页
veriloghdl电子琴课程设计.docx_第2页
第2页 / 共25页
veriloghdl电子琴课程设计.docx_第3页
第3页 / 共25页
veriloghdl电子琴课程设计.docx_第4页
第4页 / 共25页
veriloghdl电子琴课程设计.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

veriloghdl电子琴课程设计.docx

《veriloghdl电子琴课程设计.docx》由会员分享,可在线阅读,更多相关《veriloghdl电子琴课程设计.docx(25页珍藏版)》请在冰豆网上搜索。

veriloghdl电子琴课程设计.docx

veriloghdl电子琴课程设计

 

verilog-hdl—电子琴课程设计(总22页)

 

湖北文理学院

课程设计报告

 

题目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};nclk(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'b0)

mm<=2'b01;

elseif(key==9'b1)

mm<=2'b10;

elseif(key==9'b0)

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

'b0000:

origin=5733;//高1

'b0000:

origin=5108;//高2

'b0000:

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}='b000000110000;//中3

18,19:

{high,med,low}='b000001010000;//中5

20,21:

{high,m

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 小学教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1