FPGA课程设计报告简易电子琴的设计_第1页
FPGA课程设计报告简易电子琴的设计_第2页
FPGA课程设计报告简易电子琴的设计_第3页
FPGA课程设计报告简易电子琴的设计_第4页
FPGA课程设计报告简易电子琴的设计_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、西安邮电大学FPGA课程设计报告题 目:简易电子琴设计及FPGA功能验证院 系: 专业班级: 学生姓名: XX 导师姓名: XX 起止时间: 2012、6、18至2012、6、29 一、课程设计任务:本设计一个简易电子琴,具体功能如下:1、 具有手动弹奏和自动播放功能;2、 以按键或开关作为电子琴的琴键,输出7个音节的音阶;3、 可以自动播放曲目至少两首。二、课程设计目的: 1、培养综合运用知识和独立开展实践创新的能力;2、深入学习Verilog HDL,了解其编程环境;3、学会运用Modelsim和Quartus II等编程仿真软件;4、将硬件语言编程与硬件实物功能演示相结合,加深理解Ver

2、ilog HDL的学习;三、使用环境:1、软件:Modelsim和Quartus II等编程仿真软件;2、硬件:FPGA开发板。四、课程设计详细方案及功能验证:1、总体实现方案:1、简易电子琴的设计通过软硬件结合实现,硬件系统包括主控器芯片、9个按键、LED、蜂鸣器等,软件资源包括编写Verilog HDL程序的应用软件Modelsim和仿真软件Quartus II。电子琴有按键代替琴键的弹奏功能和自动播放功能。 2、整个程序总共分5个模块:主模块,按键模块,曲目1模块,曲目2模块,曲目3模块。整个方案总共用了9个按键(key1key9),按键key1key7作为琴键,通过这七个按键键入不同的

3、音阶。主模块中key8、key9两个按键用于选择是自动播放还是弹奏曲目,令mm=(key8、key9),用mm值的不同选择调用不同模块。如果mm=00,则程序调用按键模块;如果mm=01,则调用曲目1模块,播放曲目1;如果mm=10,则调用曲目2模块,播放曲目2;如果mm11,则调用曲目3模块,播放曲目3。本次设计的框图: 主模块9个按键(key1key9)控制播放曲目以及手动弹奏手动弹奏(key1key7)播放曲目(key8、key9)按键模块即琴键键入音阶,Key1key7mm=00mm=11 曲目3 曲目1 曲目 2mm=01mm=102、输入输出信号描述: 7:0num 电子琴Incl

4、k Out_r(beep)Key(19)具体功能描述:信号源 输入/输出 功能描述 inclk Input时钟频率50M key(19) Input键入以及选择曲目 num Output数码管显示 out_r Output根据r选择不同模块3、顶层划分:主模块 (key1.key2.key3.key4.key5.key6.key7.key8.key9) outclk beep_rKey(89)clk_6M分频inclk50MHZ num7:0mm分频beep4Key(17)clk_6Mcountclk_6M分频beep1stateclk_4HZcountclk_6M分频beep2statecl

5、k_4HZbeep3countclk_6M分频stateclk_4HZ4、主要模块:主模块:功能描述:是四个子模块的核心,通过主模块分别调用四个不同的子模块。管脚描述:信号名称输入 / 输出源功能描述inclkInputPin系统时钟50MHzKey(19)InputPin按键选择,键入作用outclkOutputPin模块选择输出按键模块:功能描述:通过按键key1key7键入不同的7个音阶,频率不同则蜂鸣器发音就不同;通过mm=(key8、key9)的值选择调用不同曲目模块。 管脚描述: 信号名称输入 / 输出源功能描述inclkInputPin系统时钟50MHzKey(17)InputP

