孟磊 简易电子琴的设计 第6页 共21页
图3.2 简易电子琴的工作流程图
3.3简易电子琴中各模块的设计
为了更清楚的了解电子琴的工作过程,我们利用EDA工具(本课程设计Max+plus)对各个模块实施时序仿真(Timing Simulation),由自顶向下的设计方式,最后将三个模块进行整合,做出简易电子琴整个系统的时序仿真图。
3.3.1 乐曲自动演奏模块
乐曲自动演奏模块的作用是产生8位发声控制输入信号。当进行自动演奏时,由存储在此模块中的8位二进制作为发声控制输入,从而自动演奏乐曲。这段模块的原理图如图3.3所示:
CLK AUTO INDEX0[7.0] INDEX2[7.0] 3.3 乐曲自动演奏模块原理图
乐曲自动演奏模块可以由VHDL语言来实现,下面是一段主要代码:
BEGIN
IF AUTO='0'THEN CASE COUNT IS
WHEN 0=>INDEX0<=\ WHEN 1=>INDEX0<=\ WHEN 2=>INDEX0<=\ WHEN 3=>INDEX0<=\ . . .
WHEN 29=>INDEX0<=\ WHEN 30=>INDEX0<=\ WHEN 31=>INDEX0<=\
6
孟磊 简易电子琴的设计 第7页 共21页
END CASE;
ELSE INDEX0<=INDEX2; END IF; END PROCESS;
3.3.2 音调发生模块
音调发生模块的作用是产生音阶的分频预置值。当8位发声控制输入信号中的某一位为高电平时,则对应某一音阶的数值将输出,该数值即为该音阶的分频预置值,分频预置值控制数控分频模块进行分频,由此可得到每个音阶对应的频率。 图3.5是音调发生模块的原理图:
TONE[10.0] INDEX[7.0] HIGH CODE[6.0]
图 3.5 音调发生模块原理图
音调发生模块可以由VHDL语言来实现,下面是一段主要代码:
BEGIN CASE INDEX IS
WHEN\WHEN\WHEN\WHEN\WHEN\WHEN\WHEN\WHEN\WHEN OTHERS=>TONE<=2047;CODE<=\ END CASE;
7
孟磊 简易电子琴的设计 第8页 共21页
END PROCESS;
3.3.3 数控分频模块
在对计算机组成原理的学习中,我们知道数控分频器的功能是在输入端输入不同数据时,对输入时钟产生不同的分频比,输出不同频率的时钟,以改变输出信号的频率。本设计中数控分频模块是利用并行预置数的减法计数器对时基脉冲进行分频,得到与1、2、3、4、5、6、7七个音符相对应的频率。 数控分频模块原理图如图3.7所示:
CLK1 SPKS TONE1[10.0]
图3.7 数控分频模块原理图 其主要VHDL代码如下所示:
BEGIN PROCESS(CLK1)
VARIABLE COUNT:INTEGER RANGE 0 TO 8; BEGIN
IF(CLK'EVENT AND CLK1='1')THEN COUTNT:=COUNT +1; IF COUNT=2 THEN PRECLK<='1'; ELSE COUNT=4 THEN PRECLK<='0';COUTN:=0; END IF; END IF; END PROCESS;
PROCESS(PRECLK,TONE1)
VARIABLE COUNT11:INTEGER RANGE 0 TO 2047; BEGIN
8
孟磊 简易电子琴的设计 第9页 共21页
IF(PRECLK'EVENT AND PRECLK='1')THEN IF COUNT11 COUNT11:=COUNT11 +1;FULLSPKS<='1'; ELSE COUNT11:=0;FULLSPKS<='0'; END IF; END IF; END PROCESS; 3.3.4 顶层设计 把以上设计的各个模块进行整合,最后我们得到了系统的整个工作原理图,如图3.10: 3.10 简易电子琴的工作原理图 9 孟磊 简易电子琴的设计 第10页 共21页 完成整个系统顶层设计的主要VHDL代码如下: ARCHITECTURE ART OF DIANZIQIN IS COMPONENT AUTO PORT(CLK: IN STD_LOGIC; AUTO: IN STD_LOGIC; INDEX2:IN STD_LOGIC_VECTOR(7 DOWNTO 0); INDEX0:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END COMPONENT; COMPONENT 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 PORT(CLK1: IN STD_LOGIC; TONE1: IN INTEGER RANGE 0 TO 2047; SPKS: OUT STD_LOGIC); END COMPONET; 4 系统仿真 乐曲自动演奏模块由VHDL语言实现后,其仿真图如图3.4所示。 10