首页

[数字逻辑系统设计]设计报告格式

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 日