verilog - hdl - 简易乐曲设计

更新时间:2024-04-28 01:56:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

成 绩 指导教师:

日 期:

EDA技术课程设计

题 目: EDA技术及其应用 —— 简易电子琴设计 姓 名: 院 系: 电子信息工程学系 专 业: 通信工程 班 级: 091班级 学 号: 指导教师:

2012年 1 月

谢海海 简易电子琴设计

EDA技术课程设计报告

——简易电子琴的设计

(电子信息工程学系 指导教师:)

摘 要 在现代的电子设计中,EDA技术已经成为一种普遍的工具,它在电子信息、通信、自动控制用计算机等领域的

重要性日益突出。本课程设计主要采用EDA技术设计一个简易的八音符电子琴,它采用EDA作为开发工具,Verilog HDL语言为硬件描述语言,MAX + PLUS II作为程序运行平台,所开发的程序通过调试运行、波形仿真验证,初步实现了设计目标。本程序使用的硬件描述语言Verilog HDL,既能进行面向综合的电路设计,又可用于电路的模拟仿真,能够在多层次上对所设计的系统加以描述,易学易用,语言功能强。

关键词 课程设计;EDA;Verilog HDL;电子琴

1.课程设计的目的

系统实现是用硬件描述语言verilog按模块化方式进行设计,然后进行编程、时序仿真、电路功能验证,奏出美妙的乐曲。巩固和运用所学课程,理论联系实际,提高分析、解决计算机技术实际问题的独立工作能力,通过对一个简易的八音符电子琴的设计,进一步加深对计算机原理以及数字电路应用技术方面的了解与认识,进一步熟悉数字电路系统设计、制作与调试的方法和步骤。巩固所学课堂知识,理论联系实际,提高分析、解决计算机技术实际问题的独立工作能力。

2.课程设计的要求

(1)设计一个简易的八音符电子琴,它可通过按键输入来控制音响。 (2)演奏时可以选择是手动演奏(由键盘输入)还是自动演奏已存入的乐曲。 (3)能够自动演奏多首乐曲,且每首乐曲可重复演奏。

3. EDA技术

EDA是电子设计自动化(Electronic Design Automation)缩写,是90年代初从CAD(计算机辅助设计)、CAM(计算机辅助制造)、CAT(计算机辅助测试)和CAE(计算机辅助工程)的概念发展而来的。EDA技术是以计算机为工具,根据硬件描述语言HDL( Hardware Description language)完成的设计文件,自动地完成逻辑编译、化简、分割、综合及优化、布局布线、仿真以及对于特定目标芯片的适配编译和编程下载等工作。典型的EDA工具中必须包含两个特殊的软件包,即综合器和适配器。综合器的功能就是将设计者在EDA平台上完成的针对某个系统项目的HDL、原理图或状态图形描述,针对给定的硬件系统组件,进行编译、优化、转换和综合,最终获得我们欲实现功能的描述文件。综合器在工作前,必须给定所要实现的硬件结构参数,它的功能就是将软件描述与给定的硬件结构用一定的方式联系起来。也就是说,综合器是软件描述与硬件实现的一座桥梁。综合过程就是将电路的高

2

谢海海 简易电子琴设计

级语言描述转换低级的、可与目标器件FPGA/CPLD相映射的网表文件。

适配器的功能是将由综合器产生的王表文件配置与指定的目标器件中,产生最终的下载文件,如JED文件。适配所选定的目标器件(FPGA/CPLD芯片)必须属于在综合器中已指定的目标器件系列。

4.硬件描述语言—Verilog HDL

硬件描述语言HDL是EDA技术中的重要组成部分,常用的硬件描述语言有VerilogHDL 、VHDL、System Verilog、System C、ABEL HDL和AHDL等,而Verilog HDL和VHDL是当前最流行的并成为IEEE标准的硬件描述语言。Verilog HDL是目前应用最为广泛的硬件描述语言, 并被IEEE 采纳为IEEE1064-1995 、IEEE1064-2001、IEEE1064-2003标准。Verilog HDL可以用来进行各种层次的逻辑设计,也可以进行数字系统的逻辑综合、仿真验证和时序分析。Verilog HDL适合算法级( Algorithm) 、寄存器传输级(RTL) 、逻辑级(Logic)、门级(Gate)和开关级(Transistor)等各个层次的电路设计和描述。

Verilog HDL和VHDL都是用于电路设计的硬件描述语言,并且都已成为IEEE标准。Verilog HDL早在1983年就已经推出,至今已有20多年的应用历史,因而Verilog HDL拥有广泛的设计群体,其设计资源比VHDL丰富。

4.1、HDL的特点

1、HDL具有强大的功能,覆盖面广,描述能力强。HDL支持门级电路的描述,也支持寄存器传输级电路的描述,还支持以行为算法描述为对象的电路的描述。

