EDA简易电子琴设计报告.docx
- 文档编号:5232939
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:16
- 大小:180.29KB
EDA简易电子琴设计报告.docx
《EDA简易电子琴设计报告.docx》由会员分享,可在线阅读,更多相关《EDA简易电子琴设计报告.docx(16页珍藏版)》请在冰豆网上搜索。
EDA简易电子琴设计报告
一、题目分析
1、分析要求,确定总体方框图
本设计基本部分是用VHDL语言设计一个简易的八音符电子琴,在 Quartus II 平台下下载到Cyclone系列的EP1C12Q240C8芯片中,该电路设计能够实现DO、RE、MI、FA等八个音调的电子琴,发挥部分是设计一乐曲自动演奏器,用户自己编制乐曲存入电子琴,电子琴可以完成自动演奏。
电子琴音乐产生原理及硬件设计由于一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了。
根据系统设计要求,系统设计采用自顶向下的设计方法,系统的整体组装设计原理图如图1所示,它由乐曲自动演奏模块AUTO、音调发生模块TONE和数控分频模块FENPIN三部分组成。
图1系统的整体组装设计原理图
2、最终完成的技能指标
(1)设计一个简易的八音符电子琴,它可通过按键输入来控制音响。
(2)演奏时可以选择是手动演奏(由键盘输入)还是自动演奏已存入的乐曲。
二、选择方案
通过可编程逻辑器件(PLD)和VHDL硬件描述引言来实现电子琴的基本部分和发挥部分的设计。
对于基本部分,设计的主体是数控分频器,对输入的频率进行分频,得到各个音阶对应的频率最为输出。
当按下不同的键时发出不同的声音。
对于发挥部分,则在原设计的基础上,增加一个乐曲存储模块,代替了键盘输入,产生节拍控制(index数据存留时间)和音阶选择信号,即在此模块中可存放一个乐曲曲谱真值表,由一个计数器来控制此真值表的输出,而由此计数器的计数时钟信号作为乐曲节拍控制信号,从而可以设计出一个纯硬件的乐曲自动演奏电路。
方案一:
由单片机来完成设计。
可用单片机控制键盘的输入,以及产生相应的频率信号作为输出。
目前,单片机的功能已比较强大,集成度日益增高且其设计和控制比较容易。
但是由于在传统的单片机设计系统中必须使用许多分立元件组成单片机的外围电路,如锁存器,译码器等都需要单独的电路,因此整个系统显得十分复杂,抗干扰性差,在运行过程中容易死机或进入死循环,可靠性降低,而功耗费用增高。
方案二:
利用PLC来完成设计。
目前利用PLC的技术已经比较成熟。
PLC有其优点, 其性能优异,体积小,可靠性和精度都比较好,在电子琴的设计中可采用PLC来完成硬件的控制,但是用PLC实现编程相对比较复杂,对于电子琴这种小型设计来说成本过高。
方案三:
利用可编程逻辑器件PLD来完成该设计。
利用PLD可以很好的解决上述的问题。
它的成品体积小,适合电子琴这种小型设计。
其性能稳定,控制精度高(Xilinx公司的高密度,高速可预测延时,高性能系列芯片),易于管理和屏蔽,抗干扰能力强,可靠性高。
综上,在本设计中选择第三种方案最优。
三、各模块原理及其程序
1、乐曲自动演奏模块
乐曲自动演奏模块(AUTO.VHD)的作用是产生8位发声控制输入信号/当进行自动演奏时,由存储在此模块中的8位二进制数作为发声控制输入,从而自动演奏乐曲。
为了实现扩展部分的设计,便需要多加上一个音乐存储模块,该模块的作用是产生8位发声控制输入index,auto为0或1时可以选择自动演奏或者键盘输入,如果auto为0,则而由存储在此模块中的8位二进制数来作为发声控制输入,由此便可自动演奏乐曲。
此模块的VHDL语言中包括两个进程,首先是对基准脉冲进行分频得到4Hz的脉冲,作为第二个进程的时钟信号,它的目的是控制每个音阶之间的停顿时间,此处便是1/4=0.25s,第二个进程是音乐的存储,可根据需要编写不同的乐曲。
这段模块的原理图如图2所示:
CLK
AUTOINDEX0[7.0]
INDEX2[7.0]
图2乐曲自动演奏模块原理图
乐曲自动演奏模块可以由VHDL语言来实现,下面是一段主要代码:
BEGIN
IFAUTO='0'THEN
CASECOUNT0IS
WHEN0=>INDEX0<="00000100";--3
WHEN1=>INDEX0<="00000100";--3
WHEN2=>INDEX0<="00000100";--3
WHEN3=>INDEX0<="00000100";--3
WHEN4=>INDEX0<="00010000";--5
WHEN5=>INDEX0<="00010000";--5
WHEN6=>INDEX0<="00010000";--5
WHEN7=>INDEX0<="00100000";--6
WHEN8=>INDEX0<="10000000";--8
WHEN9=>INDEX0<="10000000";--8
WHEN10=>INDEX0<="10000000";--8
WHEN11=>INDEX0<="00000100";--3
WHEN12=>INDEX0<="00000010";--2
WHEN13=>INDEX0<="00000010";--2
WHEN14=>INDEX0<="00000001";--1
WHEN15=>INDEX0<="00000001";--1
WHEN16=>INDEX0<="00010000";--5
WHEN17=>INDEX0<="00010000";--5
WHEN18=>INDEX0<="00001000";--4
WHEN19=>INDEX0<="00001000";--4
WHEN20=>INDEX0<="00001000";--4
WHEN21=>INDEX0<="00000100";--3
WHEN22=>INDEX0<="00000010";--2
WHEN23=>INDEX0<="00000010";--2
WHEN24=>INDEX0<="00010000";--5
WHEN25=>INDEX0<="00010000";--5
WHEN26=>INDEX0<="00001000";--4
WHEN27=>INDEX0<="00001000";--4
WHEN28=>INDEX0<="00000100";--3
WHEN29=>INDEX0<="00000100";--3
WHEN30=>INDEX0<="00000010";--2
WHEN31=>INDEX0<="00000010";--2
WHENOTHERS=>NULL;
ENDCASE;
ELSEINDEX0<=INDEX2;
ENDIF;
ENDPROCESS;
ENDBEHAVIORAL;
2、音调发生模块
音调发生模块(TONE.VDL)的作用是产生获得音阶的分频预置值。
当8位发声控制输入index中的某一位为高电平时,则对应某一音阶的数值将以端口tone输出,作为获得该音阶的分频预置值,该值作为数控分频器的输入,来对4MHz的脉冲进行分频,由此得到每个音阶相应的频率,例如输入index="00000010",即对应的按键是2,产生的分频系数便是6809;由code输出对应该音阶简谱的显示数码;由high输出指示音阶高8度的显示,低电平有效。
这段模块的原理图如图3所示:
图3音调发生模块原理图
音调发生模块可以由VHDL语言来实现,下面是一段主要代码:
BEGIN
CASEINDEXIS
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;
3、数控分频模块
在对EDA的学习中,我们知道数控分频器的功能是在输入端输入不同数据时,对输入时钟产生不同的分频比,输出不同频率的时钟,以改变输出信号的频率。
本设计中数控分频模块是利用并行预置数的减法计数器对时基脉冲进行分频,得到与1、2、3、4、5、6、7七个音符相对应的频率。
该模块的VHDL描述中包含了三个进程。
首先对32MHz的基准脉冲进行分频得到8MHz的脉冲,然后按照tone1输入的分频系数对4MHz的脉冲再次分频,得到的便是所需要的频率。
而第三个进程的作用是在音调输出时再进行二分频,将脉冲展宽,以使扬声器有足够功率发音。
这段模块的原理图如图4所示:
图4数控分频模块原理图
数控分频模块可以由VHDL语言来实现,下面是一段主要代码:
BEGIN
PROCESS(CLK1)
VARIABLECOUNT:
INTEGERRANGE0TO8;
BEGIN
IF(CLK1'EVENTANDCLK1='1')THEN
COUNT:
=COUNT+1;
IFCOUNT=2THEN
PRECLK<='1';
ELSIFCOUNT=4THEN
PRECLK<='0';COUNT:
=0;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(PRECLK,TONE1)
VARIABLECOUNT11:
INTEGERRANGE0TO2047;
BEGIN
IF(PRECLK'EVENTANDPRECLK='1')THEN
IFCOUNT11 COUNT11: =COUNT11+1;FULLSPKS<='1'; ELSE COUNT11: =0;FULLSPKS<='0'; ENDIF; ENDIF; ENDPROCESS; PROCESS(FULLSPKS) VARIABLECOUNT2: STD_LOGIC: ='0'; BEGIN IF(FULLSPKS'EVENTANDFULLSPKS='1')THEN COUNT2: =NOTCOUNT2; IFCOUNT2='1'THEN SPKS<='1'; ELSE SPKS<='0'; ENDIF; ENDIF; ENDPROCESS; 4、顶层设计 该DIANZIQIN模块是整个电子琴设计的核心,也是VHDL程序的主程序,前面3个源程序都是作为子程序分别实现电子琴的某一功能,而DIANZIQIN模块则通过调用子程序最终实现乐曲演奏的目的,奏出美妙的乐曲。 利用VHDL语言COMPONENT将三个模块组合起来,其中3个模块和DIANZIQIN模块的输入输出是一一对应的,该模块的符号编辑图如图5。 图5顶层设计模块符号编辑图 四、编程下载测试 1、功能仿真 功能仿真用于综合前检查设计的逻辑功能是否符合设计要求。 仿真过程中可以通过观察检测设计的输入信号,输出信号以及部信号以检测设计的逻辑功能。 如果仿真都通过的话就可以进行引脚锁定,然后下载程序,在实验箱上可以直观的看到结果。 (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数控分频模块的仿真 该图输入系统时钟信号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,PIO31控制是否自动播放预置歌曲或手动键入歌曲,可通过按键1—8演奏歌曲。 五、课程总结 在整个设计过程中,我通过查阅大量有关资料,与同学交流经验和自学,并向老师请教等方式,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。 在整个设计中我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。 同时大大提高了动手的能力,使我充分体会到了在创造过程中探索的艰难和成功时的喜悦。 虽然这个设计做的也不太好,功能并没有完全实现,但是在设计过程中所学到的东西是这次课程设计的最大收获和财富,使我终身受益。 通过这次VHDL课程设计,不仅增强了我们的实践动手能力,也让我们对课 堂上所学到的理论知识的理解加深了许多,这给我们提供了一个在学习生活中很难得的理论联系实际的机会。 能够借此机会了解到部分EDA技术的知识和学习运用其中一种硬件描述语言VHDL编程实现各种常用器件的功能,这是在任何课堂上都得不到的一笔财富。 另一方面我们也发现了在平时学习过程中难于发现的许多缺点跟不足。 比如实践机会过少,所学的理论知识不能灵活运用,在遇到实际的问题时无法正确处理;再者在课堂上获得的专业知识过于浅显,很多的有关基本操作原理、操作方法都理解不了;课外知识了解的也过少,导致在课程设计初期,面对完全陌生的设计课题无从下手,不知所措。 这就提醒我们在平时的学习生活中不能一味埋头于面前的课本知识,毕竟当今社会竞争越发激烈,而学校能教授的东西有限,要想在人才市场中脱颖而出就只能靠我们自己。 当然,在学习之余我们更应该积极参加各种有关专业知识的实践活动和比赛,巩固所学理论,多注意培养初步的实际工作能力和专业技术能力,这样在以后的工作岗位上不会显得那么仓促与生疏。 六、参考文献目录 [1]黄正谨,在系统编程技术及其应用,东南大学 [2]江海.,EDA技术课程设计.华中科技大学 [3]王诚,吴继华,AlteraFPGA/CPLD设计,人民邮电 [4]红润,亚凡,FPGA/CPLD应用设计200例,北京航空航天大学 [5]王锁萍,电子设计自动化(EDA)教程,电子科技大学 七、附录 源程序如下: 1、自动演奏模块程序(AUTO.VHD): LIBRARYIEEE; USEIEEE.STD_LOGIC_1164.ALL; USEIEEE.STD_LOGIC_ARITH.ALL; USEIEEE.STD_LOGIC_UNSIGNED.ALL; ENTITYAUTOIS PORT(CLK: INSTD_LOGIC;--系统时钟;键盘输入/自动演奏 AUTO: INSTD_LOGIC; --键盘输入信号 CLK2: BUFFERSTD_LOGIC;--音符信号输出 INDEX2: INSTD_LOGIC_VECTOR(7DOWNTO0); INDEX0: OUTSTD_LOGIC_VECTOR(7DOWNTO0)); ENDAUTO; ARCHITECTUREBEHAVIORALOFAUTOIS SIGNALCOUNT0: INTEGERRANGE0TO31; BEGIN PULSE0: PROCESS(CLK,AUTO) --此进程完成对系统时钟8M的分频,得到4Hz的信号clk2 VARIABLECOUNT: INTEGERRANGE0TO8; --定义计数器变量,值从0到8 BEGIN IFAUTO='1'THEN--键盘输入为1 COUNT: =0;CLK2<='0';--计数器值指0,时钟信号为0 ELSIF(CLK'EVENTANDCLK='1')THEN--时钟输入信号为1 COUNT: =COUNT+1;--计数器加1 IFCOUNT=4THEN CLK2<='1'; ELSIFCOUNT=8THEN CLK2<='0';COUNT: =0; ENDIF; ENDIF; ENDPROCESS; MUSIC: PROCESS(CLK2)--此进程完成自动演奏部分曲的地址累加 BEGIN IF(CLK2'EVENTANDCLK2='1')THEN IF(COUNT0=31)THEN COUNT0<=0; ELSE COUNT0<=COUNT0+1; ENDIF; ENDIF; ENDPROCESS; COM1: PROCESS(COUNT0,AUTO,INDEX2) BEGIN IFAUTO='0'THEN CASECOUNT0IS--此case语句: 存储自动演奏部分的曲 WHEN0=>INDEX0<="00000100";--3 WHEN1=>INDEX0<="00000100";--3 WHEN2=>INDEX0<="00000100";--3 WHEN3=>INDEX0<="00000100";--3 WHEN4=>INDEX0<="00010000";--5 WHEN5=>INDEX0<="00010000";--5 WHEN6=>INDEX0<="00010000";--5 WHEN7=>INDEX0<="00100000";--6 WHEN8=>INDEX0<="10000000";--8 WHEN9=>INDEX0<="10000000";--8 WHEN10=>INDEX0<="10000000";--8 WHEN11=>INDEX0<="00000100";--3 WHEN12=>INDEX0<="00000010";--2 WHEN13=>INDEX0<="00000010";--2 WHEN14=>INDEX0<="00000001";--1 WHEN15=>INDEX0<="00000001";--1 WHEN16=>INDEX0<="00010000";--5 WHEN17=>INDEX0<="00010000";--5 WHEN18=>INDEX0<="00001000";--4 WHEN19=>INDEX0<="00001000";--4 WHEN20=>INDEX0<="00001000";--4 WHEN21=>INDEX0<="00000100";--3 WHEN22=>INDEX0<="00000010";--2 WHEN23=>INDEX0<="00000010";--2 WHEN24=>INDEX0<="00010000";--5 WHEN25=>INDEX0<="00010000";--5 WHEN26=>INDEX0<="00001000";--4 WHEN27=>INDEX0<="00001000";--4 WHEN28=>INDEX0<="00000100";--3 WHEN29=>INDEX0<="00000100";--3 WHEN30=>INDEX0<="00000010";--2 WHEN31=>INDEX0<="00000010";--2 WHENOTHERS=>NULL; ENDCASE; ELSEINDEX0<=INDEX2;--此进程完成自动演奏部分曲的地址累加 ENDIF; ENDPROCESS; ENDBEHAVIORAL; 2、数控分频模块程序(FENPIN.VHD): LIBRARYIEEE; USEIEEE.STD_LOGIC_1164.ALL; USEIEEE.STD_LOGIC_ARITH.ALL; USEIEEE.STD_LOGIC_UNSIGNED.ALL; ENTITYFENPINIS PORT(CLK1: INSTD_LOGIC;--定义系统时钟 TONE1: ININTEGERRANGE0TO2047; --定义音符分频系数,从0到2047Hz SPKS: OUTSTD_LOGIC);--定义驱动扬声器的音频信号 ENDENTITYFENPIN; ARCHITECTUREARTOFFENPINIS SIGNALPRECLK: STD_LOGIC; SIGNALFULLSPKS: STD_LOGIC; BEGIN PROCESS(CLK1) VARIABLECOUNT: INTEGERRANGE0TO8;--此进程对系统时钟进行4分频 BEGIN IF(CLK1'EVENTANDCLK1='1')THEN COUNT: =COUNT+1; IFCOUNT=2THEN PRECLK<='1'; ELSIFCOUNT=4THEN PRECLK<='0';COUNT: =0; ENDIF; ENDIF; ENDPROCESS; PROCESS(PRECLK,TONE1)--此进程按照tone1输入 ==分频系数对8MHz的脉冲再次分频,得到所需要的音符频率 VARIABLECOUNT11: INTEGERRANGE0TO2047; BEGIN IF(PRECLK'EVENTANDPRECLK='1')THEN IFCOUNT11 COUNT11: =COUNT11+1;FULLSPKS<='1'; ELSE COUNT11: =0;FULLSPKS<='0';--此进程对FULLSPKS进行2分频 ENDIF; ENDIF; ENDPROCESS; PROCESS(FULLSPKS) VARIABLECOUNT2: STD_LOGIC: ='0'; BEGIN IF(FULLSPKS'EVENTANDFULLSPKS='1')THEN COUNT2: =NOTCOUNT2; IFCOUNT2='1'THEN SPKS<='1'; ELSE SPKS<='0'; ENDIF; ENDI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 简易 电子琴 设计 报告