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

下载本文档

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

文档简介

1、一、题目分析1、分析要求,确定总体方框图本设计基本部分是用VHDL语言设计一个简易的八音符电子琴,在 Quartus II 平台下下载到Cyclone系列的EP1C12Q240C8芯片中,该电路设计能够实现DO、RE、MI、FA等八个音调的电子琴,发挥部分是设计一乐曲自动演奏器,用户自己编制乐曲存入电子琴,电子琴可以完成自动演奏。电子琴音乐产生原理及硬件设计由于一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了。根据系统设计要求,系统设计采用自顶向下的设计方法,系统的整体组装设计原理图如图1所

2、示,它由乐曲自动演奏模块AUTO、音调发生模块TONE和数控分频模块FENPIN三部分组成。图1 系统的整体组装设计原理图2、最终完成的技能指标(1)设计一个简易的八音符电子琴,它可通过按键输入来控制音响。(2)演奏时可以选择是手动演奏(由键盘输入)还是自动演奏已存入的乐曲。二、选择方案通过可编程逻辑器件(PLD)和VHDL硬件描述引言来实现电子琴的基本部分和发挥部分的设计。对于基本部分,设计的主体是数控分频器,对输入的频率进行分频,得到各个音阶对应的频率最为输出。当按下不同的键时发出不同的声音。对于发挥部分,则在原设计的基础上,增加一个乐曲存储模块,代替了键盘输入,产生节拍控制(index数

3、据存留时间)和音阶选择信号,即在此模块中可存放一个乐曲曲谱真值表,由一个计数器来控制此真值表的输出,而由此计数器的计数时钟信号作为乐曲节拍控制信号,从而可以设计出一个纯硬件的乐曲自动演奏电路。 方案一:由单片机来完成设计。可用单片机控制键盘的输入,以及产生相应的频率信号作为输出。目前,单片机的功能已比较强大,集成度日益增高且其设计和控制比较容易。但是由于在传统的单片机设计系统中必须使用许多分立元件组成单片机的外围电路,如锁存器,译码器等都需要单独的电路,因此整个系统显得十分复杂,抗干扰性差,在运行过程中容易死机或进入死循环,可靠性降低,而功耗费用增高。 方案二:利用PLC来

4、完成设计。目前利用PLC的技术已经比较成熟。PLC有其优点, 其性能优异,体积小,可靠性和精度都比较好,在电子琴的设计中可采用PLC来完成硬件的控制,但是用PLC实现编程相对比较复杂,对于电子琴这种小型设计来说成本过高。 方案三:利用可编程逻辑器件PLD来完成该设计。利用PLD可以很好的解决上述的问题。它的成品体积小,适合电子琴这种小型设计。其性能稳定,控制精度高(Xilinx公司的高密度,高速可预测延时,高性能系列芯片),易于管理和屏蔽,抗干扰能力强,可靠性高。综上,在本设计中选择第三种方案最优。三、各模块原理及其程序1、乐曲自动演奏模块乐曲自动演奏模块(AUTO.VHD

5、)的作用是产生8位发声控制输入信号/当进行自动演奏时,由存储在此模块中的8位二进制数作为发声控制输入,从而自动演奏乐曲。为了实现扩展部分的设计,便需要多加上一个音乐存储模块,该模块的作用是产生8位发声控制输入index,auto为0或1时可以选择自动演奏或者键盘输入,如果auto为0,则而由存储在此模块中的8位二进制数来作为发声控制输入,由此便可自动演奏乐曲。此模块的VHDL语言中包括两个进程,首先是对基准脉冲进行分频得到4Hz的脉冲,作为第二个进程的时钟信号,它的目的是控制每个音阶之间的停顿时间,此处便是1/4=0.25s,第二个进程是音乐的存储,可根据需要编写不同的乐曲。 这段模

