JIU JIANG UNIVERSITY
数字逻辑系统
课程设计报告
设计课题: 简易电子琴
专 业: 电子信息工程
班级学号: 20
学生姓名:
指导教师:
设计时间:
简易电子琴
1.设计任务与要求
1.1通过对一个简易的八音符电子琴的设计,进一步加深对计算机原理以及
数字电路应用技术方面的了解与认识,进一步熟悉数字电路系统设计、制作与调
试的方法和步骤
1.2设计简易的八音符电子琴,它可通过按键输入来控制音响。
1.3演奏时可以选择是手动演奏(由键盘输入)还是自动演奏已存入的乐曲。
1.4能够自动演奏多首乐曲,且每首乐曲可重复演奏
2.方案设计及主要技术思路
2.1方案一、本设计可有两种方案实现,他们的程序一样,但是所利用逻辑
元件不同,其一是将产生的32M 频率模块,自动|手动控制模块,音节产生模块,
分频模块依次连接。
2.2方案二、利用顶层设计将各个程序整合,再生成相应的图形文件,利用
这个图形元件再接上外围即可实现功能。
2.3优劣分析及方案选定
方案一层次分明,逻辑元件连接清晰,易于理解。反观方案二,虽然结构简
单,但是不易理解。
2.4 采用的硬件平台及主要技术
2.4.1 EDA 技术是以计算机为工具,根据硬件描述语言HDL
( Hardware Description language)完成的设计文件,自动地完成逻辑编译、
化简、分割、综合及优化、布局布线、仿真以及对于特定目标芯片的适配编译和
编程下载等工作。
2.4.2 VHDL 主要用于描述数字系统的结构,行为,功能和接口。除
了含有许多具有硬件特征的语句外,VHDL 的语言形式和描述风格与句法是十分
类似于一般的计算机高级语言。VHDL 的程序结构特点是将一项工程设计,或称
设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部
分, 及端口) 和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可
以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL 系统设计
的基本点。
3.模块设计过程及仿真
3.1 A模块的设计
本设计主要分为四个模块,分别为32M 频率产生模块,手动|自动模块,音
节产生模块,分频模块
3.1.1A 模块要实现的具体功能,引脚。
32M频率产生模块的功能是要将100M 频率变为32M ,手动|自动模块是实
现自动控制或手动控制,音调发生模块的作用是产生音阶的分频预置值,数控分
频模块是对时基脉冲进行分频,得到与1、2、3、4、5、6、7七个音符相对应的
频率。
3.1.2 A模块的设计思路和设计方法及关键设计语句说明。
音乐有两个重要因素,一个是音节,一个是音调。简单来说就是低音还是高
音,每个音持续多久,即为频率。本设计主要就是依据这个思路来实现的,设计
方法采用的是自顶而下的设计方法。关键设计语句在后面的具体程序有详细描
述。
3.1.3A 模块的设计过程中遇到的问题及解决方法
本设计遇到的主要问题是如何产生32M 的频率,由于程序要求的是32M ,
然而开发板上并没有32M 的信号。开发板上有48M 和100M 的,在分析计算后,
发现用100M 产生32M 结果更精确。
3.1.4A 模块实现的具体功能、仿真分析、模块符号图。
(3)数控分频模块
(2)音调发生模块的仿真
1. 自动手动模块符号图
3.1.5 A模块代码见附录,代码必须有注释。
自动手动控制
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity automusic is
Port ( clk,Auto : in std_logic; --系统时钟;键盘输入/自动演奏
index2 : in std_logic_vector(7 downto 0); --键盘输入信号
index0 : out std_logic_vector(7 downto 0)); --音符信号输出
end automusic;
architecture Behavioral of automusic is
signal count0:integer range 0 to 31;--change
signal clk2:std_logic;
begin
pulse0:process(clk,Aut0) --此进程完成对系统时钟8M 的分频,得到4Hz 的信
号clk2
variable count:integer range 0 to 8000000;
begin
if Auto='1' then count:=0;clk2
elsif clk'event and clk='1' then count:=count+1;
if count=4000000(4) then clk2
elsif count=8000000 (8)then clk2
end if;
end if;
end process;
music:process(clk2) --此进程完成自动演奏部分曲的地址累加
begin
if clk2'event and clk2='1' then
if count0=31 then count0
else count0
end if;
end if;
end process;
com1:process(count0,Auto,index2)
begin
if Auto='0' then
case count0 is --此case 语句:存储自动演奏部分的曲
when 0 => index0
when 1 => index0
when 2 => index0
when 3 => index0
when 4 => index0
when 5 => index0
when 6 => index0
when 7 => index0
when 8 => index0
when 9 => index0
when 10 =>index0
when 11=> index0
when 12=> index0
when 13=> index0
when 14=> index0
when 15=> index0
when 16=> index0
when 17=> index0
when 18=> index0
when 19=> index0
when 20=> index0
when 21=> index0
when 22=> index0
when 23=> index0
when 24=> index0
when 25=> index0
when 26=> index0
when 27=> index0
when 28=> index0
when 29=> index0
when 30=> index0
when 31=> index0
when others => null;
end case;
else index0
end if;
end process;
end Behavioral;
音调产生模块
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 Behavioral of tone is
begin
search :process(index) --此进程完成音符到音符的分频系数译码,音符的
显示,高低音阶
begin
case index is
when "00000001" => tone0
when "00000010"=> tone0
when "00000100" => tone0
when "00001000" => tone0
when "00010000" => tone0
when "00100000" => tone0
when "01000000" => tone0
when "10000000" => tone0
when others => tone0
end case;
end process;
end Behavioral;
分频模块
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity speaker is
Port ( clk1 : in std_logic; --系统时钟
tone1 : in integer range 0 to 30624; --音符分频系数
spks : out std_logic); --驱动扬声器的音频信号
end speaker;
architecture Behavioral of speaker is
signal preclk,fullspks:std_logic;
begin
pulse1:process(clk1) --此进程对系统时钟进行4分频
variable count:integer range 0 to 8;
begin
if clk1'event and clk1='1' then count:=count+1;
if count=2 then preclk
elsif count=4 then preclk
end if;
end if;
end process pulse1;
genspks:process(preclk,tone1) --此进程按照tone1输入的分频系数对8MHz
的脉冲再次分频,得到所需要的音符频率
variable count11:integer range 0 to 30624;
begin
if preclk'event and preclk='1' then
if count11
else count11:=0;fullspks
end if;
end if;
end process;
delaysps:process(fullspks) --此进程对fullspks 进行2分频
variable count2 :std_logic:='0';
begin
if fullspks'event and fullspks='1' then count2:=not count2;
if count2='1' then spks
else spks
end if;
end if;
end process;
end Behavioral;
顶层VHDL 程序
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity top is Port ( clk32MHz :in std_logic; --32MHz 系统时钟 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 top;
architecture Behavioral of top is
component automusic
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 speaker
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);
begin u0:automusic port
map(clk=>clk32MHZ,index2=>index1,index0=>indx,Auto=>handtoAuto); u1:
tone port map(index=>indx,tone0=>tone2,code=>code1,high=>high1);
u2: speaker port map(clk1=>clk32MHZ,tone1=>tone2,spks=>spkout);
end Behavioral;
3.2 B模块的设计
乐曲自动演奏模块的作用是产生8位发生控制输入信号。当进行自动演奏
时,由存储在此模块的8位二进制数作为发声控制输入,从而自动演奏乐曲。 该
模块的VHDL 源程序主要由3个工作进程组成,分别为PULSE0,MUSIC 和COM1。
PULSE0的作用是根据键盘输入(自动演奏)的值(0或1)来判断计数器COUNT
以及脉冲CLK2的输出值
4.整体设计及分析
4.1.整体设计说明及连接方法(含主要信号及节点说明)
整体设计图连接时,要注意到每个模块都是环环相扣的,前一个的输出是后一个的输入,而后一个的输出又是再后一个的输入,连接时一定要注意顺序。
4.2 整体设计过程及遇到问题的解决方法。
本设计时遇到的问题在按键控制与自动手动模块连接间,由于程序设计要求按键高电平有效,如果两者之间直接相连,则所有的按键都加了高电平至输入端,造成开发板无法识别,使得蜂鸣器发声杂乱,因此需在两者间加一个非门,则解决了问题。
4.3设计整体逻辑图
4.4 整体设计的仿真及分析
4.4引脚配置
5. 下载与调试
5.1下载的步骤
成功编译硬件系统以后, 将产生的FPGA 配置文件输出,要实现硬件功能,还需将文件下载到目标FPGA 器件上,具体步骤如下
通过Z-Blaster 下载电缆线连接实验箱JTAG 口和主计算机,接通试验箱电源,下载线驱动程序的安装。
5.2测试的设置及测试方法
在Quartus 2软件中选中Tools 》programmer ,也可用工具栏中的按钮,打开编程器窗口并自动打开配置文件,确保编程器窗口左上角的hardware setup 栏中硬件已经安装,选择JTAG 模式。选中program 、congifure 再单击start 若灯亮,则表示配置成功。
5.3测试的结果
当第一路按键开关拨到 1 时二极管循环点亮,说明第一步成功了,当第一路按键开关拨到 0 时,蜂鸣器无声音。
5.4 测试中遇到的问题及解决方法
经过一星期的努力,简易电子琴基本完成了,在此次设计中出现了以下问题, 在设计中分频模块出现了问题,在查资料得知,程序中的为32Mhz, 但在试验箱中只有48M 和100M 的,频率不相符合,因此最后通过查资料的方法选择了100M 的
6. 结论与心得
经过努力, 简易电子琴的设计基本上完成了。在整个设计过程中,包括前期中期和后期,我都有着许多不同的体会:
6.1这个设计的基本是接触一门新的语言并加以应用,对于我来说,没有想到的是入手的速度比我的预料快,在以前编程的基础上,从接触到开始动手编程的时间得到了很大的缩短。VHDL 的编程与C 语言的编程有着本质的不同,然而以往形成的旧编程习惯在VHDL 编程中依然起着很大的作用。一通百通,不是没有道理的。对于学习新的知识并予以应用的信心,显得更足了。
6.2 VHDL的设计关键是电路逻辑设计,而一个程序的关键是总体设计。对于硬件设计接触不多的我们清楚这一点也许不无好处。通过这个程序设计让我学
会一种新的语言,对数字系统结构也有了更进一步的了解和认识,对我以后的学习有很大的帮助。。
6.3通过本次实习无疑为我们的明年做毕业设计论文打下了一定的基础,他能给我们一种做课程设计的思路。
7. 参考文献
[1].EDA 技术与VHDL (第三版), 潘松 .清华大学出版社
[2] . 《VHDL 入门与应用》陈雪松, 滕立中 .人民邮电出版社
[3]. 《VHDL 语言100例详解——北京理工大学ASIC 研究所》. 北京理工大学ASIC 研究所. 清华大学出版社
电子工程学院数字逻辑系统课程设计成绩评定表 专业:电子工程学院 班级: 电子A1021 学号: 20 姓名: 陈长源
2012年12月27 日