2、HDL有良好的可读性。它可以被计算机接受,也容易被读者理解。用HDL书写的源文件,既是程序又是文档,既是工程技术人员之间交换信息的文件,又可作为合同签约者之间的文件。

3、HDL具有良好的可移植性。作为一种已被IEEE承认的工业标准,HDL事实上已成为通用的硬件描述语言,可以在各种不同的设计环境和系统平台中使用。

4、使用HDL可以延长设计的生命周期。用HDL描述的硬件电路与工艺无关,不会因工艺而过时。与工艺有关的参数可以通过HDL提供的属性加以描述,工艺改变时,只需要修改相应程序中属性参数即可。

HDL支持对大规模设计的分解和已有设计的再利用。HDL可以描述复杂的电路系统,支持对大规模设计的分解,由多人、多项目组来共同承担和完成。标准化的规则和风格,为设计的再利用提供了有力的支持。

5、HDL有利于保护知识产权。用HDL设计的专用集成电路(ASIC),在设计文件下载到集成电路时可以采用一定保密措施,使其不易被破译和窃取。

5 Verilog HDL 设计流程图

3

谢海海 简易电子琴设计

图1 Verilog HDL 设计流程图

6. Verilog HDL语言应用

6.1设计要求定义

在从事设计进行编写Verilog HDL代码之前,必须先对你的设计目的和要求有一个明确的认识。确定要实现的功能、对所需的信号建立时间、时钟/输出时间、最大系统工作频率、关键的路径等这些要求,要有一个明确的定义,然后对比设计,再选择适当的设计方式和相应的器件结构,进行设计的综合。

6.2用Verilog HDL语言进行设计描述

1、应决定设计方式,设计方式一般说来有三种:自顶向下设计,自底向上设 阶层的生成,而后一种方式将描述的电路当作单模块电路来进行的。自顶向下的处理方式要求将你的设计划分成不同的功能元件,每个元件具有专门定义的输入和输出,并执行专门的逻辑功能。首先生成一个由各功能元件相互连接形成的顶层模块来做成一个网表,然后再设计其中的各个元件。而自底向上的处理方法正好相反。平坦式设计则是指所有功能元件均在同一层和同一图中详细进行的。

2、编写设计代码。编写Verilog HDL语言的代码与编写其它计算机程序语言的代码有很大的不同,你必须清醒地认识到你正在设计硬件,编写的Verilog HDL代码必须能够综合到采用可编程逻辑器件来实现的数字逻辑之中。懂得EDA工具中仿真软件和综合软件的大致工作过程,将有助于编写出优秀的代码。

6.3用Verilog HDL仿真器对Verilog HDL原代码进行功能仿真

4

谢海海 简易电子琴设计

对于大型设计,采用Verilog HDL仿真软件对其进行仿真可以节省时间,可以在设计的早期阶段检测到设计中的错误,从而进行修正,以便尽可能地减少对设计日程计划的影响。因为对于大型设计,其综合优化、配置往往要花费好几个小时,在综合之前对原代码仿真,就可以大大减少设计重复和修正错误的次数和时间。但对于小型设计,则往往不需要先对VHDL原代码进行仿真。

6.4对Verilog VHDL原代码进行综合优化处理

选择目标器件、输入约束条件后,Verilog HDL综合优化软件工具将对Verilog HDL原代码进行处理,产生一个优化了的网络表,并可以进行粗略的时序仿真。综合优化软件工具大致的处理过程如下:首先检测语法和语意错误;然后进行综合处理,对CPLD器件而言,将得到一组工艺专用逻辑方程,对FPGA器件而言,将得到一个工艺专用网表;最后进行优化处理,对CPLD的优化通常包括将逻辑化简为乘积项的最小和式,降低任何给定的达式所需的逻辑块输入数,这些方程进一步通过器件专用优化来实现资源配置。对FPGA的优化通常也需要用乘积项的和式来表达逻辑,方程系统可基于器件专用资源和驱动优化目标指引来实现因式分解,分解的因子可用来对实现的有效性进行评估,其准则可用来决定是对方程序系统进行不同的因式分解还是保持现有的因子。准则通常是指分享共同因子的能力,即可以被暂存,以便于和任何新生成的因子相比较。

7.设计方案

根据系统设计要求,系统设计采用自顶向下的设计方法,系统的整体组装设计原理图如图1

所示,它由乐曲自动演奏模块、音调发生模块和数控分频模块三部分组成。

图2 系统的整体组装设计原理图

8.分组模块的原理

(1)乐曲自动演奏模块

乐曲自动演奏模块(AUTO.V)的作用是产生8位发声控制输入信号/当进行自动演奏时,由存储在此模块中的8位二进制数作为发声控制输入,从而自动演奏乐曲。

