简易电子琴.docx
《简易电子琴.docx》由会员分享,可在线阅读,更多相关《简易电子琴.docx(12页珍藏版)》请在冰豆网上搜索。
![简易电子琴.docx](https://file1.bdocx.com/fileroot1/2023-6/20/d7f52a4e-7b76-42cc-8cd5-44fbba8809c2/d7f52a4e-7b76-42cc-8cd5-44fbba8809c21.gif)
简易电子琴
EDA课程设计报告书
课题名称
简易电子琴
姓名
学号
院、系、部
电气工程系
专业
电子信息工程
指导教师
2010年7月9日
一、设计任务及要求:
1、系统设计要求
(1)设计一个简易的八音符电子琴
(2)能够自动演奏乐曲。
2、设计内容
简易电子琴自动发出1、2、3、4、5、6、7七个音符,连续播放,
每个音符的频率可通过数控分频器实现。
指导教师签名:
2010年月日
二、指导教师评语:
指导教师签名:
2010年月日
三、成绩
指导教师签名:
2010年月日
简易电子琴
一、设计目的
巩固和运用所学课程,理论联系实际,提高分析、解决计算机技术实际问题的独立工作能力,通过对一个简易的八音符电子琴的设计,进一步加深对计算机原理以及数字电路应用技术方面的了解与认识,进一步熟悉数字电路系统设计、制作与调试的方法和步骤。
巩固所学课堂知识,理论联系实际,提高分析、解决计算机技术实际问题的独立工作能力。
为了进一步了解计算机组成原理与系统结构,深入学习EDA技术,用VHDL语言去控制将会使我们对本专业知识可以更好地掌握。
二、设计要求
(1)设计一个简易的八音符电子琴,它可通过按键输入来控制音响。
(2)演奏时可以选择是手动演奏(由键盘输入)还是自动演奏已存入的乐曲。
(3)能够自动演奏多首乐曲,且每首乐曲可重复演奏。
三、电路及连线设计
四、使用说明
(1)乐曲自动演奏模块
乐曲自动演奏模块(AUTO.VHD)的作用是产生8位发声控制输入信号/当进行自动演奏时,由存储在此模块中的8位二进制数作为发声控制输入,从而自动演奏乐曲。
(2)音调发生模块
音调发生模块的作用是产生音阶的分频预置值。
当8位发声控制输入信号中的某一位为高电平时,则对应某一音节的数值将输出,该数值即为该音阶的分频预置值,分频预置值控制数控分频模块进行分频,由此可得到每个音阶对应的频率。
(3)数控分频模块
数控分频模块是对时基脉冲进行分频,得到与1、2、3、4、5、6、7七个音符相对应的频率。
五、程序设计如下:
乐曲自动演奏模块
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)
VARIABLECOUNT:
INTEGERRANGE0TO8;
BEGIN
IFAUTO='1'THEN
COUNT:
=0;CLK2<='0';
ELSIF(CLK'EVENTANDCLK='1')THEN
COUNT:
=COUNT+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
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)音调发生模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYTONEIS
PORT(INDEX:
INSTD_LOGIC_VECTOR(7DOWNTO0);
CODE:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
HIGH:
OUTSTD_LOGIC;
TONE0:
OUTINTEGERRANGE0TO2047);
ENDTONE;
ARCHITECTUREARTOFTONEIS
BEGIN
SEARCH:
PROCESS(INDEX)
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;
ENDART;
(3)数控分频模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYFENPINIS
PORT(CLK1:
INSTD_LOGIC;
TONE1:
ININTEGERRANGE0TO2047;
SPKS:
OUTSTD_LOGIC);
ENDENTITYFENPIN;
ARCHITECTUREARTOFFENPINIS
SIGNALPRECLK:
STD_LOGIC;
SIGNALFULLSPKS:
STD_LOGIC;
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
IFCOUNT11COUNT11:
=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;
ENDART;
(4)顶层设计
VHDL源程序(DIANZIQIN.VHD)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYDIANZIQINIS
PORT(CLK32MHZ:
INSTD_LOGIC;
HANDTOAUTO:
INSTD_LOGIC;
CODE1:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);--音符显示信号
INDEX1:
INSTD_LOGIC_VECTOR(7DOWNTO0);--键盘输入信号
HIGH1:
OUTSTD_LOGIC;--高低音节信号
SPKOUT:
OUTSTD_LOGIC);--音频信号
END;
ARCHITECTUREARTOFDIANZIQINIS
COMPONENTAUTO
PORT(CLK:
INSTD_LOGIC;
AUTO:
INSTD_LOGIC;
INDEX2:
INSTD_LOGIC_VECTOR(7DOWNTO0);
INDEX0:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDCOMPONENT;
COMPONENTTONE
PORT(INDEX:
INSTD_LOGIC_VECTOR(7DOWNTO0);
CODE:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
HIGH:
OUTSTD_LOGIC;
TONE0:
OUTINTEGERRANGE0TO2047);
ENDCOMPONENT;
COMPONENTFENPIN
PORT(CLK1:
INSTD_LOGIC;
TONE1:
ININTEGERRANGE0TO2047;
SPKS:
OUTSTD_LOGIC);
ENDCOMPONENT;
SIGNALTONE2:
INTEGERRANGE0TO2047;
SIGNALINDX:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
U0:
AUTOPORTMAP(CLK=>CLK32MHZ,INDEX2=>INDEX1,INDEX0=>INDX,AUTO=>HANDTOAUTO);
U1:
TONEPORTMAP(INDEX=>INDX,TONE0=>TONE2,CODE=>CODE1,HIGH=>HIGH1);
U2:
FENPINPORTMAP(CLK1=>CLK32MHZ,TONE1=>TONE2,SPKS=>SPKOUT);
ENDART;
五、设计总结:
经过努力,简易电子琴的设计基本上完成了。
在整个设计过程中,包括前期中期和后期,我都有着许多不同的体会:
1)这个设计的基本是接触一门新的语言并加以应用,对于我来说,没有想到的是入手的速度比我的预料快,在以前编程的基础上,从接触到开始动手编程的时间得到了很大的缩短。
知识的接收速度在很大的程度上决定了动手的时间。
2)VHDL的编程与C语言的编程有着本质的不同,然而以往形成的旧编程习惯在VHDL编程中依然起着很大的作用。
一通百通,不是没有道理的。
对于学习新的知识并予以应用的信心,显得更足了。
六、参考文献:
《VHDL与数字电路设计》.卢毅, 赖杰. 科学出版社
《VHDL语言100例详解——北京理工大学ASIC研究所》.北京理工大学ASIC研究所. 清华大学出版社
《VHDL 程序设计》(第二版).曾繁泰等. 清华大学出版社
《VHDL入门与应用》陈雪松, 滕立中 .人民邮电出版社
《VHDL简明教程》.王小军 .清华大学出版社