6、块的原理图如图2所示:CLKAUTO INDEX07.0INDEX27.0 图2乐曲自动演奏模块原理图乐曲自动演奏模块可以由VHDL语言来实现,下面是一段主要代码:BEGIN IF AUTO ='0' THEN CASE COUNT0 ISWHEN 0=>INDEX0<="00000100" -3WHEN 1=>INDEX0<="00000100" -3WHEN 2=>INDEX0<="00000100" -3WHEN 3=>INDEX0<="00000100&

7、quot; -3WHEN 4=>INDEX0<="00010000" -5WHEN 5=>INDEX0<="00010000" -5WHEN 6=>INDEX0<="00010000" -5WHEN 7=>INDEX0<="00100000" -6WHEN 8=>INDEX0<="10000000" -8WHEN 9=>INDEX0<="10000000" -8WHEN 10=>INDEX0<

8、="10000000" -8WHEN 11=>INDEX0<="00000100" -3WHEN 12=>INDEX0<="00000010" -2WHEN 13=>INDEX0<="00000010" -2WHEN 14=>INDEX0<="00000001" -1WHEN 15=>INDEX0<="00000001" -1WHEN 16=>INDEX0<="00010000" -5

9、WHEN 17=>INDEX0<="00010000" -5WHEN 18=>INDEX0<="00001000" -4WHEN 19=>INDEX0<="00001000" -4WHEN 20=>INDEX0<="00001000" -4WHEN 21=>INDEX0<="00000100" -3WHEN 22=>INDEX0<="00000010" -2WHEN 23=>INDEX0<=&

10、quot;00000010" -2WHEN 24=>INDEX0<="00010000" -5WHEN 25=>INDEX0<="00010000" -5WHEN 26=>INDEX0<="00001000" -4WHEN 27=>INDEX0<="00001000" -4WHEN 28=>INDEX0<="00000100" -3WHEN 29=>INDEX0<="00000100" -3WH

11、EN 30=>INDEX0<="00000010" -2WHEN 31=>INDEX0<="00000010" -2WHEN OTHERS =>NULL;END CASE;ELSE INDEX0<=INDEX2;END IF;END PROCESS;END BEHAVIORAL;2、音调发生模块音调发生模块(TONE.VDL)的作用是产生获得音阶的分频预置值。当8位发声控制输入index中的某一位为高电平时,则对应某一音阶的数值将以端口tone输出,作为获得该音阶的分频预置值,该值作为数控分频器的输入,来对4MHz的脉

12、冲进行分频,由此得到每个音阶相应的频率,例如输入index="00000010",即对应的按键是2,产生的分频系数便是6809;由code输出对应该音阶简谱的显示数码;由high输出指示音阶高8度的显示,低电平有效。 这段模块的原理图如图3所示: TONE10.0INDEX7.0 HIGH CODE6.0图3 音调发生模块原理图音调发生模块可以由VHDL语言来实现,下面是一段主要代码:BEGINCASE INDEX ISWHEN "00000001"=>TONE0 <=773;CODE<="1001111"

13、HIGH<='1'WHEN "00000010"=>TONE0 <=912;CODE<="0010010"HIGH<='1'WHEN "00000100"=>TONE0 <=1036;CODE<="0000110"HIGH<='1'WHEN "00001000"=>TONE0 <=1116;CODE<="1001100"HIGH<='1'

14、;WHEN "00010000"=>TONE0 <=1197;CODE<="0100100"HIGH<='1'WHEN "00100000"=>TONE0 <=1290;CODE<="0100000"HIGH<='0'WHEN "01000000"=>TONE0 <=1372;CODE<="0001111"HIGH<='0'WHEN "100000

15、00"=>TONE0 <=1410;CODE<="0000000"HIGH<='0'WHEN OTHERS =>TONE0<=2047;CODE<="0000001"HIGH<='0'END CASE;END PROCESS;3、数控分频模块在对EDA的学习中,我们知道数控分频器的功能是在输入端输入不同数据时,对输入时钟产生不同的分频比,输出不同频率的时钟,以改变输出信号的频率。本设计中数控分频模块是利用并行预置数的减法计数器对时基脉冲进行分频,得到与1、2、3、4

