EDA课设-简易电子琴_第1页
EDA课设-简易电子琴_第2页
EDA课设-简易电子琴_第3页
EDA课设-简易电子琴_第4页
EDA课设-简易电子琴_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

0 2 2 2 5 5 6 8 9 9 9 9 1EDA技术是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言VHDL完成设提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。利用所学的EDA设计方法设计简易电子琴,熟练使用QUARTUSⅡ应用软件,进一步学习使用VHDL语言、原理图等EDA设计方法进行综合题目的方法。①设计一个简易的八音符电子琴,它可通过按键输入来控制音响。②演奏时可以选择是手动演奏(由键盘输入)还是自动演奏已存入的乐曲。③能够自动演奏多首乐曲,且每首乐曲可重复演奏。④它由乐曲自动演奏模块、音调发生模块和数控分频模块三部分组成。2本课程设计目的在于灵活运用EDA技术编程实现一个简易电子琴的乐曲演奏,它要求阶的按键时,能够发出对应频率的声音。故系统可分为乐曲自动演奏模块(AUTO)、音调发生模块(TONE)和数控分频模块(FENPIN)三部分。能,但是每个模块又是紧密关联的,前一个模块的输出很可能是后一模块的输入。如AUTO模块的音符信号输出就是TONE模块的音符信号输入。另外,时钟脉冲信号在本课程设计中调发生模块和数控分频模块三部分组成。.乐曲自动演奏模块此模块的8位二进制数作为发声控制输入,从而自动演奏乐曲。当确定了时钟信号输出的值后,在第二个PROCESS中就可以由它控制8位发声控制输COUNT0、AUTO和键盘输入信号值INDEX2将8位的二进制数转化为音符信号的输出,达到自3.音调发生模块音调发生模块的作用是产生音阶的分频预置值。当8位发声控制输入信号中的某一位控制数控分频模块进行分频,由此得到每个音阶对应的频率。该模块的唯一输入信号INDEX对应就是自动模块中最后的输出INDEX0,音符显示信号CODE,高低音显示信号HIGH和音符分频系数都是根据音符输入确定的。比如我们自定义输出不同频率的正弦波,此模块就是将二进制发声信号转化为对应的频率。.数控分频模块数控分频模块的作用是对时基脉冲进行分频,得到与0、1、2、3、4、5、6、7八个音一个工作进程的设置。第二个PROCESS是此模块的核心,即由时基脉冲值转化为音符的频当前一个PROCESS中的FULLSPKS输出为1时,扬声器才有输出,再根据计数器取值来确定4.顶层模块顶层模块是整个电子琴设计的核心,也是VHDL程序的主程序,前面3个源程序都是作为子程序分别实现电子琴的某一功能,而DIANZIQIN模块则通过调用子程序最终实现乐曲演奏的目的,奏出美妙的乐曲。利用VHDL语言COMPONENT将三个模块组合起来,其中3个模块和DIANZIQIN模块的输入输出是一一对应的,比如AUTO对应HANDTOAUTO,TONE0对应该图描述的是DIANZIQIN模块输入输出的变量表示,整个系统的整体组装设计原理图就是这4幅编辑图按输入输出关系顺序连接而成的。5USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYAUTOISPORT(CLK:INSTD_LOGIC;AUTO:INSTD_LOGIC;CLK2:BUFFERSTD_LOGIC;INDEX2:INSTD_LOGIC_VECTOR(7DOWNTO0);INDEX0:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDAUTO;ARCHITECTUREBEHAVIORALOFAUTOIS--系统时钟信号--键盘输入/自动演奏--时钟输出--键盘输入信号--音符信号输出SIGNALCOUNT0:INTEGERRANGE0TO31;--定义信号计数器,有32个信号元素BEGINPULSE0:PROCESS(CLK,AUTO)VARIABLECOUNT:INTEGERRANGE0TO8;BEGINIFAUTO='1'THENCOUNT:=0;CLK2<='0';ELSIF(CLK'EVENTANDCLK='1')THENCOUNT:=COUNT+1;CLK2<='1';ELSIFCOUNT=8THENCLK2<='0';COUNT:=0;ENDPROCESS;--PULSE0工作进程开始--定义变量计数器,从0到8--键盘输入为1--输入的时钟信号为其他值MUSIC:PROCESS(CLK2)--MUSIC工作进程开始BEGINIF(CLK2'EVENTANDCLK2='1')THEN IF(COUNT0=31)THEN 计数器值为31COUNT0<=0; 计数器清0ELSECOUNT0<=COUNT0+1;ENDPROCESS;COM1:PROCESS(COUNT0,AUTO,INDEX2)BEGINIFAUTO='0'THEN 键盘输入为0CASECOUNT0IS--由计数器从0到31的取值判断音符信号的8位二进制数WHEN0=>INDEX0<="00000100";WHEN1=>INDEX0<="00000100";WHEN2=>INDEX0<="00000100";WHEN3=>INDEX0<="00000100";WHEN4=>INDEX0<="00010000";WHEN5=>INDEX0<="00010000";WHEN6=>INDEX0<="00010000";WHEN7=>INDEX0<="00100000";WHEN8=>INDEX0<="10000000";WHEN9=>INDEX0<="10000000";WHEN10=>INDEX0<="10000000";WHEN11=>INDEX0<="00000100";6WHEN12=>INDEX0<="00000010";WHEN13=>INDEX0<="00000010";WHEN14=>INDEX0<="00000001";WHEN15=>INDEX0<="00000001";WHEN16=>INDEX0<="00010000";WHEN17=>INDEX0<="00010000";WHEN18=>INDEX0<="00001000";WHEN19=>INDEX0<="00001000";WHEN20=>INDEX0<="00001000";WHEN21=>INDEX0<="00000100";WHEN22=>INDEX0<="00000010";WHEN23=>INDEX0<="00000010";WHEN24=>INDEX0<="00010000";WHEN25=>INDEX0<="00010000";WHEN26=>INDEX0<="00001000";WHEN27=>INDEX0<="00001000";WHEN28=>INDEX0<="00000100";WHEN29=>INDEX0<="00000100";WHEN30=>INDEX0<="00000010";WHEN31=>INDEX0<="00000010";WHENOTHERS=>NULL;ENDCASE;ELSEINDEX0<=INDEX2;ENDPROCESS;ENDBEHAVIORAL;--将音符信号0的值赋给音符信号2USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYTONEISPORT(INDEX:INSTD_LOGIC_VECTOR(7DOWNTO0);CODE:OUTSTD_LOGIC_VECTOR(6DOWNTO0);HIGH:OUTSTD_LOGIC;TONE0:OUTINTEGERRANGE0TO2047);ENDTONE;ARCHITECTUREARTOFTONEISBEGINSEARCH:PROCESS(INDEX)BEGIN--音符输入信号--音符显示信号--高低音显示信号--音符的分频系数WHEN"00000001"=>TONE0<=773;CODE<="1001111";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';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"10000000"=>TONE0<=1410;CODE<="0000000";HIGH<='0';WHENOTHERS=>TONE0<=2047;CODE<="0000001";HIGH<='0';ENDCASE;ENDPROCESS;ENDART;7USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYFENPINISPORT(CLK1:INSTD_LOGIC;--系统时钟信号TONE1:ININTEGERRANGE0TO2047;--音符分频SPKS:OUTSTD_LOGIC);--驱动扬声器的音频信号ENDENTITYFENPIN;ARCHITECTUREARTOFFENPINISSIGNALPRECLK:STD_LOGIC;--定义时基脉冲信号SIGNALFULLSPKS:STD_LOGIC;BEGINPROCESS(CLK1)VARIABLECOUNT:INTEGERRANGE0TO8:=0; BEGINIF(CLK1'EVENTANDCLK1='1')THEN COUNT:=COUNT+1; 判断计数器取值为1PRECLK<='1';ELSIFCOUNT=4THEN--若计数器计4PRECLK<='0';COUNT:=0;--时基脉冲为0,计数器清零ELSEENDPROCESS;PROCESS(PRECLK,TONE1)BEGINIF(PRECLK'EVENTANDPRECLK='1')THEN PRECLK脉冲上升沿触发IFCOUNT11<TONE1THEN 若计数器11值小于音符信号1COUNT11:=COUNT11+1;FULLSPKS<='1';--计数器加1,音频信号为1ELSECOUNT11:=0;FULLSPKS<='0';ENDPROCESS;PROCESS(FULLSPKS) 音频信号输出进程开始 定义变量计数器2,初值为0BEGINIF(FULLSPKS'EVENTANDFULLSPKS='1')THENcount2:=1;IFCOUNT2=1THENSPKS<='1';ELSESPKS<='0';ENDPROCESS;ENDART;8USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYDIANZIQINISPORT(CLK32MHZ:INSTD_LOGIC;HANDTOAUTO:INSTD_LOGIC;CODE1:OUTSTD_LOGIC_VECTOR(6DOWNTO0);INDEX1:INSTD_LOGIC_VECTOR(7DOWNTO0);HIGH1:OUTSTD_LOGIC;SPKOUT:OUTSTD_LOGIC);END;ARCHITECTUREARTOFDIANZIQINISCOMPONENTAUTOPORT(CLK:INSTD_LOGIC;AUTO:INSTD_LOGIC;INDEX2:INSTD_LOGIC_VECTOR(7DOWNTO0);INDEX0:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDCOMPONENT;COMPONENTTONE--系统时钟信号--键盘输入/自动演奏信号--音符显示信号--键盘输入信号--高低音节信号--音频信号--引用AUTO元件--输入自动演奏信号--输入8位控制信号--输出8位的音符--引用TONE元件PORT(INDEX:INSTD_LOGIC_VECTOR(7DOWNTO0);CODE:OUTSTD_LOGIC_VECTOR(6DOWNTO0);HIGH:OUTSTD_LOGIC;TONE0:OUTINTEGERRANGE0TO2047);ENDCOMPONENT;COMPONENTFENPIN--引用FENPIN元件PORT(CLK1:INSTD_LOGIC;TONE1:ININTEGERRANGESPKS:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALTONE2:INTEGERRANGE0TO2047;--定义主程序音调频率信号SIGNALINDX:STD_LOGIC

温馨提示

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

评论

0/150

提交评论