6、in按键键入7个不同音阶Beep4OutputPin输出7个不同音阶曲目模块: 功能描述:不同的曲目模块输出不同的曲调,根据高低音对应的频率不同输出不同曲调的曲目。在50MHZ的情况下对主时钟分频得到6MHZ的频率,得到在6MHZ下对应的音阶及其对应频率,以及分频数,通过计数分频数,来对不同频率的声音进行输出,实验箱原始时钟为50MHz,分频后变成不同的频率输出,通过蜂鸣器输出不同频率的声音。音乐的节拍通过分频变为4Hz,作为1/4拍,即每个单位时长0.25s。 管脚描述:信号名称输入 / 输出源功能描述inclkInputPin系统时钟50MHzKey(89)InputPin选择曲目Beep

7、3OutputPin输出曲目5、功能仿真:1、综合:2、总体电路图:3、所有输入输出信号:4、管脚分配:输入信号:一个时钟信号,9个按键;输出信号:一个数码管输出,一个蜂鸣器输出音调。5、时序仿真:仿真结果;设置输入信号key1key7为高电平,此时设置key8key9=01,即mm=01,在数码管应该显示1,在仿真结束后,如图示数码管为,即为1,outclk为蜂鸣器的输出,如图示也正确,所以本设计经过仿真证明正确可行。6、 硬件测试结果: 在时序验证后下载,通过硬件测试,实验达到预期效果,当mm(key8key9)=00时,通过key1key7这7个按键的键入蜂鸣器可以发出doxi的七个音阶

8、的音,即表示了电子琴的弹奏功能;当mm=01时,播放了第一首歌;mm=10时,播放了第二首歌;mm=11时,播放第三首歌。通过硬件的测试,所有的设计目标均实现。7、 对结果和结论的问题讨论:实验过程中,蜂鸣器发音时好时坏,有时比较低沉,有时却比较尖锐,这可能是对主系统分频不精确导致的结果,当对主系统时钟不同分频时,结果都不同,最终在多次试验下,得到在6M时钟频率下效果最为理想。8、 音阶及其对应频率(时钟频率为50MHz分为6MHz)音阶频率/Hz周期/us半周期/us分频数中音1523191295611472257816848421038036591518759910446981432716

9、8595578412766387653688011365686818798810125066073高音H110469564785736H211758524265106五、心得体会:在这次课程设计之前,其实做过了单片机关于蜂鸣器方面的实验,上手起来还是很快的,开始时,先按照老师的要求,写规范,确定实现方案,然后在逐一细化,一步一步按照要求去完成整个设计。本次设计要用quartusII软件,由于之前对此软件不是太熟悉所以导致了一些错误和问题的发生,所以这次课程设计中认真学习了quartusII软件的具体使用步骤和操作流程,对所有可能出现的问题进行逐一攻破。通过这次实验,我不但熟悉了quartusI

10、I软件,也了解了开发的最基本流程和方法,也进一步加深了对Verilog编程语言的理解,最重要的是锻炼了我独立思考和分析的逻辑能力,通过从顶向下的设计方法,一步步实现,然后将整个设计串套起来,是我对设计的流程以及编程有了很大的提高。通过此次硬件课程设计,使我越来越认识到一点,编程对项目实现有着至关重要的作用,我们在硬件开发的过程中必须重视编程,将编程看作是完善开发的不可缺少的一部分。在一次次的反复设计、论证和测试中,不仅提高了逻辑分析能力、全面分析问题的能力,还提升了发现问题、解决问题的能力。虽然设计过程比较繁琐,大大小小也出现了许多问题,但这却磨练了我的意志。通过各方面的学习,使我的知识面进一

11、步拓宽了。同时,通过本次课程设计,使我也发现了自己的不足,例如:逻辑分析能力不突出,编程能力不足,解决问题的能力不足,使我认识到在以后的学习中在这些方面要多努力,加以改进,提升自我能力。我相信通过这次课程设计的学习,对我以后有着十分重要的影响和作用。附代码:module dianziqin(inclk,outclk,key1,key2,key3,key4,key5,key6,key7,key8,key9,num);input inclk;input key1,key2,key3,key4,key5,key6,key7,key8,key9;output outclk;output7:0num;r