5

谢海海 简易电子琴设计

乐曲演奏的原理是这样的:组成乐曲的每个音符的频率值(音调)及其持续的时间(音长)是乐曲能连续演奏所需的两个基本数据,因此只要控制输出到扬声器的激励信号频率的高低和持续的时间,就可以使扬声器发出连续的乐曲声。

图3 乐曲自动演奏模块仿真图

当 auto为“0”时,由存储在此模块中的8位二进制数作为发声控制输入,可自动演奏乐曲。 (3) 数控分频模块

数控分频模块是对时基脉冲进行分频,得到与1、2、3、4、5、6、7七个音符相对应的频率。

图4 数控分频模块的仿真图

数控分频模块对时基脉冲进行分频,得到与1、2、3、4、5、6、7七个音符对应频率。该图输入系统时钟信号CLK1初值为0(各输出值都是在时钟信号的下降沿有效),音符分频系数TONE1为00100000即1290Hz,驱动扬声器的音频信号SPKS输出为1。 (4) 顶层设计

顶层模块由乐曲自动演奏(auto),音调发生器(tone)和数控分频器(fenpin)三个模块组成。设置一个自动演奏/键盘输入切换auto,即当auto=“0”时,选择自动演奏音乐存储器里面的乐曲,auto=“1”时,选择键盘输入的信号。输入系统时钟信号CLK32MHZ初值为0,自动演奏信号HANDTOAUTO初值为0,键盘输入信号INDEX1为00000000;输出音符信号CODE1则为0110000,高低音节信号HIGH1变为1,即高音,音频信号SPKOUT即输出0,输出为1时CODE1变为0110100,这时出现10ns的延时。在仿真时由于系统各方面原因影响,出现延时属于正常现象。

也许是能力不够,再加上临近期末时间较为紧迫,顶层设计没能做出来,程序在编译过程中出错,可是知识范围太窄,没能找出错误所在,导致顶层的模块没能完成,因此也没有仿真的图形出来。

9.结束语

6

谢海海 简易电子琴设计

到现在为止,简易电子琴的设计基本上告一段落,虽然由于自身问题没能很好地完成设计的要求,但是在设计的过程中,我受益匪浅,自身的知识能力得到了锻炼的同时还对专业的认识有了进一步的加强。

通过几天的课程设计,我对数据库软件EDA技术、Verilog HDL、等系列知识都有了一定的了解。使用EDA技术开发页面的能力也有了很大提高。这个程序设计让我学会一种新的语言,对数字系统结构也有了更进一步的了解和认识,对我以后的学习有很大的帮助。

通过这次的设计,我也认识到自己的缺点和不足,如对专业理论知识了解不够透彻,不能很好地将之运用于实践中,虽然在暑期的电子设计大赛中有过动手能力的增强训练,但是对于我们电子专业的学生,实践能力是占非常大的比重的,因此在接下来的日子里,提高自己的实践能力是重点,而且必须加深对专业知识的理解。

参考文献:

[1]曹昕燕、周凤臣、聂春燕:《EDA技术实验与课程设计》 清华大学出版社 [2]王金明 《数字系统设计与Verilog HDL》 电子工业出版社

附录:

附录1:乐曲自动演奏源程序清单

module AUTO (CLK, AUTO, CLK2, INDEX2, INDEX0); input CLK; input AUTO; output CLK2; reg CLK2;

