欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOC文档下载  

    基于某FPGA地多功能电子琴设计与实现.doc

    • 资源ID:16145       资源大小:371.55KB        全文页数:20页
    • 资源格式: DOC        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    基于某FPGA地多功能电子琴设计与实现.doc

    基于FPGA的多功能电子琴的设计与实现摘要:随着科学技术的日新月异,人们的生活也在发生在变化,电子产品也随之增多,比如现在流行的电子琴,已经逐渐代替了曾经的手动风琴了。文章中所介绍的多功能电子琴的设计在Quartus II平台上,采用Verilog HDL语言和模块化的设计方法,设计出一个能够通过按键控制不同的音符,同时也可以通过按键进展演奏已经存储的曲子的多功能电子琴。本系统主要由五个个模块组成:顶层模块,曲目1模块,曲目2模块,按键模块,曲目循环播放模块。关键词: FPGA; 电子琴; Verilog HDL;音符FPGA-based design and implementation of multi-organAbstract:With the development of science and technology,also occurs in people's 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, using 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 words:FPGA, Keyboard, Verilog HDL, Note一、设计目的和意义目的:1.1、在掌握计算机组成原理理论相关的根底上,了解 EDA技术,掌握 Verilog HDL 硬件描述语言的设计方法和思想;1.2、培养综合运用知识和独立开展实践创新的能力;1.3、深入学习Verilog HDL,了解其编程环境;1.4、学会运用Quartus II等编程仿真软件;1.5将硬件语言编程与硬件实物功能演示相结合,加深理解Verilog HDL的学习。意义:电子琴由于操作相比照拟简单,并且能够模拟几乎所有传统乐器的音色,因而深受广阔消费者的喜爱。近年来,在数字系统的设计领域融入了一种新型的设计技术:数字系统设计的自动化技术EDAElectronic Design Automation。该技术优越之处在于系统设计的效率高、某某性强、集成度好、易于修改和实现等。因此,一跃成为当下数字系统设计领域的主流技术,并被越来越广泛地应用到相关领域中,其中,被应用到电子琴的设计与实现中去就是一个相当重要的尝试与应用。二、控制要求2.1、软件:Quartus II等编程仿真软件;2.2、硬件:FPGA开发板。三、设计方案论证方案一:采用单片机实现,通过软件编程,仿真后将程序用编程器写入到单片机芯片上,该方案本钱低,稳定度也比拟好,但外围电路多,特别是播放音乐时需要用到大容量的外部存储器,这样就增加了编程难度,调试不够直观,也不够灵活方便。 方案二:采用可编程逻辑器件FPGA制作,将所有器件集成在一块芯片上,大大减小了电子琴的体积,用Verilog HDL编程实现时更加方便,而且易于进展功能扩展,并可调试仿真。 综上,本次课程设计选择方案二四、系统设计1、总体实现方案:简易电子琴的设计通过软硬件结合实现,硬件系统包括主控器芯片、9个按键、蜂鸣器等,软件资源包括编写Verilog HDL程序的仿真软件Quartus II。电子琴有按键代替琴键的弹奏功能、自动播放功能、循环播放功能。整个程序总共分5个模块:顶层模块,曲目1:bell模块,曲目2:bell2模块,按键模块:buzzer,曲目循环播放模块: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 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、音符与音频乐曲中不同的音符实质上表示的是不同频率的声音。只要产生不同频率的脉冲,再通过喇叭等播放出来即可。又由于方波容易用定时器产生,故使用方波脉冲。4.1要产生音频脉冲:1、算出某一音频的脉冲的周期1/频率2、然后将此周期除以2,即为半周期的时间。3、利用定时器,计时这个半周期的时间,每当计时到后,就将输出脉冲的I/O反相。4、重复计时此半周期的时间再对I/O反相,就可以在I/O脚上得到此频率的脉冲。例如,频率为523Hz,其周期为1/523 S=1912uS,因此只要令计数器计时956,在每计数956次时就将I/O反接,就可得到中音Do532Hz。音阶频率/Hz周期/us半周期/us分频数中音15231912956114722578168484210380365915187599104469814327168595578412766387653688011365686818798810125066073五、设计结果与分析仿真结果;设置输入信号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时,通过k2-k8这7个按键的键入蜂鸣器可以发出Do、re、mi、fa、so、la、xi的七个音阶的音,即表示了电子琴的按键弹奏功能;当mm=01时,播放了第一首歌;mm=10时,播放了第二首歌;当mm=00时,循环播放。通过硬件的测试,所有的设计目标均实现。5.3.2对结果和结论的问题讨论:实验过程中,程序刚一下载,蜂鸣器就开始发声音,后来,经过查证,蜂鸣器的驱动是低电平有效,因此,最开始时,将蜂鸣器初始化为高电平。实验结果中七个音节的区分不是特别明显,因为音节的频率都相差不是很大。完毕语通过这近一个月天的学习和努力,让我收获颇多。刚开始的时候还不知道如何下手,并且对所用的软件Quartus不熟悉,因为之前所用的软件是Xilinx ISE,但是通过一次次的努力和摸索,发现其实这两款软件还是有很多共同的地方,自己对新的软件应用也越来越得心应手了。此外,在这次的课程设计中,我越来越认识到一点,编程对项目实现有着至关重要的作用,我们在硬件开发的过程中必须重视编程,将编程看作是完善开发的不可缺少的一局部。在一次次的反复设计、论证和测试中,不仅提高了逻辑分析能力、全面分析问题的能力,还提升了发现问题、解决问题的能力,不懂的地方在经过思考还是无果的情况下,就要向他人请教了,他人一点小小的点拨,会为你带来灵感,这也将是问题的解决方法。虽然设计过程比拟繁琐,大大小小也出现了许多问题,但这却磨练了我的意志。通过各方面的学习,使我的知识面进一步拓宽了。通过这次课程设计,我不但熟悉了quartusII软件,也了解了开发的最根本流程和方法,也进一步加深了对Verilog HDL编程语言的理解,最重要的是锻炼了我独立思考和分析的逻辑能力,通过至顶向下的设计方法,一步步实现,然后将整个设计串套起来,是我对设计的流程以与编程有了很大的提高。同时,通过本次课程设计,我也发现了自己的不足,例如:逻辑分析能力不突出,编程能力不足,解决问题的能力不足,不是特别细心,这些使我认识到在以后的学习中在这些方面要多加努力,加以改良,提升自我能力。我相信通过这次课程设计的学习,对我以后的学习和工作都有着十分重要的影响和作用。参考文献递增引用,引用相关内容【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,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(inclk),.beep1(out1);bell2 m3( .inclk(inclk), .beep2(out2);bell_bell2 m4(.inclk(inclk), .beep4(out4) );always(posedge inclk) begin if(c<4'd8) c<=c+4'd1; else begin c <= 4'd0; clk_6M <= clk_6M; endendalways (posedge clk_6M) /在时钟的上升沿检测是否有按键按下beginif(key = 2'b01)mm <= 2'b01;else if(key=2'b10)mm <= 2'b10;else if(key=2'b11)mm <= 2'b11;else if(key=2b00) mm <= 2'b00;else mm<=2bzz;end always (mm) /按键响应beginif(mm = 2'b01) outclk <= out1;else if(mm = 2'b10) outclk <= out2;else if (mm=2'b11) 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,k3,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 = 7'b1111110;re = 7'b1111101;mi = 7'b1111011;fa = 7'b1110111;so = 7'b1101111;la = 7'b1011111;si = 7'b0111111;assign key_code =k8,k7,k6,k5,k4,k3,k2;assign beep3 = beep_r; /输出音乐always(posedge inclk) begin if(c<4'd8) c<=c+4'd1; else begin c <= 4'd0; clk_6M <= clk_6M; endendalways(posedge clk_6M) /分频模块,得出乐谱begincount <= count + 16'd1;if (count_end=0) beep_r<=1; /计数器加1else if(count = count_end)begincount <=16'd0; /计数器清零beep_r <= !beep_r; endendalways(posedge clk_6M) /状态机,根据按键状态,选择不同的音符输出begincase(key_code)Do: count_end <= 16'd3822;re: count_end <= 16'd3405;mi: count_end <= 16'd3034;fa: count_end <= 16'd2865;so: count_end <= 16'd7802;la: count_end <= 16'd6802;si: count_end <= 16'd6060;default:count_end <= 16'h0;endcaseendendmodule3、曲目1模块:module bell(inclk,beep1);input inclk; /系统时钟output beep1; /蜂鸣器输出端reg 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(t1<3'd8) t1<=t1+3'b1; else begin t1<=3'b0; clk_6MHz<=clk_6MHz; endendreg clk_4Hz; /时钟频率4Hzreg 24:0 t2; always(posedge inclk)begin if(t2<25'd13000000)/ t2<=t2+25'b1; else begin t2<=25'b0; clk_4Hz<=clk_4Hz; endendalways (posedge clk_6MHz)begincount <= count + 1'b1; /计数器加1if(count = origin)begincount <= 16'h0; /计数器清零beep_r <= !beep_r; /输出取反endendalways(posedge clk_4Hz)begincase(high,med,low)12'b000000010000:origin=11466;/mid112'b000000100000:origin=10216;/mid212'b000000110000:origin=9101; /mid312'b000001000000:origin=8590; /mid412'b000001010000:origin=7653; /mid512'b000001100000:origin=6818; /mid612'b000000000101:origin=14447;/low5endcaseendalways (posedge clk_4Hz)/歌曲1beginif(state =63) state = 0;/计时,以实现循环演奏elsestate = state + 1;case(state)0,1: high,med,low=12'b000000010000;/mid12,3:high,med,low=12'b000000100000;/mid24,5:high,med,low=12'b000000110000;/mid36,7:high,med,low=12'b000000010000;/mid18,9: high,med,low=12'b000000010000;/mid110,11:high,med,low=12'b000000100000;/mid212,13:high,med,low=12'b000000110000;/mid314,15:high,med,low=12'b000000010000;/mid116,17:high,med,low=12'b000000110000;/mid318,19: high,med,low=12'b000001000000;/mid420,21,22,23: high,med,low=12'b000001010000;/mid524,25:high,med,low=12'b000000110000;/mid326,27: high,med,low=12'b000001000000;/mid428,29,30,31: high,med,low=12'b000001010000;/mid532: high,med,low=12'b000001010000;/mid533: high,med,low=12'b000001100000;/mid634:high,med,low=12'b000001010000;/mid535:high,med,low=12'b000001000000;/mid436,37:high,med,low=12'b000000110000;/mid338,39:high,med,low=12'b000000010000;/mid140:high,med,low=12'b000001010000;/mid541:high,med,low=12'b000001100000;/mid642:high,med,low=12'b000001010000;/mid543:high,med,low=12'b000001000000;/mid444,45:high,med,low=12'b000000110000;/mid346,47:high,med,low=12'b000000010000;/mid148,49:high,med,low=12'b000000100000;/mid250,51:high,med,low=12'b000000000101;/low552,53,54,55:high,med,low=12'b000000010000;/mid156,56:high,med,low=12'b000000100000;/mid257,58:high,med,low=12'b000000000101;/low559,60,61,62,63:high,med,low=12'b000000010000;/mid1default : high,med,low=12'bx;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; /输出音乐/时钟频率6MHzreg clk_6MHz;reg 2:0 t1; always(posedge inclk)begin if(t1<3'd8) t1<=t1+3'b1; else begin t1<=3'b0; clk_6MHz<=clk_6MHz; endend/时钟频率4MHzreg clk_4Hz;reg 24:0 t2; always(posedge inclk)begin if(t2<25'd13000000)/ t2<=t2+25'b1; else begin t2<=25'b0; clk_4Hz<=clk_4Hz; endendalways (posedge clk_6MHz)begincount <= count + 1'b1; /计数器加1if(count = origin)begincount <= 16'h0; /计数器清零beep_r <= !beep_r; /输出取反endendalways(posedge clk_4Hz)begincase(high,med,low)'b000000000001:origin=22900; /低1'b000000000010:origin=20408; /低2'b000000000011:origin=18181; /低3'b000000000100:origin=17142; /低4'b000000000101:origin=15267; /低5'b000000000110:origin=13605; /低6'b000000000111:origin=12121; /低7'b000000000111:origin=11472; /中1'b000000100000:origin=10216; /中2'b000000110000:origin=9101; /中3'b000000111000:origin=8571; /中4'b000001010000:origin=7653; /中5'b000001100000:origin=6818; /中6'b000010000000:origin=6060; /中7'b000100000000:origin=5733; /高1'b001000000000:origin=5108; /高2'b001100000000:origin=4551; /高3'b001010000000: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;/高15: 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;/中624,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;/高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,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: high,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,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

    注意事项

    本文(基于某FPGA地多功能电子琴设计与实现.doc)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开