12、eg 7:0 num;reg outclk,clk_6M;reg 3:0c;wire out1,out2,out3,out4;wire8:0 key;reg 1:0mm;assign key = key1,key2,key3,key4,key5,key6,key7,key8,key9; /由按键拼键为变量key /调用子调块digital_piano m1( .inclk(inclk), .key1(key1), .key2(key2), .key3(key3), .key4(key4), .key5(key5), .key6(key6), .key7(key7), .beep4(out4)

13、);bell m2(.inclk(inclk),.beep1(out1);bell2 m3( .inclk(inclk), .beep2(out2);bell3 m4(.inclk(inclk),.beep3(out3);always(posedge inclk) begin if(c4d8) c=c+4d1; else begin c = 4d0; clk_6M = clk_6M; endendalways (posedge clk_6M) /在时钟的上升沿检测是否有按键按下beginif(key = 9b)mm = 2b01;else if(key=9b)mm = 2b10;else if

14、(key=9b)mm = 2b11;else mm = 2b00;end always(mm)begin case(mm)2b01:num=8b;2b10:num=8b;2b11:num=8b;default:num=8b;endcaseendalways (mm) /按键响应beginif(mm = 2b01) outclk = out1;else if(mm = 2b10) outclk = out2;else if(mm = 2b11) outclk = out3;else outclk = out4;endendmodule/digital_piano子模块module digital

15、_piano(inclk,key1,key2,key3,key4,key5,key6,key7,beep4);input inclk,key1,key2,key3,key4,key5,key6,key7;output beep4; wire 6:0 key_code;reg 3:0 c;reg clk_6M; reg beep_r;reg 15:0 count;reg 15:0 count_end;parameter Do = 7b, re = 7b, mi = 7b, fa = 7b, so = 7b, la = 7b, si = 7b;assign key_code = key7,key6

16、,key5,key4,key3,key2,key1;assign beep4 = beep_r; /输出音乐always(posedge inclk) begin if(c4d8) c=c+4d1; else begin c = 4d0; clk_6M = clk_6M; endendalways(posedge clk_6M) /分频模块,得出乐谱begincount = count + 16d1; /计数器加1if(count = count_end)begincount =16d0; /计数器清零beep_r = !beep_r; endendalways(posedge clk_6M)

17、 /状态机,根据按键状态,选择不同的音符输出begincase(key_code)Do: count_end = 16d11450;re: count_end = 16d10204;mi: count_end = 16d09090;fa: count_end = 16d08571;so: count_end = 16d07802;la: count_end = 16d06802;si: count_end = 16d06060;default:count_end = 16d0;endcaseendendmodule/bell子模块 两只老虎module bell(inclk,beep1);in

18、put inclk; /系统时钟output beep1; /蜂鸣器输出端reg 3:0high,med,low;reg 15:0origin;reg beep_r; /寄存器reg 7:0state; reg 15:0count;assign beep1=beep_r; /输出音乐/时钟频率6MHzreg clk_6MHz;reg 2:0 cnt1; always(posedge inclk)begin if(cnt13d8) cnt1=cnt1+3b1; else begin cnt1=3b0; clk_6MHz=clk_6MHz; endend/时钟频率4MHzreg clk_4Hz;r

19、eg 24:0 cnt2; always(posedge inclk)begin if(cnt225d)/ cnt2=cnt2+25b1; else begin cnt2=25b0; clk_4Hz=clk_4Hz; endendalways (posedge clk_6MHz)begincount = count + 1b1; /计数器加1if(count = origin)begincount = 16h0; /计数器清零beep_r = !beep_r; /输出取反endendalways(posedge clk_4Hz)begincase(high,med,low)12b0:origi

20、n=11466;/mid112b0:origin=10216;/mid212b0:origin=9101; /mid312b0:origin=8590; /mid412b0:origin=7653; /mid512b0:origin=6818; /mid612b1:origin=14447;/low5endcaseendalways (posedge clk_4Hz)/歌曲beginif(state =63) state = 0;/计时,以实现循环演奏elsestate = state + 1;case(state)0,1: high,med,low=12b0;/mid12,3:high,me

21、d,low=12b0;/mid24,5:high,med,low=12b0;/mid36,7:high,med,low=12b0;/mid18,9: high,med,low=12b0;/mid110,11:high,med,low=12b0;/mid212,13:high,med,low=12b0;/mid314,15:high,med,low=12b0;/mid116,17:high,med,low=12b0;/mid318,19: high,med,low=12b0;/mid420,21,22,23: high,med,low=12b0;/mid524,25:high,med,low=1

22、2b0;/mid326,27: high,med,low=12b0;/mid428,29,30,31: high,med,low=12b0;/mid532: high,med,low=12b0;/mid533: high,med,low=12b0;/mid634:high,med,low=12b0;/mid535:high,med,low=12b0;/mid436,37:high,med,low=12b0;/mid338,39:high,med,low=12b0;/mid140:high,med,low=12b0;/mid541: high,med,low=12b0;/mid642:high,

23、med,low=12b0;/mid543:high,med,low=12b0;/mid444,45:high,med,low=12b0;/mid346,47:high,med,low=12b0;/mid148,49:high,med,low=12b0;/mid250,51:high,med,low=12b1;/low552,53,54,55: high,med,low=12b0;/mid156,56:high,med,low=12b0;/mid257,58:high,med,low=12b1;/low559,60,61,62,63: high,med,low=12b0;/mid1default

24、 : high,med,low=12bx;endcaseendendmodule/bell2子模块康定情歌module bell2 (inclk,beep2);input inclk; /系统时钟output beep2; /蜂鸣器输出端reg 3:0high,med,low;reg 15:0origin;reg beep_r; /寄存器reg 7:0state; reg 15:0count;assign beep2=beep_r; /输出音乐/时钟频率6MHzreg clk_6MHz;reg 2:0 cnt1; always(posedge inclk)begin if(cnt13d8) /

25、8 cnt1=cnt1+3b1; else begin cnt1=3b0; clk_6MHz=clk_6MHz; endend/时钟频率4MHzreg clk_4Hz;reg 24:0 cnt2; always(posedge inclk)begin if(cnt225d)/ cnt2=cnt2+25b1; else begin cnt2=25b0; clk_4Hz=clk_4Hz; endendalways (posedge clk_6MHz)begincount = count + 1b1; /计数器加1if(count = origin)begincount = 16h0; /计数器清零

26、beep_r = !beep_r; /输出取反endendalways(posedge clk_4Hz)begincase(high,med,low) b1:origin=22900; /低1 b0:origin=20408; /低2 b1:origin=18181; /低3b1:origin=15267; /低5 b0:origin=13605; /低6b1:origin=11472; /中1b0:origin=10216; /中2b0:origin=9101; /中3b0:origin=7653; /中5b0:origin=6818; /中6b0:origin=5733; /高1b0:or

27、igin=5108; /高2b0:origin=4551; /高3endcaseendalways (posedge clk_4Hz)beginif(state =103) state = 0;elsestate = state + 1; /康定情歌case(state)0,1: high,med,low=b0;/中32,3: high,med,low=b0;/中54,5: high,med,low=b0;/中66: high,med,low=b0;/中67: high,med,low=b0;/中58,9,10: high,med,low=b0;/中611: high,med,low=b0;/

28、中312,13,14,15: high,med,low=b0;/中216,17: high,med,low=b0;/中318,19: high,med,low=b0;/中520,21: high,med,low=b0;/中622: high,med,low=b0;/中623: high,med,low=b0;/中524,25: high,med,low=b0;/中626,27,28,29,30,31:high,med,low=b0;/中332,33: high,med,low=b0;/中334,35: high,med,low=b0;/中536,37: high,med,low=b0;/中63

29、8: high,med,low=b0;/中639: high,med,low=b0;/中540,41,42: high,med,low=b0;/中643: high,med,low=b0;/中344,45,46,47: high,med,low=b0;/中248,49: high,med,low=b1;/中550,51: high,med,low=b0;/中352: high,med,low=b0;/中253: high,med,low=b0;/中354: high,med,low=b0;/中255: high,med,low=b1;/156,57: high,med,low=b0;/中258

30、,59,60,61,62,63:high,med,low=b0;/低664,65: high,med,low=b0;/中6 66,67,68,69,70,71:high,med,low=b0;/中272,73: high,med,low=b1;/中574,75,76,77,78,79:high,med,low=b0;/中380: high,med,low=b0;/中281: high,med,low=b1;/182,83,84,85,86,87:high,med,low=b0;/中688,89: high,med,low=b1;/中590,91: high,med,low=b0;/中392:

31、high,med,low=b0;/中293: high,med,low=b0;/中394: high,med,low=b0;/中295: high,med,low=b1;/196,97: high,med,low=b0;/中298,99,100,101,102,103:high,med,low=b0;/中6endcaseendendmodule/bell3子模块天空之城module bell3 (inclk,beep3);input inclk; /系统时钟output beep3; /蜂鸣器输出端reg 3:0high,med,low;reg 15:0origin;reg beep_r; /

32、寄存器reg 7:0state; reg 15:0count;assign beep3=beep_r; /输出音乐/时钟频率6MHzreg clk_6MHz;reg 2:0 cnt1; always(posedge inclk)begin if(cnt13d8) cnt1=cnt1+3b1; else begin cnt1=3b0; clk_6MHz=clk_6MHz; endend/时钟频率4MHzreg clk_4Hz;reg 24:0 cnt2; always(posedge inclk)begin if(cnt225d)/ cnt2=cnt2+25b1; else begin cnt2

33、=25b0; clk_4Hz=clk_4Hz; endendalways (posedge clk_6MHz)begincount = count + 1b1; /计数器加1if(count = origin)begincount = 16h0; /计数器清零beep_r = !beep_r; /输出取反endendalways(posedge clk_4Hz)begincase(high,med,low) b1:origin=22900; /低1 b0:origin=20408; /低2 b1:origin=18181; /低3 b0:origin=17142; /低4b1:origin=1

34、5267; /低5b0:origin=13605; /低6b1:origin=12121; /低7b1:origin=11472; /中1b0:origin=10216; /中2b0:origin=9101; /中3b0:origin=8571; /中4b0:origin=7653; /中5b0:origin=6818; /中6b0:origin=6060; /中7b0:origin=5733; /高1b0:origin=5108; /高2b0:origin=4551; /高3b0:origin=4294; /高4b0:origin=3826; /高5b0:origin=3409; /高6b0

35、:origin=3050; /高7endcaseendalways (posedge clk_4Hz)beginif(state =195)state = 0;elsestate = state + 1; /kang ding qing gecase(state)0:high,med,low=b0;/中61: high,med,low=b0;/中72,3,4:high,med,low=b0;/高15:high,med,low=b0;/中76,7: high,med,low=b0;/高18,9:high,med,low=b0;/高310,11,12,13,14,15: high,med,low=

36、b0;/中716,17: high,med,low=b0;/中318,19,20:high,med,low=b0;/中621: high,med,low=b0;/中522,23: high,med,low=b0;/中624,25:high,med,low=b1;/中126,27,28,29,30,31: high,med,low=b0;/中5 32: high,med,low=b0;/中333: high,med,low=b0;/中334,35,36:high,med,low=b0;/中437: high,med,low=b0;/中338: high,med,low=b0;/中439,40,4

37、1:high,med,low=b0;/高142,43,44: high,med,low=b0;/中345,46,47:high,med,low=b0;/高148,49,50:high,med,low=b0;/中751,52,53: high,med,low=b0;/中454,55,56,57,58,59,60,61: high,med,low=b0;/中762:high,med,low=b0;/中663: high,med,low=b0;/中764,65,66:high,med,low=b0;/高167:high,med,low=b0;/高768,69:high,med,low=b0;/高170,71:high,med,low=b0;/高372,73,74:high,med,low=b0;/中775,76:high,med,low=b0;/中3 77,78,79: high,med,low=b0;/中680:high,med,low=b1;/中581,82:high,med,low=b0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论