input[7:0] INDEX2; output[7:0] INDEX0; reg[7:0] INDEX0; reg[4:0] COUNT0; always @(CLK or AUTO) begin : PULSE0 reg[3:0] COUNT; if (AUTO == 1'b1) begin

COUNT = 0; CLK2 <= 1'b0 ; end

else if (CLK == 1'b1) begin

COUNT = COUNT + 1; if (COUNT == 4) begin

7

CLK2 <= 1'b1 ; end

else if (COUNT == 8) begin

CLK2 <= 1'b0 ; COUNT = 0; end end end

always @(CLK2) begin : MUSIC if (CLK2 == 1'b1) begin

if (COUNT0 == 31) begin

COUNT0 <= 0 ; end else begin

COUNT0 <= COUNT0 + 1 ; end end

谢海海 简易电子琴设计

end

always @(COUNT0 or AUTO or INDEX2) begin : COM1

if (AUTO == 1'b0) begin

case (COUNT0) 0 :

begin

INDEX0 <= 8'b00000100 ; end 10 :

begin

INDEX0 <= 8'b10000000 ; end 11 :

begin

INDEX0 <= 8'b00000100 ; end end 1 :

begin

INDEX0 <= 8'b00000100 ; end 2 :

begin

INDEX0 <= 8'b00000100 ; end 3 :

begin

INDEX0 <= 8'b00000100 ; end 4 :

begin

INDEX0 <= 8'b00010000 ; end 5 :

begin

INDEX0 <= 8'b00010000 ; end 6 :

begin

INDEX0 <= 8'b00010000 ; end 7 :

begin

INDEX0 <= 8'b00100000 ; end 8 :

begin

INDEX0 <= 8'b10000000 ; end 9 :

begin

INDEX0 <= 8'b10000000 ;

12 :

begin

INDEX0 <= 8'b00000010 ; end 13 :

begin

INDEX0 <= 8'b00000010 ; end 14 :

begin

INDEX0 <= 8'b00000001 ; end 15 :

begin

INDEX0 <= 8'b00000001 ; end 16 :

begin

INDEX0 <= 8'b00010000 ; end 17 :

begin

INDEX0 <= 8'b00010000 ; end 18 :

begin

INDEX0 <= 8'b00001000 ; end 19 :

begin

INDEX0 <= 8'b00001000 ; end 20 :

begin

INDEX0 <= 8'b00001000 ; end

8

谢海海 简易电子琴设计

21 :

begin

INDEX0 <= 8'b00000100 ; end 22 :

begin

INDEX0 <= 8'b00000010 ; end 23 :

begin

INDEX0 <= 8'b00000010 ; end 24 :

begin

INDEX0 <= 8'b00010000 ; end 25 :

begin

INDEX0 <= 8'b00010000 ; end 26 :

begin

INDEX0 <= 8'b00001000 ; end 27 :

begin

INDEX0 <= 8'b00001000 ; end

附录2:音调发生源程序清单

module TONE_A (INDEX, CODE, HIGH, TONE0);

input[7:0] INDEX; output[6:0] CODE; reg[6:0] CODE; output HIGH; reg HIGH;

output[10:0] TONE0; reg[10:0] TONE0;

always @(INDEX) begin : SEARCH case (INDEX) 8'b00000001 : begin

28 :

begin

INDEX0 <= 8'b00000100 ; end 29 :

begin

INDEX0 <= 8'b00000100 ; end 30 :

begin

INDEX0 <= 8'b00000010 ; end 31 :

begin

INDEX0 <= 8'b00000010 ; end default : begin end endcase end else begin

INDEX0 <= INDEX2 ; end end endmodule

TONE0 <= 773 ; CODE <= 7'b1001111 ; HIGH <= 1'b1 ; end 8'b00000010 : begin

TONE0 <= 912 ; CODE <= 7'b0010010 ; HIGH <= 1'b1 ; end 8'b00000100 : begin

TONE0 <= 1036 ; CODE <= 7'b0000110 ; HIGH <= 1'b1 ; 9

谢海海 简易电子琴设计

end 8'b00001000 : begin

TONE0 <= 1116 ; CODE <= 7'b1001100 ; HIGH <= 1'b1 ; end 8'b00010000 : begin

TONE0 <= 1197 ; CODE <= 7'b0100100 ; HIGH <= 1'b1 ; end 8'b00100000 : begin

TONE0 <= 1290 ; CODE <= 7'b0100000 ; HIGH <= 1'b0 ; end 8'b01000000 :

附录3:数控分频源程序清单

module FENPIN (CLK1, TONE1, SPKS);

input CLK1; input[10:0] TONE1; output SPKS; reg SPKS;

reg PRECLK; reg FULLSPKS;

always @(CLK1) begin : xhdl_1 reg[3:0] COUNT; if (CLK1 == 1'b1) begin

COUNT = COUNT + 1; if (COUNT == 2) begin

PRECLK <= 1'b1 ; end

else if (COUNT == 4) begin

PRECLK <= 1'b0 ;

begin

TONE0 <= 1372 ; CODE <= 7'b0001111 ; HIGH <= 1'b0 ; end 8'b10000000 : begin

TONE0 <= 1410 ; CODE <= 7'b0000000 ; HIGH <= 1'b0 ; end default : begin

TONE0 <= 2047 ; CODE <= 7'b0000001 ; HIGH <= 1'b0 ; end endcase end endmodule

COUNT = 0; end end end

always @(PRECLK or TONE1) begin : xhdl_3

reg[10:0] COUNT11; if (PRECLK == 1'b1) begin

if (COUNT11 < TONE1) begin

COUNT11 = COUNT11 + 1; FULLSPKS <= 1'b1 ; end else begin

COUNT11 = 0; FULLSPKS <= 1'b0 ; end end end

2

always @(FULLSPKS) begin : xhdl_5 reg COUNT2; COUNT2 = 1'b0; if (FULLSPKS == 1'b1) begin

COUNT2 = ~COUNT2; if (COUNT2 == 1'b1) begin

SPKS <= 1'b1 ; end else begin

SPKS <= 1'b0 ; end end end endmodule

2

3

本文来源:https://www.bwwdw.com/article/an9g.html

Top