您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > FPGA课程设计报告--简易电子琴的设计.doc
西安邮电大学FPGA课程设计报告题目:简易电子琴设计及FPGA功能验证院系:专业班级:学生姓名:XX导师姓名:XX起止时间:2012、6、18至2012、6、29一、课程设计任务:本设计一个简易电子琴,具体功能如下:1、具有手动弹奏和自动播放功能;2、以按键或开关作为电子琴的琴键,输出7个音节的音阶;3、可以自动播放曲目至少两首。二、课程设计目的:1、培养综合运用知识和独立开展实践创新的能力;2、深入学习VerilogHDL,了解其编程环境;3、学会运用Modelsim和QuartusII等编程仿真软件;4、将硬件语言编程与硬件实物功能演示相结合,加深理解VerilogHDL的学习;三、使用环境:1、软件:Modelsim和QuartusII等编程仿真软件;2、硬件:FPGA开发板。四、课程设计详细方案及功能验证:1、总体实现方案:1、简易电子琴的设计通过软硬件结合实现,硬件系统包括主控器芯片、9个按键、LED、蜂鸣器等,软件资源包括编写VerilogHDL程序的应用软件Modelsim和仿真软件QuartusII。电子琴有按键代替琴键的弹奏功能和自动播放功能。2、整个程序总共分5个模块:主模块,按键模块,曲目1模块,曲目2模块,曲目3模块。整个方案总共用了9个按键(key1~key9),按键key1~key7作为琴键,通过这七个按键键入不同的音阶。主模块中key8、key9两个按键用于选择是自动播放还是弹奏曲目,令mm=(key8、key9),用mm值的不同选择调用不同模块。如果mm=00,则程序调用按键模块;如果mm=01,则调用曲目1模块,播放曲目1;如果mm=10,则调用曲目2模块,播放曲目2;如果mm11,则调用曲目3模块,播放曲目3。本次设计的框图:2、输入输出信号描述:具体功能描述:信号源输入/输出功能描述inclkInput时钟频率50Mkey(1~9)Input键入以及选择曲目numOutput数码管显示out_rOutput根据r选择不同模块3、顶层划分:主模块(key1.key2.key3.key4.key5.key6.key7.key8.key9)outclkbeep_r主模块9个按键(key1~key9)控制播放曲目以及手动弹奏手动弹奏(key1~key7)播放曲目(key8、key9)按键模块即琴键键入音阶,Key1~key7mm=00mm=11曲目3曲目1曲目2mm=01mm=10电子琴Key(1~9)Inclk[7:0]numOut_r(beep)4、主要模块:主模块:功能描述:是四个子模块的核心,通过主模块分别调用四个不同的子模块。管脚描述:信号名称输入/输出源功能描述inclkInputPin系统时钟50MHzKey(1~9)InputPin按键选择,键入作用outclkOutputPin模块选择输出按键模块:功能描述:通过按键key1~key7键入不同的7个音阶,频率不同则蜂鸣器发音就不同;通过mm=(key8、key9)的值选择调用不同曲目模块。管脚描述:信号名称输入/输出源功能描述inclkInputPin系统时钟50MHzKey(1~7)InputPin按键键入7个不同音阶Beep4OutputPin输出7个不同音阶inclk50MHZ分频clk_6Mmmnum[7:0]Key(8~9)分频clk_6MKey(1~7)beep4分频clk_6Mclk_4HZcountstatebeep1分频clk_6Mclk_4HZcountstateclk_4HZbeep2分频clk_6Mclk_4HZcountclk_4HZstateclk_4HZbeep3曲目模块:功能描述:不同的曲目模块输出不同的曲调,根据高低音对应的频率不同输出不同曲调的曲目。在50MHZ的情况下对主时钟分频得到6MHZ的频率,得到在6MHZ下对应的音阶及其对应频率,以及分频数,通过计数分频数,来对不同频率的声音进行输出,实验箱原始时钟为50MHz,分频后变成不同的频率输出,通过蜂鸣器输出不同频率的声音。音乐的节拍通过分频变为4Hz,作为1/4拍,即每个单位时长0.25s。管脚描述:信号名称输入/输出源功能描述inclkInputPin系统时钟50MHzKey(8~9)InputPin选择曲目Beep3OutputPin输出曲目5、功能仿真:1、综合:2、总体电路图:3、所有输入输出信号:4、管脚分配:输入信号:一个时钟信号,9个按键;输出信号:一个数码管输出,一个蜂鸣器输出音调。5、时序仿真:仿真结果;设置输入信号key1~key7为高电平,此时设置key8~key9=01,即mm=01,在数码管应该显示1,在仿真结束后,如图示数码管为11111001,即为1,outclk为蜂鸣器的输出,如图示也正确,所以本设计经过仿真证明正确可行。6、硬件测试结果:在时序验证后下载,通过硬件测试,实验达到预期效果,当mm(key8~key9)=00时,通过key1~key7这7个按键的键入蜂鸣器可以发出do~xi的七个音阶的音,即表示了电子琴的弹奏功能;当mm=01时,播放了第一首歌;mm=10时,播放了第二首歌;mm=11时,播放第三首歌。通过硬件的测试,所有的设计目标均实现。7、对结果和结论的问题讨论:实验过程中,蜂鸣器发音时好时坏,有时比较低沉,有时却比较尖锐,这可能是对主系统分频不精确导致的结果,当对主系统时钟不同分频时,结果都不同,最终在多次试验下,得到在6M时钟频率下效果最为理想。8、音阶及其对应频率(时钟频率为50MHz分为6MHz)五、心得体会:在这次课程设计之前,其实做过了单片机关于蜂鸣器方面的实验,上手起来还是很快的,开始时,先按照老师的要求,写规范,确定实现方案,然后在逐一细化,一步一步按照要求去完成整个设计。本次设计要用quartusII软件,由于之前对此软件不是太熟悉所以导致了一些错误和问题的发生,所以这次课程设计中认真学习了quartusII软件的具体使用步骤和操作流程,对所有可能出现的问题进行逐一攻破。通过这次实验,我不但熟悉了quartusII软件,也了解了开发的最基本流程和方法,也进一步加深了对Verilog编程语言的理解,最重要的是锻炼了我独立思考和分析的逻辑能力,通过从顶向下的设计方法,一步步实现,然后将整个设计串套起来,是我对设计的流程以及编程有了很大的提高。通过此次硬件课程设计,使我越来越认识到一点,编程对项目实现有着至关重要的作用,我们在硬件开发的过程中必须重视编程,将编程看作是完善开发的不可缺少的一部分。在一次次的反复设计、论证和测试中,不仅提高了逻辑分析能力、全面分析问题的能力,还提升了发现问题、解决问题的能力。虽然设计过程比较繁琐,大大小小也出现了许多问题,但这却磨练了我的意志。通过各方面的学习,使我的知识面进一步拓宽了。同时,通过本次课程设计,使我也发现了自己的不足,例如:逻辑分析能力不突出,编程能力不足,解决问题的能力不足,使我认识到在以后的学习中在这些方面要多努力,加以改进,提升自我能力。我相信通过这次课程设计的学习,对我以后有着十分重要的影响和作用。音阶频率/Hz周期/us半周期/us分频数中音15231912956114722578168484210380365915187599104469814327168595578412766387653688011365686818798810125066073高音H110469564785736H211758524265106附代码:moduledianziqin(inclk,outclk,key1,key2,key3,key4,key5,key6,key7,key8,key9,num);inputinclk;inputkey1,key2,key3,key4,key5,key6,key7,key8,key9;outputoutclk;output[7:0]num;reg[7: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),.beep4(out4));bellm2(.inclk(inclk),.beep1(out1));bell2m3(.inclk(inclk),.beep2(out2));bell3m4(.inclk(inclk),.beep3(out3));always@(posedgeinclk)beginif(c4'd8)c=c+4'd1;elsebeginc=4'd0;clk_6M=~clk_6M;endendalways@(posedgeclk_6M)//在时钟的上升沿检测是否有按键按下beginif(key==9'b111111110)mm=2'b01;elseif(key==9'b111111101)mm=2'b10;elseif(key==9'b111111100)mm=2'b11;elsemm=2'b00;endalways@(mm)begincase(mm)2'b01:num=8'b11111001;2'b10:num=8'b10100100;2'b11:num=8'b10110000;default:num=8'b11000000;endcaseendalways@(mm)//按键响应beginif(mm==2'b01)outclk=out1;elseif(mm==2'b10)outclk=out2;elseif(mm==2'b11)outclk=out3;elseoutclk=out4;endendmodule//digital_piano子模块moduledigital_piano(inclk,key1,key2,key3,key4,key5,key6,key7,beep4);inputinclk,key1,key2,key3,key4,key5,key6,key7;outputbeep4;wire[6:0]key_code;reg[3:0]c;regclk_6M;regbeep_r;reg[15:0]count;reg[15:0]count_end;parameterDo=7'b1111110,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};assignbeep4=beep_r;//输出音乐always@(posedgeinclk)beginif(c4'd8)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
本文标题:FPGA课程设计报告--简易电子琴的设计.doc
链接地址:https://www.777doc.com/doc-3416430 .html