湖北文理学院课程设计报告题目Veriloghdl课程设计专业1211自动化学生姓名一天虹影指导教师单鸣雷完成时间2015—1—9课程设计报告-1-课程设计(报告)任务书(理工科类)课程设计(报告)题目:电子琴的设计课程设计(论文)工作内容一、课程设计目标1、培养综合运用知识和独立开展实践创新的能力;2、深入学习VerilogHDL,了解其编程环境;3、学会运用Modelsim和QuartusII等编程仿真软件;4、将硬件语言编程与硬件实物功能演示相结合,加深理解VerilogHDL的学习;二、研究方法及手段应用1、将任务分成若干模块,查阅相关论文资料,分模块调试和完成任务;2、遇到问题小组成员及时讨论得出解决方法;3、遇到本组内解决不了的问题,及时和其他小组交流或询问老师;4、程序仿真,仿真无问题后进行模块调试,根据实验箱上的硬件实现是否符合要求来检验程序正确与否。三、课程设计预期效果1、完成实验环境搭建;2、具有手动弹奏和自动播放功能;3、以按键(或开关)作为琴键,至少可以通过蜂鸣器输出7个音阶;4、自动播放曲目至少两首;课程设计报告-2-摘要简易电子琴的设计通过通过软硬件结合实现,硬件系统包括主控器芯片、9个按键、LED、蜂鸣器等,软件资源包括编写VerilogHDL程序的应用软件Modelsim和仿真软件QuartusII。电子琴有按键代替琴键的弹奏功能和自动播放功能。按键有七个音,自动播放功能中有三首曲子,分别是《两只老虎》、《天空之城》和《康定情歌》。程序共有五个模块,分别为主模块、琴键模块、曲1模块、曲2模块、曲3模块。硬件实现是用三个LED灯组合亮暗分别表示七个按键按下情况,另外两个按键用来选择曲目。实验箱原始时钟为50MHz,分频后变成不同的频率输出,通过蜂鸣器输出不同频率的声音。音乐的节拍通过分频变为4Hz,作为1/4拍。通过主模块调用各模块实现电子琴的功能。【关键词】VerilogHDL电子琴模块分频ABSTRACTThisarticleintroducedthesimpleelectricpiano’sdesign.Itrealizesthroughthesoftwareandhardwareunion.Thehardwaresystemincludesadirector,9keys,LEDsandabuzzer.ThesoftwaredesignusesVerilogHDL.EmulationusesQuartusII.Itcanbroadcastthesystemestablishmentthecorrespondingnote,andcancompleteamilitarysongthebroadcast,butalsohasshowsthesoundthefunction.Designsthesimpleelectricpianotohaveinthehardware.Theprogramhassevenmodules,includingmainmodule,fractionalfrequencymoduleandsoon.Keyboardwithkeystoplaythefunctionandreplacethekeystoplayfunction.Keyhassevensound,automaticplaybackfunctionwiththreeinsong,werethetwotiger,theskycityandkangdinglovesongs.Softwarehasitsmerit.ItisperfectinthesoftwareVerilogHDL.Theoriginalfrequencyisdividedintodifferentfrequencys.Thepianomakessoundbythebuzzerwithdifferentfrequencys.【keywords】VerilogHDLelectricpianomodulefractionalfrequency课程设计报告-3-第一章系统设计第一节课题目标及总体方案本次项目设计课程的目标是让我们在学习VerilogHDL的基础上更加深入的理解硬件设计语言的功能、作用及其特征,并且将我们的动手能力与创新能力结合起来。本次电子琴实验的目标是:1、具有手动弹奏和自动播放功能;2、以按键(或开关)作为琴键,至少可以通过蜂鸣器输出7个音阶;3、自动播放曲目至少两首;本次实验的方框图为:(每个模块中都有分频)主模块九个键Key1到Key7用于弹奏Key8与Key9(mm)用于选择歌曲mm=00按键模块Key1到Key7模块名digital_pianomm=01曲目1《两只老虎》模块名bellmm=10曲目2《康定情歌》模块名bell2mm=11曲目3《天空之城》模块名bell3课程设计报告-4-第二节设计框图说明一、主模块主模块中用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)//在时钟的上升沿检测是否有按键按下beginif(key==9'b111111110)mm=2'b01;elseif(key==9'b111111101)mm=2'b10;elseif(key==9'b111111100)mm=2'b11;课程设计报告-5-elsemm=2'b00;endalways@(posedgeinclk)beginif(c4'd4)c=c+4'd1;elsebeginc=4'd0;clk_6M=~clk_6M;endendalways@(posedgeclk_6M)beginif(mm==2'b01)outclk=out1;elseif(mm==2'b00)outclk=out2;elseif(mm==2'b10)outclk=out3;elseoutclk=out4;endendmodule二、按键模块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,课程设计报告-6-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)beginif(c4'd4)c=c+4'd1;elsebeginc=4'd0;clk_6M=~clk_6M;endendalways@(posedgeclk_6M)//分频模块,得出乐谱begincount=count+16'd1;//计数器加1if(count==count_end)begincount=16'd0;//计数器清零beep_r=!beep_r;endendalways@(posedgeclk_6M)//状态机,根据按键状态,选择不同的音符输出begincase(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;endcaseend课程设计报告-7-always@(posedgeclk_6M)begincase(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;endcaseendendmodule二、曲目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;//输出音乐//时钟频率6MHzregclk_6MHz;reg[2:0]cnt1;always@(posedgeinclk)beginif(cnt13'd4)cnt1=cnt1+3'b1;elsebegincnt1=3'b0;clk_6MHz=~clk_6MHz;endend//时钟频率4MHzregclk_4Hz;reg[24:0]cnt2;always@(posedgeinclk)begin课程设计报告-8-if(cnt225'd6250000)cnt2=cnt2+25'b1;elsebegincnt2=25'b0;clk_4Hz=~clk_4Hz;endendalways@(posedgeclk_6MHz)begincount=count+1'b1;//计数器加1if(count==origin)begincount=16'h0;//计数器清零beep_r=!beep_r;//输出取反endendalways@(posedgeclk_4Hz)begincase({high,med,low})12'b000000010000:origin=11466;//mid