《基于某FPGA地多功能电子琴设计与实现.doc》由会员分享,可在线阅读,更多相关《基于某FPGA地多功能电子琴设计与实现.doc(20页珍藏版)》请在课桌文档上搜索。
1、基于FPGA的多功能电子琴的设计与实现摘要:随着科学技术的日新月异,人们的生活也在发生在变化,电子产品也随之增多,比如现在流行的电子琴,已经逐渐代替了曾经的手动风琴了。文章中所介绍的多功能电子琴的设计在Quartus II平台上,采用Verilog HDL语言和模块化的设计方法,设计出一个能够通过按键控制不同的音符,同时也可以通过按键进展演奏已经存储的曲子的多功能电子琴。本系统主要由五个个模块组成:顶层模块,曲目1模块,曲目2模块,按键模块,曲目循环播放模块。关键词: FPGA; 电子琴; Verilog HDL;音符FPGA-based design and implementation o
2、f multi-organAbstract:With the development of science and technology,also occurs in peoples lives change, electronic products also increase, such as the now popular organ, has replaced the former manual organ. Multifunction keyboard design as described in the article on the Quartus II platform, usin
3、g Verilog HDL language and modular design method, design a button control through different note, you can also play music already stored by keys multifunction keyboard. The system consists of five modules: the top-level module, a module tracks, track 2 modules, key module, track loop module.Key word
4、s:FPGA, Keyboard, Verilog HDL, Note一、设计目的和意义目的:1.1、在掌握计算机组成原理理论相关的根底上,了解 EDA技术,掌握 Verilog HDL 硬件描述语言的设计方法和思想;1.2、培养综合运用知识和独立开展实践创新的能力;1.3、深入学习Verilog HDL,了解其编程环境;1.4、学会运用Quartus II等编程仿真软件;1.5将硬件语言编程与硬件实物功能演示相结合,加深理解Verilog HDL的学习。意义:电子琴由于操作相比照拟简单,并且能够模拟几乎所有传统乐器的音色,因而深受广阔消费者的喜爱。近年来,在数字系统的设计领域融入了一种新型的
5、设计技术:数字系统设计的自动化技术EDAElectronic Design Automation。该技术优越之处在于系统设计的效率高、某某性强、集成度好、易于修改和实现等。因此,一跃成为当下数字系统设计领域的主流技术,并被越来越广泛地应用到相关领域中,其中,被应用到电子琴的设计与实现中去就是一个相当重要的尝试与应用。二、控制要求2.1、软件:Quartus II等编程仿真软件;2.2、硬件:FPGA开发板。三、设计方案论证方案一:采用单片机实现,通过软件编程,仿真后将程序用编程器写入到单片机芯片上,该方案本钱低,稳定度也比拟好,但外围电路多,特别是播放音乐时需要用到大容量的外部存储器,这样就增
6、加了编程难度,调试不够直观,也不够灵活方便。 方案二:采用可编程逻辑器件FPGA制作,将所有器件集成在一块芯片上,大大减小了电子琴的体积,用Verilog HDL编程实现时更加方便,而且易于进展功能扩展,并可调试仿真。 综上,本次课程设计选择方案二四、系统设计1、总体实现方案:简易电子琴的设计通过软硬件结合实现,硬件系统包括主控器芯片、9个按键、蜂鸣器等,软件资源包括编写Verilog HDL程序的仿真软件Quartus II。电子琴有按键代替琴键的弹奏功能、自动播放功能、循环播放功能。整个程序总共分5个模块:顶层模块,曲目1:bell模块,曲目2:bell2模块,按键模块:buzzer,曲目
7、循环播放模块:bell_bell2,整个方案总共用了9个按键k2-k8,按键k2-k8作为琴键,通过这七个按键键入不同的音阶。主模块中k9、k10两个按键用于选择是自动播放还是弹奏曲目,令mm=k10、k9,用mm值的不同选择调用不同模块。如果mm=11,如此程序调用按键模块;如果mm=01,如此调用曲目1模块,播放曲目1;如果mm=10,如此调用曲目2模块,播放曲目2;如果mm=00,如此调用循环模块。2、原理框图 顶层模块K2 buzzer模块| beep3K8inclkK2|K8out3K9K10 bell模块inlck beep1out1inclkoutclk bell2模块Inclk
8、 beep2out2bell_bell2模块inclk beep4out49个按键:k2-k10;k2-k8控制按键buzzer模块,k10、k9是选择按键,当k10k9=11,选择buzzer模块,输出out3;当k10k9=01,选择bell模块,输出out1;当k10k9=10,选择bell2模块,输出out2;当k10k9=00,选择bell_bell2模块,输出out4。3、输入输出电子琴时钟inclk输出outclk按键k2-k104、音符与音频乐曲中不同的音符实质上表示的是不同频率的声音。只要产生不同频率的脉冲,再通过喇叭等播放出来即可。又由于方波容易用定时器产生,故使用方波脉冲
9、。4.1要产生音频脉冲:1、算出某一音频的脉冲的周期1/频率2、然后将此周期除以2,即为半周期的时间。3、利用定时器,计时这个半周期的时间,每当计时到后,就将输出脉冲的I/O反相。4、重复计时此半周期的时间再对I/O反相,就可以在I/O脚上得到此频率的脉冲。例如,频率为523Hz,其周期为1/523S=1912uS,因此只要令计数器计时956,在每计数956次时就将I/O反接,就可得到中音Do532Hz。音阶频率/Hz周期/us半周期/us分频数中音1523191295611472257816848421038036591518759910446981432716859557841276638
10、7653688011365686818798810125066073五、设计结果与分析仿真结果;设置输入信号k2-k10为低电平有效,因此,当不按下按键时,所有的按键均为高电平。此时k10key9=11,即mm=11,即在按键模块,输出out3连接输出端outclk;当按下k10时,即mm=01,此时选择曲目1模块,输出out1连接到输出端outclk;当按下k9时,即mm=10,此时选择曲目2模块,输出out2连接输出端outclk;当同时按下k9k10时,输出out4连接输出端outclk。5.3.1硬件测试结果: 在时序验证后下载,通过硬件测试,实验达到预期效果,当mmk10-k9=11
11、时,通过k2-k8这7个按键的键入蜂鸣器可以发出Do、re、mi、fa、so、la、xi的七个音阶的音,即表示了电子琴的按键弹奏功能;当mm=01时,播放了第一首歌;mm=10时,播放了第二首歌;当mm=00时,循环播放。通过硬件的测试,所有的设计目标均实现。5.3.2对结果和结论的问题讨论:实验过程中,程序刚一下载,蜂鸣器就开始发声音,后来,经过查证,蜂鸣器的驱动是低电平有效,因此,最开始时,将蜂鸣器初始化为高电平。实验结果中七个音节的区分不是特别明显,因为音节的频率都相差不是很大。完毕语通过这近一个月天的学习和努力,让我收获颇多。刚开始的时候还不知道如何下手,并且对所用的软件Quartus
12、不熟悉,因为之前所用的软件是Xilinx ISE,但是通过一次次的努力和摸索,发现其实这两款软件还是有很多共同的地方,自己对新的软件应用也越来越得心应手了。此外,在这次的课程设计中,我越来越认识到一点,编程对项目实现有着至关重要的作用,我们在硬件开发的过程中必须重视编程,将编程看作是完善开发的不可缺少的一局部。在一次次的反复设计、论证和测试中,不仅提高了逻辑分析能力、全面分析问题的能力,还提升了发现问题、解决问题的能力,不懂的地方在经过思考还是无果的情况下,就要向他人请教了,他人一点小小的点拨,会为你带来灵感,这也将是问题的解决方法。虽然设计过程比拟繁琐,大大小小也出现了许多问题,但这却磨练了
13、我的意志。通过各方面的学习,使我的知识面进一步拓宽了。通过这次课程设计,我不但熟悉了quartusII软件,也了解了开发的最根本流程和方法,也进一步加深了对Verilog HDL编程语言的理解,最重要的是锻炼了我独立思考和分析的逻辑能力,通过至顶向下的设计方法,一步步实现,然后将整个设计串套起来,是我对设计的流程以与编程有了很大的提高。同时,通过本次课程设计,我也发现了自己的不足,例如:逻辑分析能力不突出,编程能力不足,解决问题的能力不足,不是特别细心,这些使我认识到在以后的学习中在这些方面要多加努力,加以改良,提升自我能力。我相信通过这次课程设计的学习,对我以后的学习和工作都有着十分重要的影
14、响和作用。参考文献递增引用,引用相关内容【1】 X桂华. 基于FPGA的现代数字系统设计. 某某电子科技大学 第1-101页【2】 袁海林. 基于FPGA的具有存储功能的电子琴的设计J. 中国信息科技,2007.19:88-89【3】曹曼. 基于FPGA的电子琴设计. 科技传播, 2012-03-08【4】 X亮. 基于FPGA的电子琴的设计J. 电子技术,2007,2【5】华某某见嵌入式培训中心编著 FPGA应用开发入门与典型实例 人民邮电第145-161页附录程序、电路图等1、顶层模块程序:module dianziqin(inclk,outclk,k2,k3,k4,k5,k6,k7,k8
15、,k9,k10);input inclk;input k2,k3,k4,k5,k6,k7,k8,k9,k10;output outclk;reg outclk,clk_6M;reg 3:0c;wire out1,out2,out3;wire1:0 key;reg 1:0mm;assign key = k10,k9; /由按键拼键为变量key /调用子调块buzzer m1( .inclk(inclk), .k2(k2), .k3(k3), .k4(k4), .k5(k5), .k6(k6), .k7(k7), .k8(k8), .beep3(out3) );bell m2(.inclk(inc
16、lk),.beep1(out1);bell2 m3( .inclk(inclk), .beep2(out2);bell_bell2 m4(.inclk(inclk), .beep4(out4) );always(posedge inclk) begin if(c4d8) c=c+4d1; else begin c = 4d0; clk_6M = clk_6M; endendalways (posedge clk_6M) /在时钟的上升沿检测是否有按键按下beginif(key = 2b01)mm = 2b01;else if(key=2b10)mm = 2b10;else if(key=2b1
17、1)mm = 2b11;else if(key=2b00) mm = 2b00;else mm=2bzz;end always (mm) /按键响应beginif(mm = 2b01) outclk = out1;else if(mm = 2b10) outclk = out2;else if (mm=2b11) outclk = out3; else if (mm=2b00)outclk=out4;else outclk=0;endendmodule2、按键模块:module buzzer(inclk,k2,k3,k4,k5,k6,k7,k8,beep3);input inclk, k2,k
18、3,k4,k5,k6,k7,k8;output beep3; 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 = 7b1111110;re = 7b1111101;mi = 7b1111011;fa = 7b1110111;so = 7b1101111;la = 7b1011111;si = 7b0111111;assign key_code =k8,k7,k6,k5,k4,k3,k2;assign beep3 = beep_r; /输出音乐alw
19、ays(posedge inclk) begin if(c4d8) c=c+4d1; else begin c = 4d0; clk_6M = clk_6M; endendalways(posedge clk_6M) /分频模块,得出乐谱begincount = count + 16d1;if (count_end=0) beep_r=1; /计数器加1else if(count = count_end)begincount =16d0; /计数器清零beep_r = !beep_r; endendalways(posedge clk_6M) /状态机,根据按键状态,选择不同的音符输出begi
20、ncase(key_code)Do: count_end = 16d3822;re: count_end = 16d3405;mi: count_end = 16d3034;fa: count_end = 16d2865;so: count_end = 16d7802;la: count_end = 16d6802;si: count_end = 16d6060;default:count_end = 16h0;endcaseendendmodule3、曲目1模块:module bell(inclk,beep1);input inclk; /系统时钟output beep1; /蜂鸣器输出端r
21、eg 3:0high,med,low;reg 15:0origin;reg beep_r; /存放器reg 7:0state; reg 15:0count;assign beep1=beep_r; /输出音乐reg clk_6MHz; /时钟频率6MHzreg 2:0 t1; always(posedge inclk)begin if(t13d8) t1=t1+3b1; else begin t1=3b0; clk_6MHz=clk_6MHz; endendreg clk_4Hz; /时钟频率4Hzreg 24:0 t2; always(posedge inclk)begin if(t225d
22、13000000)/ t2=t2+25b1; else begin t2=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)12b000000010000:origin=11466;/mid112b000000100000:origin=10
23、216;/mid212b000000110000:origin=9101; /mid312b000001000000:origin=8590; /mid412b000001010000:origin=7653; /mid512b000001100000:origin=6818; /mid612b000000000101:origin=14447;/low5endcaseendalways (posedge clk_4Hz)/歌曲1beginif(state =63) state = 0;/计时,以实现循环演奏elsestate = state + 1;case(state)0,1: high,
24、med,low=12b000000010000;/mid12,3:high,med,low=12b000000100000;/mid24,5:high,med,low=12b000000110000;/mid36,7:high,med,low=12b000000010000;/mid18,9: high,med,low=12b000000010000;/mid110,11:high,med,low=12b000000100000;/mid212,13:high,med,low=12b000000110000;/mid314,15:high,med,low=12b000000010000;/mi
25、d116,17:high,med,low=12b000000110000;/mid318,19: high,med,low=12b000001000000;/mid420,21,22,23: high,med,low=12b000001010000;/mid524,25:high,med,low=12b000000110000;/mid326,27: high,med,low=12b000001000000;/mid428,29,30,31: high,med,low=12b000001010000;/mid532: high,med,low=12b000001010000;/mid533:
26、high,med,low=12b000001100000;/mid634:high,med,low=12b000001010000;/mid535:high,med,low=12b000001000000;/mid436,37:high,med,low=12b000000110000;/mid338,39:high,med,low=12b000000010000;/mid140:high,med,low=12b000001010000;/mid541:high,med,low=12b000001100000;/mid642:high,med,low=12b000001010000;/mid54
27、3:high,med,low=12b000001000000;/mid444,45:high,med,low=12b000000110000;/mid346,47:high,med,low=12b000000010000;/mid148,49:high,med,low=12b000000100000;/mid250,51:high,med,low=12b000000000101;/low552,53,54,55:high,med,low=12b000000010000;/mid156,56:high,med,low=12b000000100000;/mid257,58:high,med,low
28、=12b000000000101;/low559,60,61,62,63:high,med,low=12b000000010000;/mid1default : high,med,low=12bx;endcaseendendmodule4、曲目2模块: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; /输出音乐/时钟
29、频率6MHzreg clk_6MHz;reg 2:0 t1; always(posedge inclk)begin if(t13d8) t1=t1+3b1; else begin t1=3b0; clk_6MHz=clk_6MHz; endend/时钟频率4MHzreg clk_4Hz;reg 24:0 t2; always(posedge inclk)begin if(t225d13000000)/ t2=t2+25b1; else begin t2=25b0; clk_4Hz=clk_4Hz; endendalways (posedge clk_6MHz)begincount = coun
30、t + 1b1; /计数器加1if(count = origin)begincount = 16h0; /计数器清零beep_r = !beep_r; /输出取反endendalways(posedge clk_4Hz)begincase(high,med,low)b000000000001:origin=22900; /低1b000000000010:origin=20408; /低2b000000000011:origin=18181; /低3b000000000100:origin=17142; /低4b000000000101:origin=15267; /低5b00000000011
31、0:origin=13605; /低6b000000000111:origin=12121; /低7b000000000111:origin=11472; /中1b000000100000:origin=10216; /中2b000000110000:origin=9101; /中3b000000111000:origin=8571; /中4b000001010000:origin=7653; /中5b000001100000:origin=6818; /中6b000010000000:origin=6060; /中7b000100000000:origin=5733; /高1b0010000
32、00000:origin=5108; /高2b001100000000:origin=4551; /高3b001010000000:origin=4294; /高4endcaseendalways (posedge clk_4Hz)beginif(state =195)state = 0;elsestate = state + 1; /kang ding qing gecase(state)0: high,med,low=b000001100000;/中61: high,med,low=b000010000000;/中72,3,4: high,med,low=b000100000000;/高1
33、5: high,med,low=b000010000000;/中76,7: high,med,low=b000100000000;/高18,9: high,med,low=b001100000000;/高310,11,12,13,14,15: high,med,low=b000010000000;/中716,17: high,med,low=b000000110000;/中318,19,20: high,med,low=b000001100000;/中621: high,med,low=b000001010000;/中522,23: high,med,low=b000001100000;/中6
34、24,25: high,med,low=b000000000111;/中126,27,28,29,30,31: high,med,low=b000001010000;/中5 32: high,med,low=b000000110000;/中333: high,med,low=b000000110000;/中334,35,36: high,med,low=b000000111000;/中437: high,med,low=b000000110000;/中338: high,med,low=b000000111000;/中439,40,41: high,med,low=b000100000000;
35、/高142,43,44: high,med,low=b000000110000;/中345,46,47: high,med,low=b000100000000;/高148,49,50: high,med,low=b000010000000;/中751,52,53: high,med,low=b000000111000;/中454,55,56,57,58,59,60,61: high,med,low=b000010000000;/中762: high,med,low=b000001100000;/中663: high,med,low=b000010000000;/中764,65,66: high
36、,med,low=b000100000000;/高167:68,69: high,med,low=b000100000000;/高170,71: high,med,low=b001100000000;/高372,73,74: high,med,low=b000010000000;/中775,76: high,med,low=b000000110000;/中377,78,79: high,med,low=b000001100000;/中680: high,med,low=b000000000101;/中581,82: high,med,low=b000001100000;/中683,84: hi
37、gh,med,low=b000000000111;/中185,86,87,88,89,90: high,med,low=b000001010000;/中5 91: high,med,low=b000000110000;/中392: high,med,low=b000000110000;/中393,94: high,med,low=b000000111000;/中4 95: high,med,low=b000100000000;/高196,97,98: high,med,low=b000010000000;/中799,100: high,med,low=b000100000000;/高1101,
38、102: high,med,low=b001000000000;/高2103: high,med,low=b001100000000;/高3104,105,106,107,108,109: high,med,low=b000100000000;/高1110: high,med,low=b000010000000;/中7111,112: high,med,low=b000001100000;/中6113,114: high,med,low=b000010000000;/中7115,116: high,med,low=b000001010000;/中5117,118,119,120,121,122: high,med,low=b000001100000;/中6123,124: high,med,low=b000000000111;/中1125: high,med,low=b001000000000;/高2126,127,128: high,med,low=b001100000000;/高3129: high,med,low=b001000000000;/高2130,131: high,med,low=b001100000000;/高3134,135,136,137,13