16、、5、6、7七个音符相对应的频率。该模块的VHDL描述中包含了三个进程。首先对32MHz的基准脉冲进行分频得到8MHz的脉冲,然后按照tone1输入的分频系数对4MHz的脉冲再次分频,得到的便是所需要的频率。而第三个进程的作用是在音调输出时再进行二分频,将脉冲展宽,以使扬声器有足够功率发音。这段模块的原理图如图4所示:CLK1 SPKSTONE110.0 图4 数控分频模块原理图数控分频模块可以由VHDL语言来实现,下面是一段主要代码:BEGINPROCESS(CLK1) VARIABLE COUNT:INTEGER RANGE 0 TO 8;BEGIN IF (CLK1'EVENT

17、AND CLK1='1')THEN COUNT:=COUNT +1; IF COUNT=2 THEN PRECLK<='1' ELSIF COUNT =4 THEN PRECLK<='0'COUNT:=0; END IF ;END IF ;END PROCESS;PROCESS(PRECLK,TONE1)VARIABLE COUNT11:INTEGER RANGE 0 TO 2047;BEGIN IF (PRECLK'EVENT AND PRECLK='1')THENIF COUNT11<TONE1 TH

18、EN COUNT11:=COUNT11+1;FULLSPKS<='1'ELSECOUNT11:=0;FULLSPKS<='0'END IF ;END IF ;END PROCESS;PROCESS(FULLSPKS)VARIABLE COUNT2 :STD_LOGIC:='0'BEGIN IF (FULLSPKS'EVENT AND FULLSPKS='1')THEN COUNT2:=NOT COUNT2;IF COUNT2='1'THENSPKS<='1'ELSE SPK

19、S<='0'END IF ;END IF;END PROCESS;4、顶层设计该DIANZIQIN模块是整个电子琴设计的核心,也是VHDL程序的主程序,前面3个源程序都是作为子程序分别实现电子琴的某一功能,而DIANZIQIN模块则通过调用子程序最终实现乐曲演奏的目的,奏出美妙的乐曲。利用VHDL语言COMPONENT将三个模块组合起来,其中3个模块和DIANZIQIN模块的输入输出是一一对应的,该模块的符号编辑图如图5。图5 顶层设计模块符号编辑图四、编程下载测试1、功能仿真功能仿真用于综合前检查设计的逻辑功能是否符合设计要求。仿真过程中可以通过观察检测设计的输入信号,

20、输出信号以及内部信号以检测设计的逻辑功能。如果仿真都通过的话就可以进行引脚锁定,然后下载程序,在实验箱上可以直观的看到结果。(1)乐曲自动演奏模块的仿真(如图6所示)图6乐曲自动演奏模块的仿真该图输入系统时钟信号CLK初值设为0,自动演奏AUTO设为1,键盘输入信号INDEX2为00,INDEX0为音符信号输出,是8位的二进制代码它根据COUNT0的值改变而改变。(2)音调发生模块的仿真(如图7)图7音调发生模块的仿真该图输入音符信号INDEX初值为00,输出是音符显示信号CODE为01,高低音显示信号为0,音符的分频系数为11111111即2047Hz。(3)数控分频模块的仿真(如图8)图8

21、 数控分频模块的仿真该图输入系统时钟信号CLK1初值为0(各输出值都是在时钟信号的下降沿有效),音符分频系数TONE1为00100000即1290Hz,驱动扬声器的音频信号SPKS输出为1。(4)简易电子琴整个系统的仿真(如图9)图9 简易电子琴整个系统的仿真该图输入系统时钟信号CLK初值为0,自动演奏信号HANDTOAUTO初值为0,键盘输入信号INDEX1为00000000;输出音符信号CODE1则为0110000,高低音节信号HIGH1变为1,即高音,音频信号SPKOUT即输出0,输出为1时CODE1变为0110100。2、锁定引脚:图10 引脚锁定3、硬件测试结果 选择模式3,PIO3

22、1控制是否自动播放预置歌曲或手动键入歌曲,可通过按键18演奏歌曲。五、课程总结在整个设计过程中,我通过查阅大量有关资料,与同学交流经验和自学,并向老师请教等方式,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。在整个设计中我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。同时大大提高了动手的能力,使我充分体会到了在创造过程中探索的艰难和成功时的喜悦。虽然这个设计做的也不太好,功能并没有完全实现,但是在设计过程中所学到的东西是这次课程设计的最大收获和财富,使我终身受益。通过这次VHDL课程设计,不仅增强了我们的实践动手能力

23、,也让我们对课堂上所学到的理论知识的理解加深了许多,这给我们提供了一个在学习生活中很难得的理论联系实际的机会。能够借此机会了解到部分EDA技术的知识和学习运用其中一种硬件描述语言VHDL编程实现各种常用器件的功能,这是在任何课堂上都得不到的一笔财富。 另一方面我们也发现了在平时学习过程中难于发现的许多缺点跟不足。比如实践机会过少,所学的理论知识不能灵活运用,在遇到实际的问题时无法正确处理;再者在课堂上获得的专业知识过于浅显,很多的有关基本操作原理、操作方法都理解不了;课外知识了解的也过少,导致在课程设计初期,面对完全陌生的设计课题无从下手,不知所措。这就提醒我们在平时的学习生活中不能

24、一味埋头于面前的课本知识,毕竟当今社会竞争越发激烈,而学校能教授的东西有限,要想在人才市场中脱颖而出就只能靠我们自己。当然,在学习之余我们更应该积极参加各种有关专业知识的实践活动和比赛,巩固所学理论,多注意培养初步的实际工作能力和专业技术能力,这样在以后的工作岗位上不会显得那么仓促与生疏。 六、参考文献目录1 黄正谨,在系统编程技术及其应用,东南大学出版社2 刘江海.,EDA技术课程设计.华中科技大学出版社3 王诚,吴继华,Altera FPGA/CPLD设计,人民邮电出版社4 张红润,张亚凡,FPGA/CPLD应用设计200例,北京航空航天大学出版社 5 王锁萍,电子设计自动化(E

25、DA)教程,电子科技大学出版社七、附录源程序如下:1、自动演奏模块程序(AUTO.VHD):LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY AUTO ISPORT ( CLK : IN STD_LOGIC; -系统时钟;键盘输入/自动演奏 AUTO : IN STD_LOGIC;  -键盘输入信号  CLK2 : BUFFER STD_LOGIC; -音符信号输出 INDEX2 : IN STD_LOGIC

26、_VECTOR(7 DOWNTO 0); INDEX0 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END AUTO;ARCHITECTURE BEHAVIORAL OF AUTO IS SIGNAL COUNT0: INTEGER RANGE 0 TO 31;BEGIN PULSE0 :PROCESS(CLK,AUTO)  -此进程完成对系统时钟8M的分频,得到4Hz的信号clk2 VARIABLE COUNT :INTEGER RANGE 0 TO 8; -定义计数器变量,值从0到8BEGINIF AUTO ='1' THEN -键盘输入

27、为1 COUNT := 0;CLK2<='0' -计数器值指0,时钟信号为0ELSIF(CLK'EVENT AND CLK ='1')THEN -时钟输入信号为1 COUNT :=COUNT +1; -计数器加1IF COUNT =4 THEN CLK2 <='1'ELSIF COUNT =8 THEN CLK2<='0' COUNT:=0;END IF ;END IF ;END PROCESS;MUSIC:PROCESS(CLK2) -此进程完成自动演奏部分曲的地址累加BEGIN IF (CLK2

28、9;EVENT AND CLK2='1')THEN IF (COUNT0=31)THEN COUNT0<=0; ELSE COUNT0<=COUNT0+1; END IF ;END IF ;END PROCESS;COM1:PROCESS(COUNT0,AUTO,INDEX2)BEGIN IF AUTO ='0' THEN CASE COUNT0 IS -此case语句:存储自动演奏部分的曲WHEN 0=>INDEX0<="00000100" -3WHEN 1=>INDEX0<="00000100

29、" -3WHEN 2=>INDEX0<="00000100" -3WHEN 3=>INDEX0<="00000100" -3WHEN 4=>INDEX0<="00010000" -5WHEN 5=>INDEX0<="00010000" -5WHEN 6=>INDEX0<="00010000" -5WHEN 7=>INDEX0<="00100000" -6WHEN 8=>INDEX0<

30、="10000000" -8WHEN 9=>INDEX0<="10000000" -8WHEN 10=>INDEX0<="10000000" -8WHEN 11=>INDEX0<="00000100" -3WHEN 12=>INDEX0<="00000010" -2WHEN 13=>INDEX0<="00000010" -2WHEN 14=>INDEX0<="00000001" -1W

31、HEN 15=>INDEX0<="00000001" -1WHEN 16=>INDEX0<="00010000" -5WHEN 17=>INDEX0<="00010000" -5WHEN 18=>INDEX0<="00001000" -4WHEN 19=>INDEX0<="00001000" -4WHEN 20=>INDEX0<="00001000" -4WHEN 21=>INDEX0<=&q

32、uot;00000100" -3WHEN 22=>INDEX0<="00000010" -2WHEN 23=>INDEX0<="00000010" -2WHEN 24=>INDEX0<="00010000" -5WHEN 25=>INDEX0<="00010000" -5WHEN 26=>INDEX0<="00001000" -4WHEN 27=>INDEX0<="00001000" -4WHE

33、N 28=>INDEX0<="00000100" -3WHEN 29=>INDEX0<="00000100" -3WHEN 30=>INDEX0<="00000010" -2WHEN 31=>INDEX0<="00000010" -2WHEN OTHERS =>NULL;END CASE;ELSE INDEX0<=INDEX2; -此进程完成自动演奏部分曲的地址累加END IF;END PROCESS;END BEHAVIORAL;2、数控分频模块程序(F

34、ENPIN.VHD):LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY FENPIN IS PORT(CLK1: IN STD_LOGIC; -定义系统时钟 TONE1: IN INTEGER RANGE 0 TO 2047; -定义音符分频系数,从0到2047Hz SPKS: OUT STD_LOGIC); -定义驱动扬声器的音频信号END ENTITY FENPIN;ARCHITECTURE ART OF FENPIN IS

35、 SIGNAL PRECLK:STD_LOGIC; SIGNAL FULLSPKS:STD_LOGIC;BEGINPROCESS(CLK1) VARIABLE COUNT:INTEGER RANGE 0 TO 8; -此进程对系统时钟进行4分频BEGIN IF (CLK1'EVENT AND CLK1='1')THEN COUNT:=COUNT +1; IF COUNT=2 THEN PRECLK<='1' ELSIF COUNT =4 THEN PRECLK<='0'COUNT:=0; END IF ;END IF ;END

36、 PROCESS;PROCESS(PRECLK,TONE1) -此进程按照tone1输入=分频系数对8MHz的脉冲再次分频,得到所需要的音符频率VARIABLE COUNT11:INTEGER RANGE 0 TO 2047;BEGIN IF (PRECLK'EVENT AND PRECLK='1')THENIF COUNT11<TONE1 THEN COUNT11:=COUNT11+1;FULLSPKS<='1'ELSECOUNT11:=0;FULLSPKS<='0' -此进程对FULLSPKS进行2分频END IF

37、;END IF ;END PROCESS;PROCESS(FULLSPKS)VARIABLE COUNT2 :STD_LOGIC:='0'BEGIN IF (FULLSPKS'EVENT AND FULLSPKS='1')THEN COUNT2:=NOT COUNT2;IF COUNT2='1'THENSPKS<='1'ELSE SPKS<='0'END IF ;END IF;END PROCESS;END ART;3、音调发生模块程序(TONE.VHD):LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL

温馨提示

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

评论

0/150

提交评论