第一篇:EDA_电子琴课程设计
基于VHDL原理图及文本输入法 的简单电子琴电路的设计
1.1 课程设计目的
本课程设计主要是基于VHDL文本输入法设计乐曲演奏电路,该系统基于计算机中时钟分频器的原理,采用自顶向下的设计方法来实现,通过按键输入来控制音响或者自动演奏已存入的歌曲。系统由乐曲自动演奏模块、音调发生模块和数控分频模块三个部分组成。系统实现是用硬件描述语言VHDL按模块化方式进行设计,然后进行编程、时序仿真、电路功能验证,奏出美妙的乐曲(当然由于条件限制,暂不进行功能验证,只进行编程和时序仿真)。该设计最重要的一点就是通过按键控制不同的音调发生,每一个音调对应不同的频率,从而输出对应频率的声音。
1.2 课程设计内容
(1)设计一个简易的八音符电子琴,它可通过按键输入来控制音响。
(2)系统演奏时可以选择是手动演奏(由键盘输入)还是自动演奏已存入的乐曲。(3)能够自动演奏多首乐曲,且乐曲可重复演奏。
1.3 课程设计原理
本课程设计目的在于灵活运用EDA技术编程实现一个简易电子琴的乐曲演奏,它要求在实验箱上构造一个电子琴电路,不同的音阶对应不同频率的正弦波。按下每个代表不同音阶的按键时,能够发出对应频率的声音。故系统可分为乐曲自动演奏模块(AUTO)、音调发生模块(TONE)和数控分频模块(FENPIN)三部分。系统的整体组装设计原理图如图1-1所示。
图1-1 系统的整体组装设计原理图
由于设计分模块组成,每个单独的模块都是一个完整的源程序,分别实现不同性质的功能,但是每个模块又是紧密关联的,前一个模块的输出很可能是后一模块的输入。如AUTO模块的音符信号输出就是TONE模块的音符信号输入。另外,时钟脉冲信号在本课程设计中用的最多,用处也最大,一般情况下时钟信号处上升沿有效,判断和控制各个计数器计数多少。简易电子琴的设计过程
根据系统设计要求,系统该系统基于计算机中时钟分频器的原理,设计采用自顶向下的设计方法,通过按键输入来控制音响或者自动演奏已存入的歌曲。它由乐曲自动演奏模块、音调发生模块和数控分频模块三部分组成。
2.1 乐曲自动演奏模块
乐曲自动演奏模块的作用是产生8位发生控制输入信号。当进行自动演奏时,由存储在此模块的8位二进制数作为发声控制输入,从而自动演奏乐曲。
该模块的VHDL源程序主要由3个工作进程组成,分别为PULSE0,MUSIC和COM1。PULSE0的作用是根据键盘输入(自动演奏)的值(0或1)来判断计数器COUNT以及脉冲CLK2的输出值。部分源程序如下:
PULSE0:PROCESS(CLK,AUTO)
--工作进程开始
VARIABLE COUNT:INTEGER RANGE 0 TO 8;
--定义计数器变量,值从0到8
IF AUTO='1'THEN
--键盘输入为1
COUNT:=0;CLK2<='0';--计数器值指0,时钟信号为0
ELSIF(CLK'EVENT AND CLK='1')THEN--时钟输入信号为1
COUNT:=COUNT+1;--计数器加1
当确定了时钟信号输出的值后,在第二个PROCESS中就可以由它控制8位发声控制输入信号了。即CLK2的值为0时,COUNT0为1。最后的COM1便是由前两个PROCESS所确定的COUNT0、AUTO和键盘输入信号值INDEX2将8位的二进制数转化为音符信号的输出,达到自动演奏的目的。部分源程序如下:
IF AUTO='0'THEN CASE COUNT0 IS WHEN 0=>INDEX0<=“00000100”;--3
WHEN 4=>INDEX0<=“00010000”;--5 该模块最主要的用途就是将输入二进制数转化为发声控制输入,是产生音符的重要步
骤,AUTO模块的源程序符号编辑图如图3-1。
图3-1 AUTO模块的符号编辑图
2.1.1乐曲演奏模块文本程序:--程序名称:AUTO.VHD--程序功能:采用VHDL语言编程产生8位发声控制输入信号。
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY AUTO IS
PORT(CLK:
IN STD_LOGIC;
--系统时钟信号
AUTO:
IN STD_LOGIC;
--键盘输入/自动演奏
CLK2: BUFFER STD_LOGIC;
--时钟输出
INDEX2: IN STD_LOGIC_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;--定义信号计数器,有32个信号元素 BEGIN PULSE0:PROCESS(CLK,AUTO)
--PULSE0工作进程开始
VARIABLE COUNT:INTEGER RANGE 0 TO 8;
--定义变量计数器,从0到8 BEGIN
IF AUTO='1'THEN
--键盘输入为1
COUNT:=0;CLK2<='0';
--计数器值为0,时钟信号2幅值为0
ELSIF(CLK'EVENT AND CLK='1')THEN
--输入的时钟信号为其他值
COUNT:=COUNT+1;
--计数器加1即为1
IF COUNT=4 THEN
CLK2<='1';
ELSIF COUNT=8 THEN
CLK2<='0';COUNT:=0;END IF;END IF;END PROCESS;MUSIC:PROCESS(CLK2)
--MUSIC工作进程开始 BEGIN
IF(CLK2'EVENT AND CLK2='1')THEN
--时钟信号2为1
IF(COUNT0=31)THEN
--计数器值为31
COUNT0<=0;
--计数器清0 ELSE
COUNT0<=COUNT0+1;
END IF;END IF;END PROCESS;COM1:PROCESS(COUNT0,AUTO,INDEX2)BEGIN IF AUTO='0'THEN
--键盘输入为0 CASE COUNT0 IS
--由计数器从0到31的取值判断音符信号的8位二进制数
WHEN 0=>INDEX0<=“00000100”;
--3 WHEN 1=>INDEX0<=“00000100”;
--3 WHEN 2=>INDEX0<=“00000100”;
--3 WHEN 3=>INDEX0<=“00000100”;
WHEN 4=>INDEX0<=“00010000”;
WHEN 5=>INDEX0<=“00010000”;
WHEN 6=>INDEX0<=“00010000”;
WHEN 7=>INDEX0<=“00100000”;
WHEN 8=>INDEX0<=“10000000”;
WHEN 9=>INDEX0<=“10000000”;
WHEN 10=>INDEX0<=“10000000”;WHEN 11=>INDEX0<=“00000100”;WHEN 12=>INDEX0<=“00000010”;WHEN 13=>INDEX0<=“00000010”;WHEN 14=>INDEX0<=“00000001”;WHEN 15=>INDEX0<=“00000001”;WHEN 16=>INDEX0<=“00010000”;WHEN 17=>INDEX0<=“00010000”;WHEN 18=>INDEX0<=“00001000”;WHEN 19=>INDEX0<=“00001000”;WHEN 20=>INDEX0<=“00001000”;WHEN 21=>INDEX0<=“00000100”;WHEN 22=>INDEX0<=“00000010”;WHEN 23=>INDEX0<=“00000010”;WHEN 24=>INDEX0<=“00010000”;WHEN 25=>INDEX0<=“00010000”;WHEN 26=>INDEX0<=“00001000”;WHEN 27=>INDEX0<=“00001000”;WHEN 28=>INDEX0<=“00000100”;WHEN 29=>INDEX0<=“00000100”;WHEN 30=>INDEX0<=“00000010”;WHEN 31=>INDEX0<=“00000010”;WHEN OTHERS=>NULL;END CASE;ELSE INDEX0<=INDEX2;
END IF;END PROCESS;END BEHAVIORAL;
2.2 音调发生模块
--3--5--5--5--6--8--8--8--3--2--2--1--1--5--5--4--4--4--3--2--2--5--5--4--4--3--3--2--2
--将音符信号0的值赋给音符信号2
音调发生模块的作用是产生音阶的分频预置值。当8位发声控制输入信号中的某一位为高电平时,则对应某一音阶的数值将输出,该数值即为该音阶的分频预置值,分频预置值控制数控分频模块进行分频,由此得到每个音阶对应的频率。
该模块的唯一输入信号INDEX对应就是自动模块中最后的输出INDEX0,音符显示信号CODE,高低音显示信号HIGH和音符分频系数都是根据音符输入确定的。比如我们自定义INDEX第8位为高电平时,它的分频系数则为773Hz,音符显示信号为1001111,即是773的二进制表示,此时高低音显示1表示高音。部分源程序如下: CASE INDEX IS WHEN“00000010”=>TONE0<=912;CODE<=“0010010”;HIGH<='1';--音符第7位为1,分频数912Hz,音符显示为0010010,属高音 WHEN“01000000”=>TONE0<=1372;CODE<=“0001111”;HIGH<='0';WHEN OTHERS =>TONE0<=2047;CODE<=“0000001”;HIGH<='0';显然,该模块最主要的作用就是给音符输入预设频率值,因为,电子琴最终实现乐曲演奏就是输出不同频率的正弦波,此模块就是将二进制发声信号转化为对应的频率。
3—2 TONE模块的符号编辑图
2.2.1音调发生模块文本程序:--程序名称:TONE.VHD--程序功能:采用VHDL语言编程产生音阶的分频预置值。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY TONE IS PORT(INDEX: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
--音符输入信号
CODE: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);--音符显示信号
HIGH: OUT STD_LOGIC;
--高低音显示信号
TONE0:OUT INTEGER RANGE 0 TO 2047);
--音符的分频系数 END TONE;ARCHITECTURE ART OF TONE IS BEGIN SEARCH:PROCESS(INDEX)
BEGIN CASE INDEX IS WHEN“00000001”=>TONE0<=773;CODE<=“1001111”;HIGH<='1';
--分频系数773Hz,音符显示1001111,显示低音
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';WHEN OTHERS =>TONE0<=2047;CODE<=“0000001”;HIGH<='0';END CASE;END PROCESS;END ART;2.3 数控分频模块
数控分频模块是对时基脉冲进行分频,得到与0、1、2、3、4、5、6、7八个音符相对应的频率。FENPIN模块的源程序符号编辑图如图3-3。
3—3 FENPIN模块符号编辑图
该模块主要由4个工作进程组成。首先,根据系统时钟信号的输入得到时基脉冲以及计数器的值,而时钟信号在AUTO模块中便已给出,两者之间的设置关系类似于AUTO模块中第一个工作进程的设置。第二个PROCESS是此模块的核心,即由时基脉冲值转化为音符的频率。部分源程序如下:
VARIABLE COUNT11:INTEGER RANGE 0 TO 2047;--定义频率计数器,从0到2047Hz
IF(PRECLK'EVENT AND PRECLK='1')THEN--时基脉冲为1时
IF COUNT11 --频率计数器小于音符分频系数 COUNT11:=COUNT11+1;FULLSPKS<='1';--计数加1,扬声器音频为1 ELSE COUNT11:=0;FULLSPKS<='0';最后一个PROCESS则是用来设置扬声器输出信号的,扬声器信号由0和1控制,当且仅当前一个PROCESS中的FULLSPKS输出为1时,扬声器才有输出,再根据计数器取值来确定输出是1还是0。部分源程序如下: IF(FULLSPKS'EVENT AND FULLSPKS='1')THEN--扬声器音频信号为1 COUNT2:=NOT COUNT2; IF COUNT2='1'THEN SPKS<='1'; --扬声器输出为1 ELSE SPK<=’0’; .2.3.1数控分频模块文本程序: 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;--音符分频系? SPKS: OUT STD_LOGIC); --驱动扬声器的音频信? END ENTITY FENPIN; ARCHITECTURE ART OF FENPIN IS SIGNAL PRECLK:STD_LOGIC; --定义时基脉冲信号 SIGNAL FULLSPKS:STD_LOGIC;BEGIN PROCESS(CLK1)VARIABLE COUNT:INTEGER RANGE 0 TO 8 :=0; --定义变量计数器,从0到8 BEGIN IF(CLK1'EVENT AND CLK1='1')THEN --据时钟信号为1时 COUNT:=COUNT+1; --判断计数器取值为1 IF COUNT=2 THEN PRECLK<='1';ELSIF COUNT=4 THEN --若计数器计4 PRECLK<='0'; COUNT:=0;--时基脉冲为0,计数器清零 ELSE END IF;END IF;END PROCESS;PROCESS(PRECLK,TONE1)VARIABLE COUNT11:INTEGER RANGE 0 TO 2047;--定义变量频率计数器11,从0到2047Hz BEGIN IF(PRECLK'EVENT AND PRECLK='1')THEN --PRECLK脉冲上升沿触发 IF COUNT11 --若计数器11值小于音符信号1 COUNT11:=COUNT11+1; FULLSPKS<='1'; --计数器加1,音频信号为1 ELSE COUNT11:=0; FULLSPKS<='0'; END IF;END IF; END PROCESS;PROCESS(FULLSPKS) --音频信号输出进程开始--VARIABLE count2:integer range 0 to 1 :=0; --定义变量计数器2,初值为0--BEGIN IF(FULLSPKS'EVENT AND FULLSPKS='1')THEN if count2=1 then count2:= 0; else count2:=1; end if; IF COUNT2=1 THEN SPKS<='1'; ELSE SPKS<='0'; END IF;END IF;END PROCESS;END ART;2.4 顶层设计 该DIANZIQIN模块是整个电子琴设计的核心,也是VHDL程序的主程序,前面3个源程序都是作为子程序分别实现电子琴的某一功能,而DIANZIQIN模块则通过调用子程序最终实现乐曲演奏的目的,奏出美妙的乐曲。利用VHDL语言COMPONENT将三个模块组合起来,其中3个模块和DIANZIQIN模块的输入输出是一一对应的,比如AUTO对应HANDTOAUTO,TONE0对应TONE2,SPKS对应SPKOUT等,该模块的符号编辑图如图3-4。 图3-4 DIANZIQIN系统模块的符号编辑图 该图描述的是DIANZIQIN模块输入输出的变量表示,整个系统的整体组装设计原理图就是这4幅编辑图按输入输出关系顺序连接而成的。2..4.1顶层模块文本程序:--程序名称:DIANZIQIN.VHD--程序功能:采用VHDL语言编写主程序调用3个子程序,实现乐曲演奏的功能。LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY DIANZIQIN IS PORT(CLK32MHZ: IN STD_LOGIC; --系统时钟信号 HANDTOAUTO: IN STD_LOGIC; --键盘输入/自动演奏信号 CODE1: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);--音符显示信号 INDEX1: IN STD_LOGIC_VECTOR(7 DOWNTO 0); --键盘输入信号 HIGH1: OUT STD_LOGIC; --高低音节信号 SPKOUT: OUT STD_LOGIC); --音频信号 END;ARCHITECTURE ART OF DIANZIQIN IS COMPONENT AUTO --引用 AUTO元件 PORT(CLK: IN STD_LOGIC; AUTO: IN STD_LOGIC; --输入自动演奏信号 INDEX2: IN STD_LOGIC_VECTOR(7 DOWNTO 0); --输入8位控制信号 INDEX0: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --输出8位的音符 END COMPONENT;COMPONENT TONE --引用TONE元件 PORT(INDEX: IN STD_LOGIC_VECTOR(7 DOWNTO 0); CODE: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); HIGH: OUT STD_LOGIC; TONE0: OUT INTEGER RANGE 0 TO 2047);END COMPONENT;COMPONENT FENPIN --引用FENPIN元件 PORT(CLK1: IN STD_LOGIC; TONE1: IN INTEGER RANGE 0 TO 2047; SPKS: OUT STD_LOGIC);END COMPONENT;SIGNAL TONE2:INTEGER RANGE 0 TO 2047; --定义主程序音调频率信号 SIGNAL INDX:STD_LOGIC_VECTOR(7 DOWNTO 0); --定义8位的音符信号 BEGIN U0:AUTO PORT MAP(CLK=>CLK32MHZ,INDEX2=>INDEX1,INDEX0=>INDX,AUTO=>HANDTOAUTO); --调用自动演奏模块 U1:TONE PORT MAP(INDEX=>INDX,TONE0=>TONE2,CODE=>CODE1,HIGH=>HIGH1);--调用音调发 生模块 U2:FENPIN PORT MAP(CLK1=>CLK32MHZ,TONE1=>TONE2,SPKS=>SPKOUT);END ART; --调用数控分频模块 系统仿真 系统仿真是在实际系统上进行实验研究比较困难时适用的必不可少的工具,它是指通过系统模型实验去研究一个已经存在或正在设计的系统的过程,通俗地讲,就是进行模型实验。因而,系统仿真的结果决定整个课程设计任务完成的到位程度。 3.1 时序仿真 编译完成后,可以对所进行的设计进行仿真,下面介绍一下仿真的步骤。(1)在file下拉菜单中选择new,再在其弹出的对话框中点选,点击OK确定,则进入了文本编辑器,在编辑区输入程序,然后保存为.vhd文件(注意保存时实体名要与文件名一致,否则编译时会出错);接下来在file下来菜单选择project,在其下拉菜单中选Assign,在其下拉菜单中选device,最后选择,建立工程文件。第三步,在菜单栏里选择,再选,确定即可;第四步,在菜单栏中点击MAX+plusII再用下拉菜单中选compiler进行编译。 (2)打开波形编辑器,在Node菜单中选择Enter Nodes from SNF项,列出所有的信号,选择所需要的信号,然后画出输入信号的波形,最后将该文件以.scf的扩展名 存盘。 (3)在MAX+plusⅡ菜单中打开仿真器窗口,单击Start按钮,当仿真器结束工作时,单击Open SCF按钮,就可以看到仿真的结果。 本课程设计的仿真平台是MAX+plusⅡ,通过对VHDL源程序进行编译检错,然后创建波形文件(后缀名为.scf),加入输入输出变量,选择适用的芯片(EPF10K10LC84-3)以及设定仿真结束时间(100us),设置好输入初值进行仿真,得到仿真波形图。由于电子琴4个模块都是独立的程序,可分别对各个程序仿真,验证输入输出的正确性,但在最终能演奏出乐曲的则是顶层设计模块。 3.1.1乐曲自动演奏模块的仿真如图3-1所示。 图3-1 乐曲自动演奏模块的仿真图 该图输入系统时钟信号CLK初值设为0,自动演奏AUTO设为1,键盘输入信号INDEX2为00,INDEX0为音符信号输出,是8位的二进制代码它根据COUNT0的值改变而改变。 3.1.2音调发生模块的仿真如图3-2所示。 图3-2 音调发生模块的仿真图 该图输入音符信号INDEX初值为00,输出是音符显示信号CODE为01,高低音显示信号为0,音符的分频系数为11111111即2047Hz。 3.1.3数控分频模块的仿真如图3-3所示。 图3- 3数控分频模块的仿真图 该图输入系统时钟信号CLK1初值为0(各输出值都是在时钟信号的下降沿有效),音符分频系数TONE1为00100000即1290Hz,驱动扬声器的音频信号SPKS输出为1。 3.1.4简易电子琴整个系统的仿真如图3-4所示。 图3-4 简易电子琴整个系统的仿真图 该图输入系统时钟信号CLK32MHZ初值为0,自动演奏信号HANDTOAUTO初值为0,键盘输入信号INDEX1为00000000;输出音符信号CODE1则为0110000,高低音节信号HIGH1变为1,即高音,音频信号SPKOUT即输出0,输出为1时CODE1变为0110100,这时出现10ns的延时。在仿真时由于系统各方面原因影响,出现延时属于正常现象。 3.2原理图综合时序仿真 步骤: 1、在file下拉菜单里面选择new,再在其弹出的对话框中点选,即可进入原理图编辑界面,右击鼠标选择(enter symbol..)则会弹出如右图的对话框,然后左键分别双击对话框中Symbol File栏中的 AUTO、FENPIN和TONE则会调入相应模块的原理图,然后按照电子琴设计要求将各个模块连接起来,组成完整的电子琴演奏系统,如图3-5所示。 3-5 系统的整体组装设计原理图 将绘制好的原理图保存,确保无误后运行进行仿真。 2、时序仿真:(1)建立波形文件。(2)输入信号近点。(3)设置波形参数。(4)设置仿真时间宽度。(5)加上输入信号。(6)波形文件存盘。(7)运行仿真器。(8)观察分析波形。之后得到的仿真时序图如图3-6所示。 图3-6系统原理图仿真时序图 3.3 问题分析 在此次课程理论设计中,不可避免地遇到许多棘手的问题,一是对EDA技术的不太了解,二是对理论知识的学习不够扎实,初涉VHDL语言以致很多语法和语言基本结构、算法生疏,运用不灵活。因此,在编写源程序上遇到极大的难题,而且在编译运行程序时对出错的语句理解不到位,导致难于下手修正错误语句、语法,这使得在设计程序时遇到更大的很大的麻烦。还有就是VHDL语言的数据类型和语法结构都很容易造成混淆,比如IN STD_LOGIC_VECTOR(7 DOWNTO 0)语句,它有时既可以认为是从7下降到0,也可认为是从0上升到7,当输入有多位时,这就容易造成在读懂仿真波形图时读位数倒置,使仿真现象与理论结果相出入。 在分频模块程序设计时遇到了编译不出来,图形错误等编译时总是出现非法的错误,经过老师修改和指正,最后终于编译成功,完成了该系统的文本设计。设计小结 通过这本的HDL课程设计,既锻炼了我的动手能力,也让我加深了对课堂上所学到的理论知识的理解,这给我提供了一个在学习生活中很难得的理论联系实际的机会,让了深刻体验到在对于设计时遇到的不同问题时,首先应该理解问题关键所在,因为用语言编写程序需要仔细认真的态度,一点点错误漏洞将导致整个源程序无法编译运行,阻碍下一步工作完成进度。 还有我也发现了在平时学习过程中难于发现的许多缺点不足。比如实践的机会过少,所学的理论知识不能够灵活运用,因此在遇到实际的问题时无法正确处理;再者在课堂上获得的专业知识过于浅显,很多的有关基本操作原理、操作方法都理解不了;课外知识了解的也过少,导致在课程设计初期,面对完全陌生的设计课题无从下手,不知所措。这就 提醒我在注重学好理论的同时,更要加强动手的能力,不要一味的照搬课本上的知识,要创新,才能在当今竞争激烈的社会中立足,记住,命运掌握在自己手里,一切都只能靠我们自己。 课程设计 1.1 课程设计目的……………………………………………………1 1.2 课程设计内容……………………………………………………………1 1.3 课程设计原理……………………………………………………………1 简易电子琴的设计过程 2.1 乐曲自动演奏模块………………………………………………………2 2.1.1乐曲演奏模块文本程序……………………………………………………………3 2.2 音调发生模块……………………………………………………………4 2.2.1音调发生模块文本程序………………………………………………………………5 2.3 数控分频模块……………………………………………………………6.2.3.1数控分频模块文本程序 …………………………………………………………7 2.4 顶层设计…………………………………………………………………8 2..4.1顶层模块文本程序 ………………………………………………………………9 系统仿真 3.1 时序仿真…………………………………………………………………10 3.1.1乐曲自动演奏模块的仿真…………………………………………………………11 3.1.2音调发生模块的仿真………………………………………………………………11 3.1.3数控分频模块的仿真………………………………………………………………11 3.1.4简易电子琴整个系统的仿真………………………………………………………11 3.2原理图综合时序仿真……………………………………………………12 3.3 问题分析…………………………………………………………………13 4 设计小结…………………………………………………………14 《EDA技术实用教程》课程设计 课程设计报告 课 题: EDA电子琴 课程名称: EDA技术实用教程 学院名称: 物理电气信息学院 班 级: 2011级通信工程(1)班 学生姓名: 安 昱 学 号: 12011243986 指导教师: 杨泽林 2013年12月26日 EDA技术实用教程课程设计 EDA电子琴 摘 要 :本课程设计主要采用EDA技术设计一个简易的八音符电子琴,它可通过按键输入来控制音响从而演奏出已存入的乐曲。在课程设计中,系统开发平台为Windows XP,程序设计采用VHDL语言,程序运行平台为Quartus II。然后编写程序实现电子琴的各项功能,使不同的音阶对应不同频率的正弦波,按下不同的键时发出对应频率的声音。程序通过调试运行,时序仿真,电路功能验证,顺利地实现了设计目标。关键词 : 电子琴;EDA;VHDL;音阶;频率 1、引 言 随着信息科学的进步,现代电子产品的性能越来越高,复杂度越来越大,更新步伐也越来越快,电子技术的发展进入了划时代的阶段。其中电子技术的核心便是电子设计自动化EDA(Electronic Design Automatic)技术。EDA是指以计算机为工作平台,融合了应用电子技术、计算机技术、智能化技术的最新成果而开发出的电子CAD通用软件包,它根据硬件描述语言VHDL完成的设计文件,自动完成逻辑编译、化简、分割、综合、优化、布局布线及仿真,直至完成对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。本课程设计就是采用EDA技术描述语言VHDL编程实现简易电子琴的各项功能,是EDA技术应用于实际的一个很好的例子。 1.1 课程设计目的 本课程设计主要是基于VHDL文本输入法设计乐曲演奏电路,该系统基于计算机中时钟分频器的原理,采用自顶向下的设计方法来实现,通过按键输入来控制音响或者自动演奏已存入的歌曲。系统由乐曲自动演奏模块、音调发生模块和数控分频模块三个部分组成。系统实现是用硬件描述语言VHDL按模块化方式进行设计,然后进行编程、时序仿真、电路功能验证,奏出美妙的乐曲。该设计最重要的一点就是通过按键控制不同的音调发生,每一个音调对应不同的频率,从而输出对应频率的声音。 1.2 课程设计内容 (1)设计一个简易的八音符电子琴,它可通过按键输入来控制音响。 (2)系统演奏时可以选择是手动演奏(由键盘输入)还是自动演奏已存入的乐曲。EDA技术实用教程课程设计 (3)能够自动演奏多首乐曲,且乐曲可重复演奏。 1.3 课程设计原理 本课程设计目的在于灵活运用EDA技术编程实现一个简易电子琴的乐曲演奏,它要求在实验箱上构造一个电子琴电路,不同的音阶对应不同频率的正弦波。按下每个代表不同音阶的按键时,能够发出对应频率的声音。故系统可分为乐曲自动演奏模块(AUTO)、音调发生模块(TONE)和数控分频模块(FENPIN)三部分。系统的整体组装设计原理图如1-1所示。 图1-1系统的整体组装设计原理图 由于设计分模块组成,每个单独的模块都是一个完整的源程序,分别实现不同性质的功能,但是每个模块又是紧密关联的,前一个模块的输出很可能是后一模块的输入。如AUTO模块的音符信号输出就是TONE模块的音符信号输入。另外,时钟脉冲信号在本课程设计中用的最多,用处也最大,一般情况下时钟信号处上升沿有效,判断和控制各个计数器计数多少。、EDA、VHDL简介 EDA技术是以计算机为工作平台,融合了应用电子技术、计算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动设计。EDA可提供文本输入以及图形编辑的方法将设计者的意图用程序或者图形方式表达出来,而我们经常用到的VHDL语言便是用于编写源程序所需的最常见的硬件描述语言(VHDL)之一。 2.1 EDA技术 EDA是电子设计自动化(Electronic Design Automation)缩写,是90年代初从CAD、CAM、CAT和CAE的概念发展而来的。EDA技术是电子设计的发展趋势,利用EDA工具可以代替设计者完成电子系统设计中的大部分工作。EDA工具从数字系统设计的单一领域,EDA技术实用教程课程设计 发展到今天,应用范围已涉及模拟、微波等多个领域,可以实现各个领域电子系统设计的测试、设计方针和布局布线等。 现在对EDA的概念或范畴用得很宽,包括在机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域,都有EDA的应用。目前EDA主要辅助进行三个方面的设计工作:IC设计、电子电路设计和PCB设计。 2.2 VHDL语言 常用硬件描述语言有VHDL、Verilog和ABEL语言,而VHDL主要用于描述数字系统的结构、行为、功能和接口。除了含有许多具有硬件特征的语句外,VHDL的结构特点是将设计实体的内部功能和算法完成部分。 相对于其他硬件语言,VHDL有许多优点。比如VHDL的行为描述能力更强,而且具有丰富的仿真语句和库函数,随时可对系统进行仿真模拟,使设计者对整个工程的结构和功能可行性做出判断;另外,由于具有类属描述语句和子程序调用等功能,对于完成的设计,在不改变源程序的条件下,只需改变类属参量和函数,就能轻易地改变设计的规模和结构。 3、简易电子琴的设计过程 根据系统设计要求,系统该系统基于计算机中时钟分频器的原理,设计采用自顶向下的设计方法,通过按键输入来控制音响或者自动演奏已存入的歌曲。它由乐曲自动演奏模块、音调发生模块和数控分频模块三部分组成。 3.1 乐曲自动演奏模块 乐曲自动演奏模块的作用是产生8位发生控制输入信号。当进行自动演奏时,由存储在此模块的8位二进制数作为发声控制输入,从而自动演奏乐曲。 该模块的VHDL源程序主要由3个工作进程组成,分别为PULSE0,MUSIC和COM1。PULSE0的作用是根据键盘输入(自动演奏)的值(0或1)来判断计数器COUNT以及脉冲CLK2的输出值。部分源程序如下: PULSE0:PROCESS(CLK,AUTO) --工作进程开始 VARIABLE COUNT:INTEGER RANGE 0 TO 8; --定义计数器变量,值从0到8 IF AUTO='1'THEN --键盘输入为 1COUNT:=0;CLK2<='0';--计数器值指0,时钟信号为0 ELSIF(CLK'EVENT AND CLK='1')THEN--时钟输入信号为1 EDA技术实用教程课程设计 COUNT:=COUNT+1;--计数器加1 当确定了时钟信号输出的值后,在第二个PROCESS中就可以由它控制8位发声控制输入信号了。即CLK2的值为0时,COUNT0为1。最后的COM1便是由前两个PROCESS所确定的COUNT0、AUTO和键盘输入信号值INDEX2将8位的二进制数转化为音符信号的输出,达到自动演奏的目的。部分源程序如下: IF AUTO='0'THEN CASE COUNT0 IS WHEN 0=>INDEX0<=“00000100”;--3 WHEN 4=>INDEX0<=“00010000”;--5 该模块最主要的用途就是将输入二进制数转化为发声控制输入,是产生音符的重要步骤,AUTO模块的源程序符号编辑图如图3-1 图3-1 AUTO模块的符号编辑图 3.2 音调发生模块 音调发生模块的作用是产生音阶的分频预置值。当8位发声控制输入信号中的某一位为高电平时,则对应某一音阶的数值将输出,该数值即为该音阶的分频预置值,分频预置值控制数控分频模块进行分频,由此得到每个音阶对应的频率。 该模块的唯一输入信号INDEX对应就是自动模块中最后的输出INDEX0,音符显示信 EDA技术实用教程课程设计 号CODE,高低音显示信号HIGH和音符分频系数都是根据音符输入确定的。比如我们自定义INDEX第8位为高电平时,它的分频系数则为773Hz,音符显示信号为1001111,即是773的二进制表示,此时高低音显示1表示高音。部分源程序如下: CASE INDEX IS WHEN“00000010”=>TONE0<=912;CODE<=“0010010”;HIGH<='1';--音符第7位为1,分频数912Hz,音符显示为0010010,属高音 WHEN“01000000”=>TONE0<=1372;CODE<=“0001111”;HIGH<='0';WHEN OTHERS =>TONE0<=2047;CODE<=“0000001”;HIGH<='0';显然,该模块最主要的作用就是给音符输入预设频率值,因为,电子琴最终实现乐曲演奏就是输出不同频率的正弦波,此模块就是将二进制发声信号转化为对应的频率。 3.3 数控分频模块 数控分频模块是对时基脉冲进行分频,得到与0、1、2、3、4、5、6、7八个音符相对应的频率。FENPIN模块的源程序符号编辑图如图3-3。 该模块主要由4个工作进程组成。首先,根据系统时钟信号的输入得到时基脉冲以及计数器的值,而时钟信号在AUTO模块中便已给出,两者之间的设置关系类似于AUTO模块中第一个工作进程的设置。第二个PROCESS是此模块的核心,即由时基脉冲值转化为音符的频率。部分源程序如下: VARIABLE COUNT11:INTEGER RANGE 0 TO 2047;--定义频率计数器,从0到2047Hz IF(PRECLK'EVENT AND PRECLK='1')THEN--时基脉冲为1时 IF COUNT11 COUNT11:=COUNT11+1;FULLSPKS<='1';--计数加1,扬声器音频为ELSE COUNT11:=0;FULLSPKS<='0';最后一个PROCESS则是用来设置扬声器输出信号的,扬声器信号由0和1控制,当且仅当前一个PROCESS中的FULLSPKS输出为1时,扬声器才有输出,再根据计数器取值来确定输出是1还是0。部分源程序如下: IF(FULLSPKS'EVENT AND FULLSPKS='1')THEN--扬声器音频信号为1 COUNT2:=NOT COUNT2;IF COUNT2='1'THEN EDA技术实用教程课程设计 SPKS<='1'; --扬声器输出为1 ELSE SPK<=’0’; 3.4 顶层设计 该DIANZIQIN模块是整个电子琴设计的核心,也是VHDL程序的主程序,前面3个源程序都是作为子程序分别实现电子琴的某一功能,而DIANZIQIN模块则通过调用子程序最终实现乐曲演奏的目的,奏出美妙的乐曲。利用VHDL语言COMPONENT将三个模块组合起来,其中3个模块和DIANZIQIN模块的输入输出是一一对应的,比如AUTO对应HANDTOAUTO,TONE0对应TONE2,SPKS对应SPKOUT等,该模块的符号编辑图如图3-2。 图3-2 DIANZIQIN模块的符号编辑图 该图描述的是DIANZIQIN模块输入输出的变量表示,整个系统的整体组装设计原理图就是这3幅编辑图按输入输出关系顺序连接而成的。4、系统仿真 系统仿真是在实际系统上进行实验研究比较困难时适用的必不可少的工具,它是指通过系统模型实验去研究一个已经存在或正在设计的系统的过程,通俗地讲,就是进行模型实验。因而,系统仿真的结果决定整个课程设计任务完成的到位程度。 4.1 时序仿真 EDA技术实用教程课程设计 编译完成后,可以对所进行的设计进行仿真,下面简单介绍一下仿真的步骤。(1)打开波形编辑器,在Node菜单中选择Enter Nodes from SNF项,列出所有的信号,选择所需要的信号,然后画出输入信号的波形,最后将该文件以.scf的扩展名 存盘。 (2)在QuartusⅡ菜单中打开仿真器窗口,单击Start按钮,当仿真器结束工作时,就可以看到仿真的结果。 本课程设计的仿真平台是QuartusⅡ,通过对VHDL源程序进行编译检错,然后创建波形文件(后缀名为.scf),加入输入输出变量,选择适用的芯片以及设定仿真结束时间(100us),设置好输入初值进行仿真,得到仿真波形图。由于电子琴4个模块都是独立的程序,可分别对各个程序仿真,验证输入输出的正确性,但在最终能演奏出乐曲的则是顶层设计模块。 (1)乐曲自动演奏模块的仿真如图4-1所示。 图4-1乐曲自动演奏模块的仿真图 该图输入系统时钟信号CLK初值设为0,自动演奏AUTO设为1,键盘输入信号INDEX2为00,INDEX0为音符信号输出,是8位的二进制代码它根据COUNT0的值改变而改变。 (2)音调发生模块的仿真如图4-2所示。 图4-2音调发生模块的仿真图 该图输入音符信号INDEX初值为00,输出是音符显示信号CODE为01,高低音 EDA技术实用教程课程设计 显示信号为0,音符的分频系数为11111111即2047Hz。 (3)数控分频模块的仿真如图4-3所示。 图4-3数控分频模块的仿真图 该图输入系统时钟信号CLK1初值为0(各输出值都是在时钟信号的下降沿有效),音符分频系数TONE1为00100000即1290Hz,驱动扬声器的音频信号SPKS输出为1。 (4)简易电子琴整个系统的仿真如图4-4所示。 图4=4系统的仿真图 该图输入系统时简易电子琴整个钟信号CLK32MHZ初值为0,自动演奏信号HANDTOAUTO初值为0,键盘输入信号INDEX1为00000000;输出音符信号CODE1则为0110000,高低音节信号HIGH1变为1,即高音,音频信号SPKOUT即输出0,输出为1时CODE1变为0110100,这时出现10ns的延时。在仿真时由于系统各方面原因影响,出现延时属于正常现象。EDA技术实用教程课程设计 4.2 电路功能验证 在选择好芯片以及设置引脚值后,下载源程序(后缀名.sof)到此芯片上,确认编程器硬件是否已安装好。按如下步骤打开编程器窗口:在QuartusⅡ菜单中选择Programmer项,点击Configure项将配置数据下载到一个FLEX器件中。再次对源程序进行编译导入程序然后运行,扬声器发出初设的音符3,5音即报警。手按键盘或拨脉冲开关改变输入信号则扬声器发出对应的频率的声音,键盘(开关)是与芯片引脚对应相连的。 4.3 问题分析 在整个课程设计中,不可避免遇到很多难于解决的问题,一来是对EDA技术的不太了解,初涉VHDL语言以致很多语法和语言基本结构、算法生疏,运用不灵活,在编写源程序上遇到很大难题,而且在编译运行程序时对出错的语句理解不到位,难于下手修改错误语句,这使得在设计程序时遇到很大的阻碍,此外,VHDL语言的数据类型很容易造成混淆,比如IN STD_LOGIC_VECTOR(7 DOWNTO 0)语句,它有时既可以认为是从7下降到0,也可认为是从0上升到7,当输入有多位时,这就容易造成在读懂仿真波形图时读位数倒置,使仿真现象与理论结果相出入。EDA技术实用教程课程设计 在完成电路验证这一步时,对频率的选择也是一大难点,有的设计项目对频率的要求很高,需要大频率元件才能满足设计需求,若频率元件选择不恰当,将严重影响设计结果甚至没有结果输出。对于设计电子琴时,由于要求输出不同频率的声音,频率变化范围大,故需要一个12MHz的元件,对于小于这一值的频率不足以满足电路需求,仿真时只有一堆杂音输出。 在对于设计时遇到的不同问题时,首先应该理解问题关键所在,因为用语言编写程序需要仔细认真的态度,一点点错误漏洞将导致整个源程序无法编译运行,阻碍下一步工作完成进度。、结束语 通过这次VHDL课程设计,不仅增强了我们的实践动手能力,也让我们对课堂上所学到的理论知识的理解加深了许多,这给我们提供了一个在学习生活中很难得的理论联系实际的机会。能够借此机会了解到部分EDA技术的知识和学习运用其中一种硬件描述语言VHDL编程实现各种常用器件的功能,这是在哪堂讲课上都得不到的一笔财富。 另一方面我们也发现了在平时学习过程中难于发现的许多缺点跟不足。比如实践机会过少,所学的理论知识不能灵活运用,在遇到实际的问题时无法正确处理;再者在课堂上获得的专业知识过于浅显,很多的有关基本操作原理、操作方法都理解不了;课外知识了解的也过少,导致在课程设计初期,面对完全陌生的设计课题无从下手,不知所措。这就提醒我们在平时的学习生活中不能一味埋头于面前的课本知识,毕竟当今社会竞争越发激烈,而学校能教授的东西有限,要想在人才市场中脱颖而出就只能靠我们自己。当然,在学习之余我们更应该积极参加各种有关专业知识的实践活动和比赛,巩固所学理论,多注意培养初步的实际工作能力和专业技术能力,这样在以后的工作岗位上不会显得那么仓促与生疏。 参考文献 [1] 辛春艳.VHDL硬件描述语言.北京:国防工业出版社,2002 [2] 甘历.VHDL应用与开发实践.北京:科学出版社,2003 [3] VHDL Language Reference Guide,Alde Inc.Henderson NV USA,1999 [4] 齐洪喜,陆颖.VHDL电路设计实用教程.北京:清华大学出版社,2004 [5] 潘松,黄继业.EDA技术实用教程.北京:科学出版社,2002 EDA技术实用教程课程设计 附录1:乐曲自动演奏源程序清单 --程序名称:AUTO.VHD--程序功能:采用VHDL语言编程产生8位发声控制输入信号。 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY AUTO IS PORT(CLK: IN STD_LOGIC; --系统时钟信号 AUTO: IN STD_LOGIC; --键盘输入/自动演奏 CLK2: BUFFER STD_LOGIC; --时钟输出 INDEX2: IN STD_LOGIC_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;--定义信号计数器,有32个信号元素 BEGIN PULSE0:PROCESS(CLK,AUTO) --PULSE0工作进程开始 VARIABLE COUNT:INTEGER RANGE 0 TO 8; --定义变量计数器,从0到8 BEGIN IF AUTO='1'THEN --键盘输入为1 COUNT:=0;CLK2<='0'; --计数器值为0,时钟信号2幅值为0 ELSIF(CLK'EVENT AND CLK='1')THEN --输入的时钟信号为其他值 COUNT:=COUNT+1; --计数器加1即为1 IF COUNT=4 THEN CLK2<='1'; ELSIF COUNT=8 THEN CLK2<='0';COUNT:=0;END IF;END IF;END PROCESS;MUSIC:PROCESS(CLK2) --MUSIC工作进程开始 BEGIN IF(CLK2'EVENT AND CLK2='1')THEN --时钟信号2为1 IF(COUNT0=31)THEN --计数器值为31 COUNT0<=0; --计数器清0 ELSE EDA技术实用教程课程设计 COUNT0<=COUNT0+1;END IF;END IF;END PROCESS;COM1:PROCESS(COUNT0,AUTO,INDEX2)BEGIN IF AUTO='0'THEN --键盘输入为0 CASE COUNT0 IS --由计数器从0到31的取值判断音符信号的8位二进制数 WHEN 0=>INDEX0<=“00000100”; --3 WHEN 1=>INDEX0<=“00000100”; --3 WHEN 2=>INDEX0<=“00000100”; WHEN 3=>INDEX0<=“00000100”; WHEN 4=>INDEX0<=“00010000”; WHEN 5=>INDEX0<=“00010000”; WHEN 6=>INDEX0<=“00010000”; WHEN 7=>INDEX0<=“00100000”; WHEN 8=>INDEX0<=“10000000”; WHEN 9=>INDEX0<=“10000000”; WHEN 10=>INDEX0<=“10000000”; WHEN 11=>INDEX0<=“00000100”; WHEN 12=>INDEX0<=“00000010”; WHEN 13=>INDEX0<=“00000010”; WHEN 14=>INDEX0<=“00000001”; WHEN 15=>INDEX0<=“00000001”; WHEN 16=>INDEX0<=“00010000”; WHEN 17=>INDEX0<=“00010000”; WHEN 18=>INDEX0<=“00001000”; WHEN 19=>INDEX0<=“00001000”; WHEN 20=>INDEX0<=“00001000”; WHEN 21=>INDEX0<=“00000100”; WHEN 22=>INDEX0<=“00000010”; WHEN 23=>INDEX0<=“00000010”; WHEN 24=>INDEX0<=“00010000”; WHEN 25=>INDEX0<=“00010000”; WHEN 26=>INDEX0<=“00001000”; WHEN 27=>INDEX0<=“00001000”; WHEN 28=>INDEX0<=“00000100”; WHEN 29=>INDEX0<=“00000100”; WHEN 30=>INDEX0<=“00000010”; WHEN 31=>INDEX0<=“00000010”;WHEN OTHERS=>NULL;END CASE;ELSE INDEX0<=INDEX2; END IF;END PROCESS; --3--3--5--5--5--6--8--8--8--3--2--2--1--1--5--5--4--4--4--3--2--2--5--5--4--4--3--3--2--2 --将音符信号0的值赋给音符信号2 EDA技术实用教程课程设计 END BEHAVIORAL; 附录2:音调发生源程序清单 --程序名称:TONE.VHD--程序功能:采用VHDL语言编程产生音阶的分频预置值。 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY TONE IS PORT(INDEX: IN STD_LOGIC_VECTOR(7 DOWNTO 0); --音符输入信号 CODE: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);--音符显示信号 HIGH: OUT STD_LOGIC; --高低音显示信号 TONE0:OUT INTEGER RANGE 0 TO 2047); --音符的分频系数 END TONE;ARCHITECTURE ART OF TONE IS BEGIN SEARCH:PROCESS(INDEX) BEGIN CASE INDEX IS WHEN“00000001”=>TONE0<=773;CODE<=“1001111”;HIGH<='1'; --分频系数773Hz,音符显示1001111,显示低音 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';WHEN OTHERS =>TONE0<=2047;CODE<=“0000001”;HIGH<='0';END CASE;END PROCESS;END ART;EDA技术实用教程课程设计 附录3:数控分频源程序清单--程序名称:FENPIN.VHD--程序功能:采用VHDL语言编程对时基脉冲进行分频,得到8个音符相对应的频率。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;--系统时钟信号 SPKS: OUT STD_LOGIC); --音符分频系数 END ENTITY FENPIN; --驱动扬声器的音频信号 ARCHITECTURE ART OF FENPIN IS SIGNAL PRECLK:STD_LOGIC; --定义时基脉冲信号 SIGNAL FULLSPKS:STD_LOGIC;BEGIN PROCESS(CLK1)VARIABLE COUNT:INTEGER RANGE 0 TO 8; --定义变量计数器,从0到8 BEGIN IF(CLK1'EVENT AND CLK1='1')THEN --据时钟信号为1时 COUNT:=COUNT+1; --判断计数器取值为1 IF COUNT=2 THEN PRECLK<='1';ELSIF COUNT=4 THEN --若计数器计4 PRECLK<='0';COUNT:=0; --时基脉冲为0,计数器清零 END IF;END IF;END PROCESS;PROCESS(PRECLK,TONE1)VARIABLE COUNT11:INTEGER RANGE 0 TO 2047; --定义变量频率计数器11,从0 到2047Hz BEGIN IF(PRECLK'EVENT AND PRECLK='1')THEN --PRECLK脉冲上升沿触发 IF COUNT11 --若计数器11值小于音符信号1 COUNT11:=COUNT11+1;FULLSPKS<='1'; --计数器加1,音频信号为1 ELSE COUNT11:=0;FULLSPKS<='0';END IF;END IF;EDA技术实用教程课程设计 END PROCESS;PROCESS(FULLSPKS) --音频信号输出进程开始 VARIABLE COUNT2:STD_LOGIC:='0'; --定义变量计数器2,初值为0 BEGIN IF(FULLSPKS'EVENT AND FULLSPKS='1')THEN --音频信号输出上升沿有效时 COUNT2:=NOT COUNT2;IF COUNT2='1'THEN SPKS<='1';ELSE SPKS<='0';END IF;END IF;END PROCESS;END ART;EDA技术实用教程课程设计 附录4:顶层设计源程序清单 --程序名称:DIANZIQIN.VHD--程序功能:采用VHDL语言编写主程序调用3个子程序,实现乐曲演奏的功能。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DIANZIQIN IS PORT(CLK32MHZ: IN STD_LOGIC; --系统时钟信号 HANDTOAUTO: IN STD_LOGIC; --键盘输入/自动演奏信号 CODE1: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);--音符显示信号 INDEX1: IN STD_LOGIC_VECTOR(7 DOWNTO 0); --键盘输入信号 HIGH1: OUT STD_LOGIC; --高低音节信号 SPKOUT: OUT STD_LOGIC); --音频信号 END;ARCHITECTURE ART OF DIANZIQIN IS COMPONENT AUTO --引用 AUTO元件 PORT(CLK: IN STD_LOGIC; AUTO: IN STD_LOGIC; --输入自动演奏信号 INDEX2: IN STD_LOGIC_VECTOR(7 DOWNTO 0); --输入8位控制信号 INDEX0: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --输出8位的音符 END COMPONENT;COMPONENT TONE --引用TONE元件 PORT(INDEX: IN STD_LOGIC_VECTOR(7 DOWNTO 0); CODE: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); HIGH: OUT STD_LOGIC; TONE0: OUT INTEGER RANGE 0 TO 2047);END COMPONENT;COMPONENT FENPIN --引用FENPIN元件 PORT(CLK1: IN STD_LOGIC; TONE1: IN INTEGER RANGE 0 TO 2047; SPKS: OUT STD_LOGIC);END COMPONENT;SIGNAL TONE2:INTEGER RANGE 0 TO 2047; --定义主程序音调频率信号 SIGNAL INDX:STD_LOGIC_VECTOR(7 DOWNTO 0); --定义8位的音符信号 BEGIN U0:AUTO PORT MAP(CLK=>CLK32MHZ,INDEX2=>INDEX1,INDEX0=>INDX,AUTO=>HANDTOAUTO); --调用自动演奏模块 EDA技术实用教程课程设计 U1:TONE PORT MAP(INDEX=>INDX,TONE0=>TONE2,CODE=>CODE1,HIGH=>HIGH1);--调用音调发 生模块 U2:FENPIN PORT MAP(CLK1=>CLK32MHZ,TONE1=>TONE2,SPKS=>SPKOUT);END ART; --调用数控分频模块 简易电子琴的设计和实现 ----结题报告 学号:110342241 姓名:章译文 一.设计要求 1.能发出1234567基本音。 2.能自动播放《偶像万万岁》和《梁祝》。3.能在数码管上显示弹奏时的音名。 二.设计原理分析 1.音阶的获得 系统要求要求用7个按键控制发声,我们用7个键盘来控制产生低音(或中音)段的7个音阶频率。所有的音名频率都是通过一个基准频率经过分频得到的。但部分分频过大的音频直接输出给扬声器,频率信号脉冲的占空比会非常窄,不能驱动扬声器工作。于是,我们设计了一个“带有预置数的计数器”来简化整个设计过程。将原频率分频成期望值的2倍频率信号。再通过二分频,驱动扬声器工作。 简易电子琴控制流程图 2.MUSICAL_NOTE内部电路 MUSICAL_NOTE内部电路 使用MUSICAL_NOTE电路,实现初值可变的计数器,并对音阶实现二分频,使电子琴实现正常发音。 按键播放部分电路 3.自动播放功能的实现 自动播放部分电路 Hebing.mif文件(偶像万万岁&梁祝) 歌曲长度为352位,利用三个74261设计0~352的计数器,自动寻址,将音频导入lpm_rom,与MUSICAL_NOTE相互作用,实现自动播放。 按键除颤电路原理图 作为机械开关的键盘,在按键操作时,机械触点的弹性及电压跳动等原因,再触点闭合或者开启的瞬间会出现电压的抖动,如果不进行处理就会造成误操作。按键去抖动的关键在于提取稳定的低电平状态,滤去前沿后沿的抖动毛刺。4.在数码管上显示弹奏时的音名 显示部分电路图 Display内部电路 电路中的74161是16进制的计数器,它的低三位接到3—8译码器模块74138的地址输入端,这样就可以实现74138的8个输出端轮流输出低电平,恰好用来控制“位码”DIG7~DIG0。LPM_MUX是QuartusⅡ中的宏模块,用来实现多位的“多选一”,它的数据位数可以以及数据的数量可以任意设定。 电路中使用了与非门,实现发音与现实同时实现,在此要注意的是,因为使用了与非门,静态字符现实数码管管脚的设定值应该与原值相反。 三.设计原理图 简易电子琴原理图 根据以上分析,将三个模块组合,便得到了简易电子琴的整体设计。在整体设计的过程中,要注意三个模块之间的关系,使其能够相互作用,正常发音和显示。 四.实验总结 在这三天的实验过程中,通过对于实验目的的分析,有目标的查找资料,研读教材,在分清楚模块的基础上,写下了实验计划,规划好时间,确定每天要做的事。在实验的第一天,实现了按键发音,同时,也基本弄清楚了自动播放的原理,有了设计思路,第二天上午,完成了自动循环播放的功能,下午在同学的帮助下,确定了数码管显示的基本思路,通过对于以前知识的复习和查找,成功实现了数码管的显示功能。 在实验的过程中,也遇到很多的困难。在自动播放的时候,由于没有修改hebing.mif的进制,音乐总不能正常播放。还有就是在数码管显示的时候,一开始没有弄清与非门的作用,显示的数字总是反着的。后来经过冷静的分析,在老师和同学的帮助下,成功完成了电子琴的设计,实现了所有的功能。当然,设计也还有很多可以完善和改进的地方,在以后的学习过程中,我会更加用心,多做,多思考。 这次课程设计,我受益匪浅,这种认真研读,查找资料,动手操作的学习方式,应该贯彻到每一门课程的学习,也应该贯彻到我们的生活中。一直保持这样的方式,不管做什么事,都会取得很好的结果。 单片机课程设计报告 题目: 电子琴 设计者1: 蓝 琴 负责任务: 硬件制作 专业班级/学号: 应用电子技术0906010136 设计者2: 罗炎华 负责任务: 软件编程 专业班级/学号: 应用电子技术0906010423 指导教师1: 陈玉琼 答辩时间: 2011-6-23 目录 一、选题的背景.......................................................................................................................3 选题的来源、意义和目的:...................................................................................................3 课题承担人员及分工说明:...................................................................................................3 二、课题总体设计说明...........................................................................................................3 1、总体开发计划和课题所达到的功能目标和技术指标:.................................................3 2、划课题总体设计方案,比较几个备选方案,确定最终方案.........................................3 系统功能框图...........................................................................................................................4 三、硬件设计说明...................................................................................................................4 1、硬件总体设计方案.............................................................................................................4 四、软件设计说明...................................................................................................................6 1、软件总体设计方案.............................................................................................................6 五、软硬件调试说明...............................................................................................................6 1、硬件性能测试.....................................................................................................................6 2、软件性能测试.....................................................................................................................7 六、课题开发总结...................................................................................................................7 1、课题的任务完成情况.........................................................................................................7 2、硬件宏观上的设计要点.....................................................................................................7 3、软件宏观上的设计要点.....................................................................................................7 七、用户操作说.......................................................................................................................7 八、参考资料...........................................................................................................................7 九、附件...................................................................................................................................8 1、硬件设计的总电路原理图、PCB版图............................................................................8 2、元器件清单(器件名称、型号、在原理图中的编号)...............................................10 3、硬件电路板外观图片、PROTEUS仿真效果图............................................................11 源程序代码.............................................................................................................................12 一、选题的背景 选题的来源、意义和目的: 选题来源:对定时器资源的使用——音乐盒的控制小组成员均对音乐盒有兴趣。选题意义:自学矩阵式按键。 选题目的:实现各按键对应音阶音频输出,数码管显示相应的音阶。 课题承担人员及分工说明: 罗炎华具有较强的逻辑能力,熟悉汇编语言。蓝琴据有较强的动手能力,熟悉电子元件 二、课题总体设计说明 1、总体开发计划和课题所达到的功能目标和技术指标: 5X5矩阵式按键,其中21个键控制21个音阶,4个按键控制点阵的显示,每个音阶音频输出通过功放放大,同时数码管显示音阶。 2、划课题总体设计方案,比较几个备选方案,确定最终方案 硬件: 方案一 :将包含单片机控制,数码管显示,点阵显示,矩阵式按键,功 放模块的电路制作在一块PCB图上。 方案二:将单片机控制,数码管显示,点阵显示,矩阵式按键,功放各模 块分开制作,用杜邦先连接。 方案三:单片机控制模块采用单片机学习板,分有源模块和无源模块制作。因制PCB材料缺乏最终确定方案三 软件: 方案一:通过单片机控制,矩阵按键,来产生不同的音阶,后通过数码显示不同的音阶,还四个按键,来播放不同的音乐。 方案二:通过单片机控制,矩阵按键,来产生不同的音阶,后通过数码管显示不同的音阶,还四个按键,控制点阵,显示我们需要的信 最后确定工作方案二 系统功能框图 三、硬件设计说明 1、硬件总体设计方案 (1)硬件设计目标 单片机控制部分由51单片机学习板代替。数码管点阵显示,音频功放PCB板制作,按键面包板制作,为了资源的重复使用各模块分开制作。(2)硬件功能模块划分单片机控制 数码管显示 查询相关资料了解4X数码管,74LS04的各引脚功能,按要求连接。本设计中用到的是共阳数码管,74LS04也可以用9012三极管代替。 点阵显示 用数字或模拟万用表测量点阵,红表笔接一端,黑表笔接一端,有点亮的红表笔接的是行用数字表示,黑表笔接的是列用字母表示,测得结果如图示。按要求连接。 矩阵按键 用数字或模拟万用表测量按键,红表笔接一端,黑表笔接一端,按下按键观察是否导通,选择能导通的两引脚按一定的规律连接。 音频功放 这部分也可以用其他的功放电路代替,如TDA2030A。 3)主控芯片和关键元器件的选型、接口和连接方式定义 主控芯片:STC89C51RC 关键元件的选型:共阳4X数码管,74LS245,74LS04,8X8红色点阵GYXM-1538ASR 接口:P0.0-P0.4矩阵按键列口,P0.5音频输出P2.0-P2.4矩阵式按键行口,P2.5-P2.7数码管位选,P3口点阵列口,P1口数码管段选,点阵行口。 四、软件设计说明 1、软件总体设计方案 通过单片机控制,矩阵按键,来产生不同的音阶,后通过数码管显示不同的音阶,还四个按键,控制点阵,显示我们需要的信(1)软件设计目标 产生21个音阶 (2)软件功能模块划分 按键一个模块,产生音阶一个模块,数码管显示一个模块,点阵一个模块 2、软件设计 开始否判断有无键按下是判断是否为音阶按键否汉字显示按键是数码管显示其音阶号,并放出音阶点阵显示相应的按键是结束 五、软硬件调试说明 1、硬件性能测试 按下相应的按键蜂鸣器或功放放出相应的音阶,同时数码管显示相应的音阶数或点阵显示相应的汉字。 2、软件性能测试 按下按键,看是否发出相应的音阶的声音,同时看一下,数码管,显示的是否正确,按下22.23.24.25键看是否点阵有显示 六、课题开发总结 1、课题的任务完成情况:课题任务基本完成,与预期的大体符合。但作品性能有待提高,存在着噪音较大,反应时间较长,接线复杂,外观不完美的缺点。其优点是操作简单,形象直观。 2、硬件宏观上的设计要点: 设计要点在数码管显示,点阵显示,及音频功放,注意音频功放的散热问题,性能基本达到,但线路布局有待完善,点阵的移引脚有被烧坏导致不正常显示。 3、软件宏观上的设计要点: 按键扫描,同时要确定是那个按键按下,后发出相应的音阶,同时在数码管显示也要同步。编译工具:用Protues,仿真,来调试程序,必要时调用Debug存在:反映比较慢的问题 七、用户操作说 各模块上电后以上左面接线为标准,从右到左第一排按键分别为低音:1,2,3,4,5; 从右到左第二排按键分别为低音6,7中音:1,2,3;从右到左第三排按键分别为中音:4,5,6,7,高音:1;从右到左第四排各按键分别为高音:2,3,4,5,6;从左到右第四排各按键分别为高音:7,“大”字显示,“中”字显示,“小”字显示,“大,中,小”轮流显示。 八、参考资料 单片机初级教程 张迎新 等编著 百度图片:http://image.baidu.com 九、附件 1、硬件设计的总电路原理图、PCB版图 数码管显示 单片机控制 点阵显示 功放 按键 2、元器件清单(器件名称、型号、在原理图中的编号) STC8951RC 单片机 1个 单片机插槽 1个 4X共阳数码管 1个 8X8红色点阵GYXM-1538ASR 1个 74LS245 1个 74LS04 1个 按键 50个 14脚插槽 1个 20脚插槽 1个 470欧姆点阵 8个 TDA2030A 1个 100UF电解电容 2个 0.1UF电容 2个 22 UF电解电容 1个 22K电阻 2个 N4001 2个 喇叭 1个 3、硬件电路板外观图片、PROTEUS仿真效果图 源程序代码 row equ 30h dot equ 31h org 00h ljmp key org 30h key: mov r0,#01h mov r2,#0feh mov r1,#00h mov r5,#60 start0: mov r7,#255 mov a,r2 mov p2,a jnb p0.0,start1 inc r0 jnb p0.1,start1 inc r0 jnb p0.2,start1 inc r0 jnb p0.3,start1 inc r0 jnb p0.4,start1 inc r0 rl a mov r2,a inc r1 cjne r1,#5,start0 sjmp key start1: jnb p0.0,$;在p0口时候对端口的判断 jnb p0.1,$ jnb p0.2,$ jnb p0.3,$ jnb p0.4,$ cjne r0,#16h,lp5 ljmp start5 lp5: cjne r0,#17h,lp6 ljmp start6 lp6: cjne r0,#18h,lp7 ljmp start7 lp7: cjne r0,#19h,lp4 ljmp start8 lp4: mov dptr,#tab mov a,r0 movc a,@a+dptr mov r3,a setb p0.5 acall del20 mov r3,a clr p0.5 mov r3,#5fh acall del20 djnz r7,start1 setb p0.5 mov a,r0;判断是否是低位 anl a,#0f8h cjne a,#0,lp1 ljmp start2 lp1: cjne r0,#0fh,lp3 ljmp start4 lp3: mov a,r0;判断是否是中位 anl a,#0f0h cjne a,#0,lp2 ljmp start3 lp2: mov a,r0;判断是否是高位 anl a,#0a0h cjne a,#0,start0 ljmp start4 start2: mov dptr,#table;低音的数码管显示 mov p1,#0bfh clr p2.6 clr p2.7 acall del20 mov p2,#0ffh mov a,r0 movc a,@a+dptr mov p1,a clr p2.5 acall del20 mov p2,#0ffh djnz r5,start2 ljmp key start3: mov dptr,#table mov p1,#0bfh clr p2.5 clr p2.7 acall del20 mov p2,#0ffh mov a,r0 subb a,#7 movc a,@a+dptr mov p1,a clr p2.6 acall del20 mov p2,#0ffh djnz r5,start3 ljmp key start4: mov dptr,#table mov p1,#0bfh clr p2.5 clr p2.6 acall del20 mov p2,#0ffh mov a,r0 subb a,#14 movc a,@a+dptr mov p1,a clr p2.7 acall del20 mov p2,#0ffh djnz r5,start4 ljmp key start5: setb p0.5 ;中音的数码管显示;高音的数码管显示14 mov r6,#050h m2: mov dptr,#mm mov row,#01h mov dot,#00h mov r7,#08h m1: mov r3,#050h mov a,row mov p1,a rl a mov row,a mov a,dot movc a,@a+dptr mov p3,a lcall del20 inc dot djnz r7,m1 djnz r6,m2 ljmp key start6: setb p0.5 mov r6,#050h q1: mov dptr,#qq mov row,#01h mov dot,#00h mov r7,#08h q2: mov r3,#050h mov a,row mov p1,a rl a mov row,a mov a,dot movc a,@a+dptr mov p3,a lcall del20 inc dot djnz r7,q2 djnz r6,q1 ljmp key start7: setb p0.5 mov r6,#050h ww1: mov dptr,#ww mov row,#01h mov dot,#00h mov r7,#08h ww2: mov r3,#050h mov a,row mov p1,a rl a mov row,a mov a,dot movc a,@a+dptr mov p3,a lcall del20 inc dot djnz r7,ww2 djnz r6,ww1 ljmp key start8: setb p0.5 mov dptr,#ff mov r5,#3 hh: mov r6,#050h ff1: mov row,#01h mov dot,#00h mov r7,#08h ff2: mov r3,#050h mov a,row mov p1,a rl a mov row,a mov a,dot movc a,@a+dptr mov p3,a lcall del20 inc dot djnz r7,ff2 djnz r6,ff1 mov a,dpl add a,#8 mov dpl,a mov a,dph addc a,#0 mov dph,a djnz r5,hh ljmp key tab: db 5fh,55h,4ch,48h,40h,39h,33h,30h,2bh,26h,24h,20h,1ch,19h,18h,15h,13h,12h,10h,0eh,0dh db 0ffh,0ffh,0ffh,0ffh table: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h mm: db 0f7h,0f7h,80h,0f7h,0ebh,0ddh,0beh,0ffh qq: db 0ffh,0efh,0efh,1h,6dh,1h,0efh,0efh ww: db 0efh,0efh,0c7h,0abh,06dh,0efh,0e7h,0efh ff: db 0f7h,0f7h,80h,0f7h,0ebh,0ddh,0beh,0ffh db 0ffh,0efh,0efh,1h,6dh,1h,0efh,0efh db 0efh,0efh,0c7h,0abh,06dh,0efh,0e7h,0efh del20: mov r4,#05h del4:nop djnz r4,del4 djnz r3,del20 ret end 17 简单的电子琴设计 前言 本实验是利用微机原理试验箱、8255芯片、8254芯片、键盘、扬声器等硬件设备,设计简易电子琴。 首先利用了编程程序,编辑了8255芯片控制字, 对其进行初始化,使其工作在方式0,即基本输入输出状态,将8255的A端口设置为输出,C端口进行,经CPU运算后, 输出到8254芯片的A端口中,由此实现对其的初始化。 将8254芯片设置为工作在方式3,即输出对称方波状态。A端口为输入,“OUT”指令可将输出对应一定频率的方波送到扬声器中,由此实现发声。本实验通过频率大小控制发出声音的高低,通过对延时程序的调用控制发出声音的长短。并通过所编程序实现对键盘的重复扫描,重而可以弹奏多个音符的试验目的。 关键字: 编程、工作方式、运算 简单的电子琴设计 一、设计题目: 简易电子琴设计 二、设计内容: 实验电路如图16-1,8253的CLK0接1MHZ时钟,GATE0接8255的PA1,OUT0和8255的PA0接到与门的两个输入端,K8跳线连接喇叭,编程使计算机的数字键1、2、3、4、5、6、7作为电子琴按键,按下即发出相应的音阶。 三、设计目的: 1、通过8253产生不同的频率信号,使PC机成为简易电子琴。 2、了解利用8255和8253产生音乐的基本方法。 3、通过课程设计使学生更进一步掌握微机原理及应用课程的有关知识,提高应用微机解决问题的能力,加深对微机应用的理解。通过查阅资料,结合所学知识进行软、硬件的设计,使学生初步掌握应用微机解决问题的步骤及方法。为以后学生结合专业从事微机应用设计奠定基础。 四、设计要求: 1.可以弹出7个音阶。2.弹奏简短音乐。 3.通过改变键盘输入来改变8254输出频率,实现扬声器发音 五、编程提示: 1、利用8255的PA0口来施加控制信号给与门,用来控制扬声器的开关状态。再利用设置不同的计数值,使8253产生不同频率的波形,使扬声器产生不同频率的音调,达到类似与音阶的高低音变换。对于音乐,每个音阶都有确定的频率。各音阶标称频率值: 音 阶2 3 4 5 6 7 1* 低频率(单位:Hz)262 294 330 347 392 440 494 524 高频率(单位:Hz)524 588 660 698 784 880 988 1048 简单的电子琴设计 六、设计原程序及注解 ;*******************************;;* 电子琴实验 *;;*******************************; data segment io8255a equ 288h io8255b equ 28bh io8253a equ 280h io8253b equ 283h table dw 524,588,660,698,784,880,988,1048;高音的;table dw 262,294,330,347,392,440,494,524;低音的 msg db 'Press 1,2,3,4,5,6,7,8,ESC:',0dh,0ah,'$' data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov dx,offset msg mov ah,9 int 21h;显示提示信息 sing: mov ah,7 int 21h;从键盘接收字符,不回显 cmp al,1bh je finish;若为ESC键,则转finish cmp al,'1' jl sing cmp al,'8' jg sing;若不在'1'-'8'之间转sing sub al,31h shl al,1;转为查表偏移量 mov bl,al;保存偏移到bx mov bh,0 mov ax,4240H;计数初值 = 1000000 / 频率, mov dx,0FH div word ptr[table+bx] mov bx,ax 保存到AX 3 简单的电子琴设计 mov dx,io8253b;设置8253计时器0方式3, 先读写低字节, 再读写高字节 mov al,00110110B out dx,al mov dx,io8253a mov ax,bx out dx,al;写计数初值低字节 mov al,ah out dx,al; mov dx,io8255b;mov al,10000000B out dx,al mov dx,io8255a mov al,03h out dx,al;call delay;mov al,0h out dx,al; jmp sing finish: mov ax,4c00h int 21h delay proc near;push cx push ax mov ax,15 x1: mov cx,0ffffh x2: dec cx jnz x2 dec ax jnz x1 pop ax pop cx ret delay endp code ends end start 写计数初值高字节 设置8255 A口输出 置PA1PA0 = 11(开扬声器)延时 置PA1PA0 = 00(关扬声器)延时子程序 4 简单的电子琴设计 七、程序流程图: 八、硬件连线图 简单的电子琴设计 九、实验结果 连接完线路后启动电路开关,然后运行程序,就会出现提示界面,然后键盘输入数字即可有相应音阶音乐从喇叭处播放。 十、实验中遇到了的问题及解决方法 在实验中遇到了很多问题其主要是代码的编译类错误,在通过网上查阅相关资料以及在老师同学帮助下这些困难都迎刃而解了。才使程序完美运行。6 简单的电子琴设计 总 结 这是一次成功的实训,也是应值得远记住的一次实训,在这次实训中我充分感受到了集体的力量,在我组组员的共同努力下,我们的电子琴程序从无到有、功能从弱到强,一步步的走向成功,同时也感谢陈老师给我这样一次锻炼的机会,让我的人生经历有丰富了一些并且这段经历将成为我生活中一段宝贵的精神财富。 参考文献: 1、《8088/8086汇编语言程序设计》中央广播电视大学出版社 2、《微机原理与接口技术》北京航空航天大学出版社 3、《微型计算机原理与汇编语言》电子工业出版社 4、《微机原理与应用》大连理工大学出版社 5、《现代微机原理与接口技术》电子工业出版社第二篇:EDA_电子琴课程设计 2
第三篇:EDA课程设计 电子琴
第四篇:电子琴 课程设计报告
第五篇:微机原理课程设计-电子琴设计